You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2012/08/11 11:04:15 UTC

svn commit: r1371893 - in /commons/proper/jexl/trunk/src: main/java/org/apache/commons/jexl3/internal/Interpreter.java main/java/org/apache/commons/jexl3/internal/introspection/MethodExecutor.java test/java/org/apache/commons/jexl3/IssuesTest.java

Author: henrib
Date: Sat Aug 11 09:04:15 2012
New Revision: 1371893

URL: http://svn.apache.org/viewvc?rev=1371893&view=rev
Log:
Fix issue wrt isEmpty (bad cast to Object[] replaced by System.getLength()) and method varargs (assignable types vs equal types)
(see http://apache-commons.680414.n4.nabble.com/jexl-empty-function-crashes-if-called-with-int-tt4637895.html)

Modified:
    commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
    commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodExecutor.java
    commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java

Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java?rev=1371893&r1=1371892&r2=1371893&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java Sat Aug 11 09:04:15 2012
@@ -525,12 +525,12 @@ public class Interpreter extends ParserV
                 try {
                     Object[] argv = {right};
                     JexlMethod vm = uberspect.getMethod(left, "startsWith", argv);
-                    if (vm != null) {
-                        return arithmetic.toBoolean(vm.invoke(left, argv)) ? Boolean.TRUE : Boolean.FALSE;
+                    if (vm != null && vm.getReturnType() == Boolean.TYPE) {
+                        return (Boolean) vm.invoke(left, argv);
                     } else if (arithmetic.narrowArguments(argv)) {
                         vm = uberspect.getMethod(left, "startsWith", argv);
-                        if (vm != null) {
-                            return arithmetic.toBoolean(vm.invoke(left, argv)) ? Boolean.TRUE : Boolean.FALSE;
+                        if (vm != null && vm.getReturnType() == Boolean.TYPE) {
+                            return (Boolean) vm.invoke(left, argv);
                         }
                     }
                 } catch (InvocationTargetException e) {
@@ -580,12 +580,12 @@ public class Interpreter extends ParserV
                 try {
                     Object[] argv = {right};
                     JexlMethod vm = uberspect.getMethod(left, "endsWith", argv);
-                    if (vm != null) {
-                        return arithmetic.toBoolean(vm.invoke(left, argv)) ? Boolean.TRUE : Boolean.FALSE;
+                    if (vm != null && vm.getReturnType() == Boolean.TYPE) {
+                        return (Boolean) vm.invoke(left, argv);
                     } else if (arithmetic.narrowArguments(argv)) {
                         vm = uberspect.getMethod(left, "endsWith", argv);
-                        if (vm != null) {
-                            return arithmetic.toBoolean(vm.invoke(left, argv)) ? Boolean.TRUE : Boolean.FALSE;
+                        if (vm != null && vm.getReturnType() == Boolean.TYPE) {
+                            return (Boolean) vm.invoke(left, argv);
                         }
                     }
                 } catch (InvocationTargetException e) {
@@ -646,12 +646,12 @@ public class Interpreter extends ParserV
             try {
                 Object[] argv = {left};
                 JexlMethod vm = uberspect.getMethod(right, "contains", argv);
-                if (vm != null) {
-                    return arithmetic.toBoolean(vm.invoke(right, argv));
+                if (vm != null && vm.getReturnType() == Boolean.TYPE) {
+                    return (Boolean) vm.invoke(right, argv);
                 } else if (arithmetic.narrowArguments(argv)) {
                     vm = uberspect.getMethod(right, "contains", argv);
-                    if (vm != null) {
-                        return arithmetic.toBoolean(vm.invoke(right, argv));
+                    if (vm != null && vm.getReturnType() == Boolean.TYPE) {
+                        return (Boolean) vm.invoke(right, argv);
                     }
                 }
             } catch (InvocationTargetException e) {
@@ -972,7 +972,7 @@ public class Interpreter extends ParserV
             return "".equals(object) ? Boolean.TRUE : Boolean.FALSE;
         }
         if (object.getClass().isArray()) {
-            return ((Object[]) object).length == 0 ? Boolean.TRUE : Boolean.FALSE;
+            return Array.getLength(object) == 0? Boolean.TRUE : Boolean.FALSE;
         }
         if (object instanceof Collection<?>) {
             return ((Collection<?>) object).isEmpty() ? Boolean.TRUE : Boolean.FALSE;
@@ -983,12 +983,11 @@ public class Interpreter extends ParserV
         } else {
             // check if there is an isEmpty method on the object that returns a
             // boolean and if so, just use it
-            Object[] params = new Object[0];
             JexlMethod vm = uberspect.getMethod(object, "isEmpty", EMPTY_PARAMS);
             if (vm != null && vm.getReturnType() == Boolean.TYPE) {
                 Boolean result;
                 try {
-                    result = (Boolean) vm.invoke(object, params);
+                    result = (Boolean) vm.invoke(object, EMPTY_PARAMS);
                 } catch (Exception e) {
                     throw new JexlException(node, "empty() : error executing", e);
                 }
@@ -1020,12 +1019,11 @@ public class Interpreter extends ParserV
         } 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];
             JexlMethod vm = uberspect.getMethod(object, "size", EMPTY_PARAMS);
             if (vm != null && vm.getReturnType() == Integer.TYPE) {
                 Integer result;
                 try {
-                    result = (Integer) vm.invoke(object, params);
+                    result = (Integer) vm.invoke(object, EMPTY_PARAMS);
                 } catch (Exception e) {
                     throw new JexlException(node, "size() : error executing", e);
                 }

Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodExecutor.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodExecutor.java?rev=1371893&r1=1371892&r2=1371893&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodExecutor.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodExecutor.java Sat Aug 11 09:04:15 2012
@@ -26,8 +26,8 @@ import java.lang.reflect.InvocationTarge
 public final class MethodExecutor extends AbstractExecutor.Method {
     /** Whether this method handles varargs. */
     private final boolean isVarArgs;
-    
-    
+
+
     /**
      * Discovers a {@link MethodExecutor}.
      * <p>
@@ -124,7 +124,7 @@ public final class MethodExecutor extend
             // make the last arg an array of the expected type
             if (actual[index] != null) {
                 Class<?> aclazz = actual[index].getClass();
-                if (!aclazz.isArray() || !aclazz.getComponentType().equals(type)) {
+                if (!aclazz.isArray() || !type.isAssignableFrom(aclazz.getComponentType())) {
                     // create a 1-length array to hold and replace the last argument
                     Object lastActual = Array.newInstance(type, 1);
                     Array.set(lastActual, 0, actual[index]);

Modified: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java?rev=1371893&r1=1371892&r2=1371893&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java (original)
+++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java Sat Aug 11 09:04:15 2012
@@ -894,13 +894,14 @@ public class IssuesTest extends JexlTest
     }
 
     public static class Context137 extends MapContext implements JexlContext.NamespaceResolver {
-        public static void log(Object fmt, Object... arr) {
-
-            System.out.println(String.format(fmt.toString(), arr));
+        public static int log(Object fmt, Object... arr) {
+            //System.out.println(String.format(fmt.toString(), arr));
+            return arr == null ? 0 : arr.length;
         }
 
-        public static void log(Object fmt, int... arr) {
-            System.out.println(String.format(fmt.toString(), arr));
+        public static int log(Object fmt, int... arr) {
+            //System.out.println(String.format(fmt.toString(), arr));
+            return arr == null ? 0 : arr.length;
         }
 
         @Override
@@ -911,23 +912,34 @@ public class IssuesTest extends JexlTest
 
     @Test
     public void test137() throws Exception {
-        String[] SCRIPTS = {
-            "var x = null; log('x = %s', x);",
-            "var x = 'abc'; log('x = %s', x);",
-            "var x = 333; log('x = %s', x);",
-            "var x = [1, 2]; log('x = %s', x);",
-            "var x = ['a', 'b']; log('x = %s', x);",
-            "var x = {1:'A', 2:'B'}; log('x = %s', x);"
+        Object[] SCRIPTS = {
+            "var x = null; log('x = %s', x);", 0,
+            "var x = 'abc'; log('x = %s', x);", 1,
+            "var x = 333; log('x = %s', x);", 1,
+            "var x = [1, 2]; log('x = %s', x);", 2,
+            "var x = ['a', 'b']; log('x = %s', x);", 2,
+            "var x = {1:'A', 2:'B'}; log('x = %s', x);", 1,
+            "var x = null; return empty(x);", true,
+            "var x = ''; return empty(x);", true,
+            "var x = 'abc'; return empty(x);", false,
+            "var x = 0; return empty(x);", true,
+            "var x = 333; return empty(x);", false,
+            "var x = []; return empty(x);", true,
+            "var x = [1, 2]; return empty(x);", false,
+            "var x = ['a', 'b']; return empty(x);", false,
+            "var x = {:}; return empty(x);", true,
+            "var x = {1:'A', 2:'B'}; return empty(x);", false
         };
         JexlEngine jexl = new JexlBuilder().create();
         JexlContext jc = new Context137();
         JexlScript script;
 
-        for (String stext : SCRIPTS) {
-            System.out.println(stext);
+        for (int e = 0; e < SCRIPTS.length; e += 2) {
+            String stext = (String) SCRIPTS[e];
+            Object expected = SCRIPTS[e + 1];
             script = jexl.createScript(stext);
-            script.execute(jc);
+            Object result = script.execute(jc);
+            assertEquals("failed on " + stext, expected, result);
         }
-
     }
 }