Author: henrib Date: Tue Mar 22 16:24:15 2016 New Revision: 1736210 URL: http://svn.apache.org/viewvc?rev=1736210&view=rev Log: JEXL-192: Fix antish variable * method evaluation logic
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.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=1736210&r1=1736209&r2=1736210&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 Tue Mar 22 16:24:15 2016 @@ -1126,8 +1126,12 @@ public class Interpreter extends ParserV main: for (int c = 0; c < numChildren; c++) { objectNode = node.jjtGetChild(c); - if (objectNode instanceof ASTMethodNode && object == null) { - break; + if (objectNode instanceof ASTMethodNode) { + if (object == null) { + break; + } else { + antish = false; + } } // attempt to evaluate the property within the object (visit(ASTIdentifierAccess node)) object = objectNode.jjtAccept(this, object); 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=1736210&r1=1736209&r2=1736210&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 Tue Mar 22 16:24:15 2016 @@ -64,7 +64,7 @@ public class IssuesTest extends JexlTest // JEXL-48: bad assignment detection public static class Another { public String name = "whatever"; - private Boolean foo = Boolean.TRUE; + private final Boolean foo = Boolean.TRUE; public Boolean foo() { return foo; @@ -76,7 +76,7 @@ public class IssuesTest extends JexlTest } public static class Foo { - private Another inner; + private final Another inner; Foo() { inner = new Another(); @@ -118,15 +118,15 @@ public class IssuesTest extends JexlTest JexlExpression expr = jexl.createExpression("true//false\n"); Object value = expr.evaluate(ctxt); - Assert.assertTrue("should be true", ((Boolean) value).booleanValue()); + Assert.assertTrue("should be true", (Boolean) value); expr = jexl.createExpression("/*true*/false"); value = expr.evaluate(ctxt); - Assert.assertFalse("should be false", ((Boolean) value).booleanValue()); + Assert.assertFalse("should be false", (Boolean) value); expr = jexl.createExpression("/*\"true\"*/false"); value = expr.evaluate(ctxt); - Assert.assertFalse("should be false", ((Boolean) value).booleanValue()); + Assert.assertFalse("should be false", (Boolean) value); } // JEXL-42: NullPointerException evaluating an expression @@ -170,7 +170,7 @@ public class IssuesTest extends JexlTest JexlExpression expr = jexl.createExpression("derived.foo()"); Object value = expr.evaluate(ctxt); - Assert.assertTrue("should be true", ((Boolean) value).booleanValue()); + Assert.assertTrue("should be true", (Boolean) value); } // JEXL-52: can be implemented by deriving Interpreter.{g,s}etAttribute; later @@ -891,12 +891,12 @@ public class IssuesTest extends JexlTest @Test public void test144a() throws Exception { - JexlEngine JEXL = new Engine(); + JexlEngine jexl = new Engine(); JexlContext jc = new MapContext(); jc.set("quuxClass", Quux144.class); - JexlExpression create = JEXL.createExpression("quux = new(quuxClass)"); - JexlExpression assignArray = JEXL.createExpression("quux.arr = [ 'hello', 'world' ]"); - JexlExpression checkArray = JEXL.createExpression("quux.arr"); + JexlExpression create = jexl.createExpression("quux = new(quuxClass)"); + JexlExpression assignArray = jexl.createExpression("quux.arr = [ 'hello', 'world' ]"); + JexlExpression checkArray = jexl.createExpression("quux.arr"); // test with a string Quux144 quux = (Quux144) create.evaluate(jc); @@ -909,14 +909,14 @@ public class IssuesTest extends JexlTest Assert.assertEquals("The array elements are equal", Arrays.asList("hello", "world"), Arrays.asList((String[]) o)); // test with a null array - assignArray = JEXL.createExpression("quux.arr = null"); + assignArray = jexl.createExpression("quux.arr = null"); o = assignArray.evaluate(jc); Assert.assertNull("Result is not null", o); o = checkArray.evaluate(jc); Assert.assertNull("Result is not null", o); // test with an empty array - assignArray = JEXL.createExpression("quux.arr = [ ]"); + assignArray = jexl.createExpression("quux.arr = [ ]"); o = assignArray.evaluate(jc); Assert.assertNotNull("Result is null", o); o = checkArray.evaluate(jc); @@ -926,7 +926,7 @@ public class IssuesTest extends JexlTest // test with an empty array on the overloaded setter for different types. // so, the assignment should fail with logging 'The ambiguous property, arr2, should have failed.' try { - assignArray = JEXL.createExpression("quux.arr2 = [ ]"); + assignArray = jexl.createExpression("quux.arr2 = [ ]"); o = assignArray.evaluate(jc); Assert.fail("The arr2 property shouldn't be set due to its ambiguity (overloaded setters with different types)."); } catch (JexlException.Property e) { @@ -943,10 +943,10 @@ public class IssuesTest extends JexlTest "var x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x['one']"// result to null? }; - JexlEngine JEXL = new Engine(); + JexlEngine jexl = new Engine(); JexlContext jc = new MapContext(); for (String s : scripts) { - Object o = JEXL.createScript(s).execute(jc); + Object o = jexl.createScript(s).execute(jc); Assert.assertEquals(1, o); } } @@ -959,10 +959,10 @@ public class IssuesTest extends JexlTest "x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x['one']", "var x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x['one']" }; - JexlEngine JEXL = new Engine(); + JexlEngine jexl = new Engine(); for (String s : scripts) { JexlContext jc = new MapContext(); - Object o = JEXL.createScript(s).execute(jc); + Object o = jexl.createScript(s).execute(jc); Assert.assertEquals(1, o); } } @@ -974,8 +974,8 @@ public class IssuesTest extends JexlTest + " var y = \"A comment\";\n" + "}"; try { - JexlEngine JEXL = new Engine(); - JexlScript s = JEXL.createScript(str); + JexlEngine jexl = new Engine(); + JexlScript s = jexl.createScript(str); } catch (JexlException.Parsing xparse) { throw xparse; } @@ -987,8 +987,8 @@ public class IssuesTest extends JexlTest + " var x = \"A comment\";\n" + "}"; try { - JexlEngine JEXL = new Engine(); - JexlScript s = JEXL.createScript(str); + JexlEngine jexl = new Engine(); + JexlScript s = jexl.createScript(str); } catch (JexlException.Parsing xparse) { throw xparse; } @@ -1000,8 +1000,8 @@ public class IssuesTest extends JexlTest public void test5115c() throws Exception { URL testUrl = new File(TESTA).toURI().toURL(); try { - JexlEngine JEXL = new Engine(); - JexlScript s = JEXL.createScript(testUrl); + JexlEngine jexl = new Engine(); + JexlScript s = jexl.createScript(testUrl); } catch (JexlException.Parsing xparse) { throw xparse; } @@ -1121,6 +1121,47 @@ public class IssuesTest extends JexlTest Assert.assertTrue(o instanceof Set); Assert.assertTrue(((Set) o).contains(1)); } + + public static class C192 { + public C192() {} + + public static Integer callme(Integer n) { + if (n == null) { + return null; + } else { + return n >= 0? 42 : -42; + } + } + + public static Object kickme() { + return C192.class; + } + } + + @Test + public void test192() throws Exception { + JexlContext jc = new MapContext(); + jc.set("x.y.z", C192.class); + JexlEngine jexl = new JexlBuilder().create(); + JexlExpression js0 = jexl.createExpression("x.y.z.callme(t)"); + jc.set("t", null); + Assert.assertNull(js0.evaluate(jc)); + jc.set("t", 10); + Assert.assertEquals(42, js0.evaluate(jc)); + jc.set("t", -10); + Assert.assertEquals(-42, js0.evaluate(jc)); + jc.set("t", null); + Assert.assertNull(js0.evaluate(jc)); + js0 = jexl.createExpression("x.y.z.kickme().callme(t)"); + jc.set("t", null); + Assert.assertNull(js0.evaluate(jc)); + jc.set("t", 10); + Assert.assertEquals(42, js0.evaluate(jc)); + jc.set("t", -10); + Assert.assertEquals(-42, js0.evaluate(jc)); + jc.set("t", null); + Assert.assertNull(js0.evaluate(jc)); + } // // // @Test