View Javadoc

    1   /*
    2    * Copyright 2002,2004 The Apache Software Foundation.
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  package org.apache.commons.jelly.tags.core;
    17
    18  import java.lang.reflect.InvocationTargetException;
    19  import java.util.ArrayList;
    20  import java.util.List;
    21
    22  import org.apache.commons.beanutils.ConstructorUtils;
    23  import org.apache.commons.jelly.JellyTagException;
    24  import org.apache.commons.jelly.MissingAttributeException;
    25  import org.apache.commons.jelly.XMLOutput;
    26
    27  /*** A tag which creates a new object of the given type
    28    *
    29    * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
    30    * @version $Revision: 155420 $
    31    */
    32  public class NewTag extends BaseClassLoaderTag implements ArgTagParent {
    33
    34      /*** the variable exported */
    35      private String var;
    36
    37      /*** the class name of the object to instantiate */
    38      private String className;
    39
    40      private List paramTypes = new ArrayList();
    41      private List paramValues = new ArrayList();
    42
    43      public NewTag() {
    44      }
    45
    46      /*** Sets the name of the variable exported by this tag */
    47      public void setVar(String var) {
    48          this.var = var;
    49      }
    50
    51      /*** Sets the class name of the object to instantiate */
    52      public void setClassName(String className) {
    53          this.className = className;
    54      }
    55
    56      public void addArgument(Class type, Object value) {
    57          paramTypes.add(type);
    58          paramValues.add(value);
    59      }
    60
    61      // Tag interface
    62      //-------------------------------------------------------------------------
    63      public void doTag(XMLOutput output) throws MissingAttributeException, JellyTagException {
    64          ArgTag parentArg = null;
    65          if ( var == null ) {
    66              parentArg = (ArgTag)(findAncestorWithClass(ArgTag.class));
    67              if(null == parentArg) {
    68                  throw new MissingAttributeException( "var" );
    69              }
    70          }
    71          if ( className == null ) {
    72              throw new MissingAttributeException( "className" );
    73          }
    74          invokeBody(output);
    75
    76          try {
    77              Class theClass = getClassLoader().loadClass( className );
    78              Object object = null;
    79              if(paramTypes.size() == 0) {
    80                  object = theClass.newInstance();
    81              } else {
    82                  Object[] values = paramValues.toArray();
    83                  Class[] types = (Class[])(paramTypes.toArray(new Class[paramTypes.size()]));
    84                  object = ConstructorUtils.invokeConstructor(theClass,values,types);
    85                  paramTypes.clear();
    86                  paramValues.clear();
    87              }
    88              if(null != var) {
    89                  context.setVariable(var, object);
    90              } else {
    91                  parentArg.setValue(object);
    92              }
    93          }
    94          catch (ClassNotFoundException e) {
    95              throw new JellyTagException(e);
    96          }
    97          catch (InstantiationException e) {
    98              throw new JellyTagException(e);
    99          }
    100         catch (NoSuchMethodException e) {
    101             throw new JellyTagException(e);
    102         }
    103         catch (IllegalAccessException e) {
    104             throw new JellyTagException(e);
    105         }
    106         catch (InvocationTargetException e) {
    107             throw new JellyTagException(e);
    108         }
    109     }
    110 }