You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2009/08/01 19:56:56 UTC

svn commit: r799903 - in /commons/proper/jexl/branches/2.0/src: java/org/apache/commons/jexl/Interpreter.java test/org/apache/commons/jexl/IssuesTest.java

Author: sebb
Date: Sat Aug  1 17:56:55 2009
New Revision: 799903

URL: http://svn.apache.org/viewvc?rev=799903&view=rev
Log:
JEXL-62
Avoid NPE in Interpreter when () omitted from method with no parameters (e.g. var.hashCode)
Includes test case.

Thanks for patch by Henri Biestro <hbiestro at gmail dot com>.

Modified:
    commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/Interpreter.java
    commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/IssuesTest.java

Modified: commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/Interpreter.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/Interpreter.java?rev=799903&r1=799902&r2=799903&view=diff
==============================================================================
--- commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/Interpreter.java (original)
+++ commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/Interpreter.java Sat Aug  1 17:56:55 2009
@@ -279,6 +279,7 @@
         JexlNode propertyNode = null;
         Object property = null;
         boolean isVariable = true;
+        int v = 0;
         StringBuilder variableName = null;
         // 1: follow children till penultimate
         int last = left.jjtGetNumChildren() - 1;
@@ -293,9 +294,11 @@
             // if we get null back as a result, check for an ant variable
             if (isVariable) {
                 String name = ((ASTIdentifier) objectNode).image;
-                if (c == 0) {
+                if (v == 0) {
                     variableName = new StringBuilder(name);
-                } else {
+                    v = 1;
+                }
+                for(; v <= c; ++v) {
                     variableName.append('.');
                     variableName.append(name);
                 }
@@ -958,6 +961,7 @@
         StringBuilder variableName = null;
         Map<String, ?> vars = context.getVars();
         boolean isVariable = true;
+        int v = 0;
         for (int i = 0; i < numChildren; i++) {
             JexlNode theNode = node.jjtGetChild(i);
             isVariable &= (theNode instanceof ASTIdentifier);
@@ -965,9 +969,11 @@
             // if we get null back a result, check for an ant variable
             if (result == null && isVariable) {
                 String name = ((ASTIdentifier) theNode).image;
-                if (i == 0) {
+                if (v == 0) {
                     variableName = new StringBuilder(name);
-                } else {
+                    v = 1;
+                }
+                for(; v <= i; ++v) {
                     variableName.append('.');
                     variableName.append(name);
                 }

Modified: commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/IssuesTest.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/IssuesTest.java?rev=799903&r1=799902&r2=799903&view=diff
==============================================================================
--- commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/IssuesTest.java (original)
+++ commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/IssuesTest.java Sat Aug  1 17:56:55 2009
@@ -183,4 +183,35 @@
         }
     }
 
+    // JEXL-62
+    public void test62() throws Exception {
+        JexlContext ctxt;
+        JexlEngine jexl = new JexlEngine();
+        jexl.setSilent(true); // to avoid throwing JexlException on null method call
+        
+        Script jscript;
+
+        ctxt = JexlHelper.createContext();
+        jscript = jexl.createScript("dummy.hashCode()");
+        assertEquals(jscript.getText(), null, jscript.execute(ctxt)); // OK
+
+        ctxt.getVars().put("dummy", "abcd");
+        assertEquals(jscript.getText(), Integer.valueOf("abcd".hashCode()), jscript.execute(ctxt)); // OK
+        
+        jscript = jexl.createScript("dummy.hashCode");
+        assertEquals(jscript.getText(), null, jscript.execute(ctxt)); // OK
+
+        Expression jexpr;
+
+        ctxt = JexlHelper.createContext();
+        jexpr = jexl.createExpression("dummy.hashCode()");
+        assertEquals(jexpr.getExpression(), null, jexpr.evaluate(ctxt)); // OK
+
+        ctxt.getVars().put("dummy", "abcd");
+        assertEquals(jexpr.getExpression(), Integer.valueOf("abcd".hashCode()), jexpr.evaluate(ctxt)); // OK
+
+        jexpr = jexl.createExpression("dummy.hashCode");
+        assertEquals(jexpr.getExpression(), null, jexpr.evaluate(ctxt)); // OK
+    }
+
 }
\ No newline at end of file