View Javadoc

1   package org.apache.commons.jexl.parser;
2   
3   import java.lang.reflect.InvocationTargetException;
4   
5   import org.apache.commons.jexl.JexlContext;
6   import org.apache.commons.jexl.util.Introspector;
7   import org.apache.commons.jexl.util.introspection.VelMethod;
8   import org.apache.commons.jexl.util.introspection.Info;
9   
10  public class ASTMethod extends SimpleNode
11  {
12      /*** dummy velocity info */
13      private static Info DUMMY = new Info("", 1, 1);
14  
15      public ASTMethod(int id)
16      {
17          super(id);
18      }
19  
20      public ASTMethod(Parser p, int id)
21      {
22          super(p, id);
23      }
24  
25  
26      /*** Accept the visitor. **/
27      public Object jjtAccept(ParserVisitor visitor, Object data)
28      {
29          return visitor.visit(this, data);
30      }
31  
32      /***
33       *  returns the value of itself applied to the object.
34       *   We assume that an identifier can be gotten via a get(String)
35       */
36      public Object execute(Object obj, JexlContext jc)
37          throws Exception
38      {
39          String methodName = ((ASTIdentifier)jjtGetChild(0)).val;
40  
41          int paramCount = jjtGetNumChildren()-1;
42  
43          /*
44           *  get our params
45           */
46  
47          Object params[] = new Object[paramCount];
48  
49          try
50          {
51              for (int i=0; i<paramCount; i++)
52              {
53                  params[i] = ( (SimpleNode) jjtGetChild(i+1)).value(jc);
54              }
55  
56              VelMethod vm = Introspector.getUberspect().getMethod(obj, methodName, params, DUMMY);
57  
58              if (vm == null)
59                  return null;
60  
61              return vm.invoke(obj, params);
62          }
63          catch(InvocationTargetException e)
64          {
65              Throwable t = e.getTargetException();
66  
67              if (t instanceof Exception)
68              {
69                  throw (Exception) t;
70              }
71  
72              throw e;
73          }
74      }
75  }