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