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 2018/08/02 16:44:04 UTC

[commons-jexl] branch master updated: JEXL-264: adding syntax in javacc jjt, escaping/unescaping identifier parsing methods, tests and book-keeping

This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git


The following commit(s) were added to refs/heads/master by this push:
     new 839efbd  JEXL-264: adding syntax in javacc jjt, escaping/unescaping identifier parsing methods, tests and book-keeping
839efbd is described below

commit 839efbd15e60be955f69c01599aa2c0bef85b128
Author: henrib <he...@apache.org>
AuthorDate: Thu Aug 2 18:43:16 2018 +0200

    JEXL-264: adding syntax in javacc jjt, escaping/unescaping identifier parsing methods, tests and book-keeping
---
 RELEASE-NOTES.txt                                     |  1 +
 .../org/apache/commons/jexl3/internal/Debugger.java   |  7 ++-----
 .../java/org/apache/commons/jexl3/parser/Parser.jjt   |  4 +++-
 .../org/apache/commons/jexl3/parser/StringParser.java |  2 +-
 src/site/xdoc/changes.xml                             |  3 +++
 .../java/org/apache/commons/jexl3/Issues200Test.java  | 19 +++++++++++++++++++
 6 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 59ffe09..08d54ed 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -39,6 +39,7 @@ What's new in 3.2:
 New Features in 3.2:
 ====================
 
+* JEXL-264:      Allow space, quote & double-quote in identifiers
 * JEXL-260:      Automatically inject JexlContext in constructor call when possible
 * JEXL-252:      Allow for interpolated strings to be used in property access operators
 * JEXL-250:      Safe navigation operator
diff --git a/src/main/java/org/apache/commons/jexl3/internal/Debugger.java b/src/main/java/org/apache/commons/jexl3/internal/Debugger.java
index 5656932..08fec42 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Debugger.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Debugger.java
@@ -98,6 +98,7 @@ import org.apache.commons.jexl3.parser.JexlNode;
 import org.apache.commons.jexl3.parser.ParserVisitor;
 
 import java.util.regex.Pattern;
+import org.apache.commons.jexl3.parser.StringParser;
 
 /**
  * Helps pinpoint the cause of problems in expressions that fail during evaluation.
@@ -601,11 +602,7 @@ public class Debugger extends ParserVisitor implements JexlInfo.Detail {
 
     @Override
     protected Object visit(ASTIdentifier node, Object data) {
-        String image = node.getName();
-        if (needQuotes(image)) {
-            // quote it
-            image = "'" + image.replace("'", "\\'") + "'";
-        }
+        String image = StringParser.escapeIdentifier(node.getName());
         return check(node, image, data);
     }
 
diff --git a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
index 8bf4378..a2a2d27 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
+++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
@@ -219,11 +219,13 @@ TOKEN_MGR_DECLS : {
 
 <DEFAULT, REGISTERS> TOKEN : /* IDENTIFIERS */
 {
-  < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
+  < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>|<ESCAPE>)* > { matchedToken.image = StringParser.unescapeIdentifier(matchedToken.image); }
 |
   < #LETTER: [ "a"-"z", "A"-"Z", "_", "$", "@" ] >
 |
   < #DIGIT: [ "0"-"9"] >
+|
+  < #ESCAPE: "\\" [" ", "'", "\"", "\\"] >
 }
 
 <REGISTERS> TOKEN : /* REGISTERS: parser.ALLOW_REGISTER must be set to true before calling parse */
diff --git a/src/main/java/org/apache/commons/jexl3/parser/StringParser.java b/src/main/java/org/apache/commons/jexl3/parser/StringParser.java
index 3a02b7a..f58288d 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/StringParser.java
+++ b/src/main/java/org/apache/commons/jexl3/parser/StringParser.java
@@ -233,7 +233,7 @@ public class StringParser {
     }
 
     /**
-     * Adds a escape char ('\') where needed in a string form of an identifier.
+     * Adds a escape char ('\') where needed in a string form of an ide
      * @param str the identifier un-escaped string
      * @return the string with added  backslash character before space, quote, double-quote and backslash
      */
diff --git a/src/site/xdoc/changes.xml b/src/site/xdoc/changes.xml
index dc77663..6ea1dfe 100644
--- a/src/site/xdoc/changes.xml
+++ b/src/site/xdoc/changes.xml
@@ -26,6 +26,9 @@
     </properties>
     <body>
         <release version="3.2" date="unreleased">
+            <action dev="henrib" type="add" issue="JEXL-264">
+                Allow space, quote and double-quote in identifiers
+            </action>
             <action dev="henrib" type="add" issue="JEXL-261">
                 JexlEngine.setClassLoader(...) should reload namespaces that are classes
             </action>
diff --git a/src/test/java/org/apache/commons/jexl3/Issues200Test.java b/src/test/java/org/apache/commons/jexl3/Issues200Test.java
index e8df901..f35e0ef 100644
--- a/src/test/java/org/apache/commons/jexl3/Issues200Test.java
+++ b/src/test/java/org/apache/commons/jexl3/Issues200Test.java
@@ -464,4 +464,23 @@ public class Issues200Test extends JexlTestCase {
         result = script.execute(ctx);
         Assert.assertEquals(10, result);
     }
+      
+    @Test
+    public void test230() throws Exception {
+        JexlEngine jexl = new JexlBuilder().cache(4).create();
+        JexlContext ctxt = new MapContext();
+        int[] foo = {42};
+        ctxt.set("fo o", foo);
+        Object value;
+        for (int l = 0; l < 2; ++l) {
+            value = jexl.createExpression("fo\\ o[0]").evaluate(ctxt);
+            Assert.assertEquals(42, value);
+            value = jexl.createExpression("fo\\ o[0] = 43").evaluate(ctxt);
+            Assert.assertEquals(43, value);
+            value = jexl.createExpression("fo\\ o.0").evaluate(ctxt);
+            Assert.assertEquals(43, value);
+            value = jexl.createExpression("fo\\ o.0 = 42").evaluate(ctxt);
+            Assert.assertEquals(42, value);
+        }
+    }
 }