1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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 }