dion 2004/08/15 09:01:12
Modified: jexl/xdocs changes.xml
jexl/src/java/org/apache/commons/jexl/parser
ASTSizeFunction.java
jexl/src/test/org/apache/commons/jexl JexlTest.java
Log:
Handle any size method that returns an int
Revision Changes Path
1.4 +1 -0 jakarta-commons/jexl/xdocs/changes.xml
Index: changes.xml
===================================================================
RCS file: /home/cvs/jakarta-commons/jexl/xdocs/changes.xml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- changes.xml 15 Aug 2004 15:46:45 -0000 1.3
+++ changes.xml 15 Aug 2004 16:01:12 -0000 1.4
@@ -25,6 +25,7 @@
</properties>
<body>
<release version="1.0-beta-3-SNAPSHOT" date="in CVS">
+ <action dev="dion" type="add">Handle any size() method that returns an
int</action>
<action dev="dion" type="fix" issue="30562">Can't issue .size() on
java.util.Set</action>
</release>
</body>
1.6 +20 -3
jakarta-commons/jexl/src/java/org/apache/commons/jexl/parser/ASTSizeFunction.java
Index: ASTSizeFunction.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/jexl/src/java/org/apache/commons/jexl/parser/ASTSizeFunction.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ASTSizeFunction.java 15 Aug 2004 15:32:52 -0000 1.5
+++ ASTSizeFunction.java 15 Aug 2004 16:01:12 -0000 1.6
@@ -16,6 +16,9 @@
package org.apache.commons.jexl.parser;
import org.apache.commons.jexl.JexlContext;
+import org.apache.commons.jexl.util.Introspector;
+import org.apache.commons.jexl.util.introspection.Info;
+import org.apache.commons.jexl.util.introspection.VelMethod;
import java.util.List;
import java.util.Map;
@@ -87,8 +90,22 @@
{
return ((Set)val).size();
}
-
- throw new Exception("size() : unknown type : " + val.getClass());
+ else {
+ // check if there is a size method on the object that returns an
integer
+ // and if so, just use it
+ Object[] params = new Object[0];
+ Info velInfo = new Info("",1,1);
+ VelMethod vm = Introspector.getUberspect().getMethod(val, "size",
params, velInfo);
+ if (vm != null && vm.getReturnType() == Integer.TYPE)
+ {
+ Integer result = (Integer)vm.invoke(val, params);
+ return result.intValue();
+ }
+ else
+ {
+ throw new Exception("size() : unknown type : " + val.getClass());
+ }
+ }
}
}
1.38 +10 -2
jakarta-commons/jexl/src/test/org/apache/commons/jexl/JexlTest.java
Index: JexlTest.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/jexl/src/test/org/apache/commons/jexl/JexlTest.java,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -r1.37 -r1.38
--- JexlTest.java 15 Aug 2004 15:32:52 -0000 1.37
+++ JexlTest.java 15 Aug 2004 16:01:12 -0000 1.38
@@ -16,6 +16,7 @@
package org.apache.commons.jexl;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -397,21 +398,28 @@
list.add("5");
jc.getVars().put("list", list);
-
+
+ // 30652 - support for set
Set set = new HashSet();
set.addAll(list);
set.add("1");
jc.getVars().put("set", set);
+
+ // support generic int size() method
+ BitSet bitset = new BitSet(5);
+ jc.getVars().put("bitset", bitset);
assertExpression(jc, "size(s)", new Integer(5));
assertExpression(jc, "size(array)", new Integer(5));
assertExpression(jc, "size(list)", new Integer(5));
assertExpression(jc, "size(map)", new Integer(5));
assertExpression(jc, "size(set)", new Integer(5));
+ assertExpression(jc, "size(bitset)", new Integer(64));
assertExpression(jc, "list.size()", new Integer(5));
assertExpression(jc, "map.size()", new Integer(5));
assertExpression(jc, "set.size()", new Integer(5));
+ assertExpression(jc, "bitset.size()", new Integer(64));
assertExpression(jc, "list.get(size(list) - 1)", "5");
assertExpression(jc, "list[size(list) - 1]", "5");
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]