1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.jexl.parser;
17
18 import org.apache.commons.jexl.JexlContext;
19 import org.apache.commons.jexl.util.Introspector;
20 import org.apache.commons.jexl.util.introspection.Info;
21 import org.apache.commons.jexl.util.introspection.VelMethod;
22
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Set;
26 import java.lang.reflect.Array;
27
28 /***
29 * generalized size() function for all classes we can think of
30 *
31 * @author <a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a>
32 * @author <a href="hw@kremvax.net">Mark H. Wilkinson</a>
33 * @version $Id: ASTSizeFunction.java,v 1.6 2004/08/15 16:01:12 dion Exp $
34 */
35 public class ASTSizeFunction extends SimpleNode
36 {
37 public ASTSizeFunction(int id)
38 {
39 super(id);
40 }
41
42 public ASTSizeFunction(Parser p, int id)
43 {
44 super(p, id);
45 }
46
47
48 /*** Accept the visitor. **/
49 public Object jjtAccept(ParserVisitor visitor, Object data)
50 {
51 return visitor.visit(this, data);
52 }
53
54
55 public Object value(JexlContext jc)
56 throws Exception
57 {
58 SimpleNode arg = (SimpleNode) jjtGetChild(0);
59
60 Object val = arg.value(jc);
61
62 if (val == null)
63 {
64 throw new Exception("size() : null arg");
65 }
66
67 return new Integer(ASTSizeFunction.sizeOf(val));
68 }
69
70 public static int sizeOf(Object val)
71 throws Exception
72 {
73 if (val instanceof List)
74 {
75 return ((List)val).size();
76 }
77 else if (val.getClass().isArray())
78 {
79 return Array.getLength(val);
80 }
81 else if (val instanceof Map)
82 {
83 return ((Map)val).size();
84 }
85 else if (val instanceof String)
86 {
87 return ((String)val).length();
88 }
89 else if (val instanceof Set)
90 {
91 return ((Set)val).size();
92 }
93 else {
94
95
96 Object[] params = new Object[0];
97 Info velInfo = new Info("",1,1);
98 VelMethod vm = Introspector.getUberspect().getMethod(val, "size", params, velInfo);
99 if (vm != null && vm.getReturnType() == Integer.TYPE)
100 {
101 Integer result = (Integer)vm.invoke(val, params);
102 return result.intValue();
103 }
104 else
105 {
106 throw new Exception("size() : unknown type : " + val.getClass());
107 }
108 }
109 }
110
111 }