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);
}
-
}
}