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 2011/02/10 10:22:13 UTC
svn commit: r1069299 - in /commons/proper/jexl/trunk/src:
main/java/org/apache/commons/jexl2/
main/java/org/apache/commons/jexl2/parser/ site/xdoc/
test/java/org/apache/commons/jexl2/
Author: henrib
Date: Thu Feb 10 09:22:12 2011
New Revision: 1069299
URL: http://svn.apache.org/viewvc?rev=1069299&view=rev
Log:
More generic fix related to JEXL-107 to allow (expr)[index] expressions
Added:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/ASTReferenceExpression.java (with props)
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/ExpressionImpl.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlEngine.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt
commons/proper/jexl/trunk/src/site/xdoc/changes.xml
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IssuesTest.java
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java?rev=1069299&r1=1069298&r2=1069299&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java Thu Feb 10 09:22:12 2011
@@ -571,6 +571,21 @@ final class Debugger implements ParserVi
}
/** {@inheritDoc} */
+ public Object visit(ASTReferenceExpression node, Object data) {
+ JexlNode first = node.jjtGetChild(0);
+ builder.append('(');
+ accept(first, data);
+ builder.append(')');
+ int num = node.jjtGetNumChildren();
+ for (int i = 1; i < num; ++i) {
+ builder.append("[");
+ accept(node.jjtGetChild(i), data);
+ builder.append("]");
+ }
+ return data;
+ }
+
+ /** {@inheritDoc} */
public Object visit(ASTSizeFunction node, Object data) {
builder.append("size(");
accept(node.jjtGetChild(0), data);
@@ -639,11 +654,4 @@ final class Debugger implements ParserVi
public Object visit(ASTAmbiguous node, Object data) {
throw new UnsupportedOperationException("unexpected type of node");
}
-
- public Object visit(ASTReferenceExpression node, Object data) {
- builder.append("(");
- accept(node.jjtGetChild(0), data);
- builder.append(")");
- return data;
- }
}
\ No newline at end of file
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/ExpressionImpl.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/ExpressionImpl.java?rev=1069299&r1=1069298&r2=1069299&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/ExpressionImpl.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/ExpressionImpl.java Thu Feb 10 09:22:12 2011
@@ -69,7 +69,8 @@ public class ExpressionImpl implements E
*/
public String dump() {
Debugger debug = new Debugger();
- return debug.debug(script)? debug.toString() : "/*?*/";
+ boolean d = debug.debug(script);
+ return debug.data() + (d? " /*" + debug.start() + ":" + debug.end() + "*/" : "/*?:?*/ ");
}
/**
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java?rev=1069299&r1=1069298&r2=1069299&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java Thu Feb 10 09:22:12 2011
@@ -25,7 +25,6 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
-import org.apache.commons.jexl2.parser.ASTReferenceExpression;
import org.apache.commons.jexl2.parser.SimpleNode;
import org.apache.commons.logging.Log;
@@ -71,6 +70,7 @@ import org.apache.commons.jexl2.parser.A
import org.apache.commons.jexl2.parser.ASTNullLiteral;
import org.apache.commons.jexl2.parser.ASTOrNode;
import org.apache.commons.jexl2.parser.ASTReference;
+import org.apache.commons.jexl2.parser.ASTReferenceExpression;
import org.apache.commons.jexl2.parser.ASTSizeFunction;
import org.apache.commons.jexl2.parser.ASTSizeMethod;
import org.apache.commons.jexl2.parser.ASTStringLiteral;
@@ -1068,7 +1068,8 @@ public class Interpreter implements Pars
}
public Object visit(ASTReferenceExpression node, Object data) {
- return node.jjtGetChild(0).jjtAccept(this, data);
+ ASTArrayAccess upper = (ASTArrayAccess) node;
+ return visit(upper, data);
}
/**
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlEngine.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlEngine.java?rev=1069299&r1=1069298&r2=1069299&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlEngine.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlEngine.java Thu Feb 10 09:22:12 2011
@@ -825,9 +825,9 @@ public class JexlEngine {
cache.put(expr, tree);
}
} catch (TokenMgrError xtme) {
- throw new JexlException(info, "tokenization failed", xtme);
+ throw new JexlException(info, "!!! " +expression+ " !!!" + ", tokenization failed", xtme);
} catch (ParseException xparse) {
- throw new JexlException(info, "parsing failed", xparse);
+ throw new JexlException(info, "!!! " +expression+ " !!!" + ", parsing failed", xparse);
}
}
return tree;
Added: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/ASTReferenceExpression.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/ASTReferenceExpression.java?rev=1069299&view=auto
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/ASTReferenceExpression.java (added)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/ASTReferenceExpression.java Thu Feb 10 09:22:12 2011
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.jexl2.parser;
+
+public final class ASTReferenceExpression extends ASTArrayAccess {
+ public ASTReferenceExpression(int id) {
+ super(id);
+ }
+
+ public ASTReferenceExpression(Parser p, int id) {
+ super(p, id);
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(ParserVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+}
Propchange: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/ASTReferenceExpression.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt?rev=1069299&r1=1069298&r2=1069299&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt Thu Feb 10 09:22:12 2011
@@ -257,7 +257,7 @@ void ForeachStatement() : {}
void Expression() #void : {}
{
- ConditionalExpression() ( <assign> Expression() #Assignment(2) )?
+ ConditionalExpression() (LOOKAHEAD(1) <assign> Expression() #Assignment(2) )?
}
void Assignment() #Assignment(2) : {}
@@ -525,7 +525,7 @@ void Constructor() #ConstructorNode() :
void PrimaryExpression() #void : {}
{
- LOOKAHEAD(3) Reference()
+ LOOKAHEAD(2) Reference()
|
LOOKAHEAD( <EMPTY> ) EmptyFunction()
|
@@ -542,7 +542,7 @@ void PrimaryExpression() #void : {}
void ArrayAccess() : {}
{
- Identifier() (LOOKAHEAD(2) <LBRACKET> Expression() <RBRACKET>)+
+ Identifier() (LOOKAHEAD(1) <LBRACKET> Expression() <RBRACKET>)+
}
void DotReference() #void : {}
@@ -551,14 +551,14 @@ void DotReference() #void : {}
( LOOKAHEAD(Identifier() <LBRACKET> )
ArrayAccess()
|
- ( LOOKAHEAD(3)
+ ( LOOKAHEAD(2)
AnyMethod()
|
Identifier()
|
IntegerLiteral()
- )
- )
+ )
+ )
)*
}
@@ -585,8 +585,11 @@ void Reference() : {}
) DotReference()
}
+/**
+ * ReferenceExpression is a subclass of ArrayAccess
+ */
void ReferenceExpression() : {}
{
- <LPAREN> Expression() <RPAREN>
+ <LPAREN> Expression() <RPAREN> (LOOKAHEAD(1) <LBRACKET> Expression() <RBRACKET>)*
}
Modified: commons/proper/jexl/trunk/src/site/xdoc/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/site/xdoc/changes.xml?rev=1069299&r1=1069298&r2=1069299&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/site/xdoc/changes.xml (original)
+++ commons/proper/jexl/trunk/src/site/xdoc/changes.xml Thu Feb 10 09:22:12 2011
@@ -26,6 +26,9 @@
</properties>
<body>
<release version="2.0.2" date="unreleased">
+ <action dev="henrib" type="add" issue="JEXL-107" due-to="henrib">
+ Literals and parenthesized expressions can not be used as references
+ </action>
<action dev="henrib" type="add" issue="JEXL-106" due-to="Michal Sabol">
When divide two BigDecimal values in an expression it results in java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
</action>
Modified: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IssuesTest.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IssuesTest.java?rev=1069299&r1=1069298&r2=1069299&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IssuesTest.java (original)
+++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IssuesTest.java Thu Feb 10 09:22:12 2011
@@ -23,6 +23,7 @@ import org.apache.commons.jexl2.internal
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.jexl2.introspection.UberspectImpl;
+import org.apache.commons.jexl2.parser.JexlNode;
/**
* Test cases for reported issues
@@ -454,31 +455,28 @@ public class IssuesTest extends JexlTest
}
public void test107() throws Exception {
+ String[] exprs = {
+ "'Q4'.toLowerCase()", "q4",
+ "(Q4).toLowerCase()", "q4",
+ "(4).toString()", "4",
+ "(1 + 3).toString()", "4",
+ "({ 'q' : 'Q4'}).get('q').toLowerCase()", "q4",
+ "{ 'q' : 'Q4'}.get('q').toLowerCase()", "q4",
+ "({ 'q' : 'Q4'})['q'].toLowerCase()", "q4",
+ "(['Q4'])[0].toLowerCase()", "q4"
+ };
+
JexlContext context = new MapContext();
context.set("Q4", "Q4");
JexlEngine jexl = new JexlEngine();
- Expression expr;
- Object value;
- expr = jexl.createExpression("'Q4'.toLowerCase()");
- value = expr.evaluate(context);
- assertEquals("q4", value);
- expr = jexl.createExpression("(Q4).toLowerCase()");
- value = expr.evaluate(context);
- assertEquals("q4", value);
- expr = jexl.createExpression("(4).toString()");
- value = expr.evaluate(context);
- assertEquals("4", value);
- value = jexl.createExpression("(1 + 3).toString()");
- value = expr.evaluate(context);
- assertEquals("4", value);
- expr = jexl.createExpression("({ 'Q4' : 'Q4'}).get('Q4').toLowerCase()");
- value = expr.evaluate(context);
- assertEquals("q4", value);
- expr = jexl.createExpression("{ 'Q4' : 'Q4'}.get('Q4').toLowerCase()");
- value = expr.evaluate(context);
- assertEquals("q4", value);
- expr = jexl.createExpression("({ 'Q4' : 'Q4'}).get('Q4').toLowerCase()");
- value = expr.evaluate(context);
- assertEquals("q4", value);
+ for(int e = 0; e < exprs.length; e += 2) {
+ Expression expr = jexl.createExpression(exprs[e]);
+ Object expected = exprs[e + 1];
+ Object value = expr.evaluate(context);
+ assertEquals(expected, value);
+ expr = jexl.createExpression(expr.dump());
+ value = expr.evaluate(context);
+ assertEquals(expected, value);
+ }
}
}