1 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.MethodUtils; 23 import org.apache.commons.jelly.JellyTagException; 24 import org.apache.commons.jelly.MissingAttributeException; 25 import org.apache.commons.jelly.TagSupport; 26 import org.apache.commons.jelly.XMLOutput; 27 28 35 public class InvokeTag extends TagSupport implements ArgTagParent { 36 37 38 private String var; 39 40 41 private String exceptionVar; 42 43 44 private String methodName; 45 46 47 private Object onInstance; 48 49 private List paramTypes = new ArrayList (); 50 private List paramValues = new ArrayList (); 51 52 public InvokeTag() { 53 } 54 55 56 public void setVar(String var) { 57 this.var = var; 58 } 59 60 63 public void setExceptionVar(String var) { 64 this.exceptionVar = var; 65 } 66 67 public void setMethod(String method) { 68 this.methodName = method; 69 } 70 71 public void setOn(Object instance) { 72 this.onInstance = instance; 73 } 74 75 public void addArgument(Class type, Object value) { 76 paramTypes.add(type); 77 paramValues.add(value); 78 } 79 80 public void doTag(XMLOutput output) throws MissingAttributeException, JellyTagException { 83 if ( null == methodName) { 84 throw new MissingAttributeException( "method" ); 85 } 86 if ( null == onInstance ) { 87 throw new MissingAttributeException( "on" ); 88 } 89 90 invokeBody(output); 91 92 Object [] values = paramValues.toArray(); 93 Class [] types = (Class [])(paramTypes.toArray(new Class [paramTypes.size()])); 94 95 Object result = null; 96 try { 97 result = MethodUtils.invokeMethod(onInstance,methodName,values,types); 98 } 99 catch (NoSuchMethodException e) { 100 throw new JellyTagException(e); 101 } 102 catch (IllegalAccessException e) { 103 throw new JellyTagException(e); 104 } 105 catch (InvocationTargetException e) { 106 if(null != exceptionVar) { 107 context.setVariable(exceptionVar,e.getTargetException()); 108 } else { 109 throw new JellyTagException("method " + methodName + 110 " threw exception: "+ e.getTargetException().getMessage(), 111 e.getTargetException() ); 112 } 113 } 114 finally { 115 paramTypes.clear(); 116 paramValues.clear(); 117 } 118 119 ArgTag parentArg = (ArgTag)(findAncestorWithClass(ArgTag.class)); 120 if(null != parentArg) { 121 parentArg.setValue(result); 122 } 123 if(null != var) { 124 context.setVariable(var, result); 125 } 126 } 127 } 128 | Popular Tags |