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 }