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 <hen...@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); + } + } }