Return-Path:
X-Original-To: apmail-commons-commits-archive@minotaur.apache.org
Delivered-To: apmail-commons-commits-archive@minotaur.apache.org
Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
by minotaur.apache.org (Postfix) with SMTP id EC4BB9CCF
for ;
Tue, 1 May 2012 13:26:59 +0000 (UTC)
Received: (qmail 2176 invoked by uid 500); 1 May 2012 13:26:59 -0000
Delivered-To: apmail-commons-commits-archive@commons.apache.org
Received: (qmail 2121 invoked by uid 500); 1 May 2012 13:26:59 -0000
Mailing-List: contact commits-help@commons.apache.org; run by ezmlm
Precedence: bulk
List-Help:
List-Unsubscribe:
List-Post:
List-Id:
Reply-To: dev@commons.apache.org
Delivered-To: mailing list commits@commons.apache.org
Received: (qmail 2108 invoked by uid 99); 1 May 2012 13:26:59 -0000
Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136)
by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 May 2012 13:26:59 +0000
X-ASF-Spam-Status: No, hits=-2000.0 required=5.0
tests=ALL_TRUSTED
X-Spam-Check-By: apache.org
Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4)
by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 May 2012 13:26:57 +0000
Received: from eris.apache.org (localhost [127.0.0.1])
by eris.apache.org (Postfix) with ESMTP id 34F272388A3D
for ; Tue, 1 May 2012 13:26:37 +0000 (UTC)
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: svn commit: r1332642 - in /commons/proper/jexl/trunk/src:
main/java/org/apache/commons/jexl3/internal/
main/java/org/apache/commons/jexl3/parser/
test/java/org/apache/commons/jexl3/
Date: Tue, 01 May 2012 13:26:36 -0000
To: commits@commons.apache.org
From: henrib@apache.org
X-Mailer: svnmailer-1.0.8-patched
Message-Id: <20120501132637.34F272388A3D@eris.apache.org>
X-Virus-Checked: Checked by ClamAV on apache.org
Author: henrib
Date: Tue May 1 13:26:36 2012
New Revision: 1332642
URL: http://svn.apache.org/viewvc?rev=1332642&view=rev
Log:
Cleaned ASTNumberLiteral conversion code;
Added specific exception tests;
Various Javadoc
Added:
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ExceptionTest.java (with props)
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTNumberLiteral.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java?rev=1332642&r1=1332641&r2=1332642&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Interpreter.java Tue May 1 13:26:36 2012
@@ -131,9 +131,9 @@ public class Interpreter extends ParserV
/**
* Creates an interpreter.
- * @param engine the engine creating this interpreter
+ * @param engine the engine creating this interpreter
* @param aContext the context to evaluate expression
- * @param eFrame the interpreter evaluation frame
+ * @param eFrame the interpreter evaluation frame
*/
protected Interpreter(Engine engine, JexlContext aContext, Scope.Frame eFrame) {
this.jexl = engine;
@@ -190,9 +190,9 @@ public class Interpreter extends ParserV
/**
* Finds the node causing a NPE for diadic operators.
- * @param xrt the RuntimeException
- * @param node the parent node
- * @param left the left argument
+ * @param xrt the RuntimeException
+ * @param node the parent node
+ * @param left the left argument
* @param right the right argument
* @return the left, right or parent node
*/
@@ -254,7 +254,7 @@ public class Interpreter extends ParserV
* Resolves a namespace, eventually allocating an instance using context as constructor argument. The lifetime of
* such instances span the current expression or script evaluation.
* @param prefix the prefix name (may be null for global namespace)
- * @param node the AST node
+ * @param node the AST node
* @return the namespace instance
*/
protected Object resolveNamespace(String prefix, JexlNode node) {
@@ -868,7 +868,7 @@ public class Interpreter extends ParserV
* Check for emptyness of various types: Collection, Array, Map, String, and anything that has a boolean isEmpty()
* method.
*
- * @param node the node holding the object
+ * @param node the node holding the object
* @param object the object to check the rmptyness of.
* @return the boolean
*/
@@ -913,7 +913,7 @@ public class Interpreter extends ParserV
* Calculate the
* size
of various types: Collection, Array, Map, String, and anything that has a int size() method.
*
- * @param node the node that gave the value to size
+ * @param node the node that gave the value to size
* @param object the object to get the size of.
* @return the size of val
*/
@@ -1037,7 +1037,7 @@ public class Interpreter extends ParserV
/**
* Checks whether a reference child node holds a local variable reference.
- * @param node the reference node
+ * @param node the reference node
* @param which the child we are checking
* @return true if child is local variable, false otherwise
*/
@@ -1091,7 +1091,7 @@ public class Interpreter extends ParserV
isVariable &= object == null;
}
if (object == null && isVariable && variableName != null
- && !isTernaryProtected(node) && !(context.has(variableName.toString()) || isLocalVariable(node, 0))) {
+ && !isTernaryProtected(node) && !(context.has(variableName.toString()) || isLocalVariable(node, 0))) {
JexlException xjexl = new JexlException.Variable(node, variableName.toString());
// variable unknown in context and not a local
return unknownVariable(xjexl);
@@ -1272,8 +1272,8 @@ public class Interpreter extends ParserV
* 2 - if this fails, narrow the arguments and try again
*
*
- * @param node the method node
- * @param bean the bean this method should be invoked upon
+ * @param node the method node
+ * @param bean the bean this method should be invoked upon
* @param functor the object carrying the method or function
* @return the result of the method invocation
*/
@@ -1446,7 +1446,7 @@ public class Interpreter extends ParserV
/**
* Gets an attribute of an object.
*
- * @param object to retrieve value from
+ * @param object to retrieve value from
* @param attribute the attribute of the object, e.g. an index (1, 0, 2) or key for a map
* @return the attribute value
*/
@@ -1457,9 +1457,9 @@ public class Interpreter extends ParserV
/**
* Gets an attribute of an object.
*
- * @param object to retrieve value from
+ * @param object to retrieve value from
* @param attribute the attribute of the object, e.g. an index (1, 0, 2) or key for a map
- * @param node the node that evaluated as the object
+ * @param node the node that evaluated as the object
* @return the attribute value
*/
protected Object getAttribute(Object object, Object attribute, JexlNode node) {
@@ -1517,9 +1517,9 @@ public class Interpreter extends ParserV
/**
* Sets an attribute of an object.
*
- * @param object to set the value to
+ * @param object to set the value to
* @param attribute the attribute of the object, e.g. an index (1, 0, 2) or key for a map
- * @param value the value to assign to the object's attribute
+ * @param value the value to assign to the object's attribute
*/
public void setAttribute(Object object, Object attribute, Object value) {
setAttribute(object, attribute, value, null);
@@ -1528,10 +1528,10 @@ public class Interpreter extends ParserV
/**
* Sets an attribute of an object.
*
- * @param object to set the value to
+ * @param object to set the value to
* @param attribute the attribute of the object, e.g. an index (1, 0, 2) or key for a map
- * @param value the value to assign to the object's attribute
- * @param node the node that evaluated as the object
+ * @param value the value to assign to the object's attribute
+ * @param node the node that evaluated as the object
*/
protected void setAttribute(Object object, Object attribute, Object value, JexlNode node) {
if (isCancelled()) {
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTNumberLiteral.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTNumberLiteral.java?rev=1332642&r1=1332641&r2=1332642&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTNumberLiteral.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTNumberLiteral.java Tue May 1 13:26:36 2012
@@ -37,7 +37,7 @@ public class ASTNumberLiteral extends Je
public Number getLiteral() {
return literal;
}
-
+
/** {@inheritDoc} */
@Override
protected boolean isConstant(boolean literal) {
@@ -121,28 +121,27 @@ public class ASTNumberLiteral extends Je
switch (s.charAt(last)) {
case 'b':
case 'B': {
- result = new BigDecimal(s.substring(0, last));
rclass = BigDecimal.class;
+ result = new BigDecimal(s.substring(0, last));
+ break;
+ }
+ case 'f':
+ case 'F': {
+ rclass = Float.class;
+ result = Float.valueOf(s.substring(0, last));
break;
}
case 'd':
case 'D':
- default : {
rclass = Double.class;
- result = Double.valueOf(s);
+ result = Double.valueOf(s.substring(0, last));
break;
- }
- case 'f':
- case 'F': {
- rclass = Float.class;
+ default: {
+ rclass = Double.class;
try {
- result = Float.valueOf(s);
- } catch (NumberFormatException take2) {
- try {
- result = Double.valueOf(s);
- } catch (NumberFormatException take3) {
- result = new BigDecimal(s);
- }
+ result = Double.valueOf(s);
+ } catch (NumberFormatException take3) {
+ result = new BigDecimal(s);
}
break;
}
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java?rev=1332642&r1=1332641&r2=1332642&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java Tue May 1 13:26:36 2012
@@ -28,14 +28,16 @@ import java.util.Stack;
*/
public abstract class JexlParser extends StringParser {
/**
- * The map of named registers aka script parameters. Each parameter is associated to a register and is materialized
- * as an offset in the registers array used during evaluation.
+ * The map of named registers aka script parameters.
+ * Each parameter is associated to a register and is materialized
+ * as an offset in the registers array used during evaluation.
*/
protected Scope frame = null;
protected Stack frames = new Stack();
/**
- * Sets the frame to use bythis parser. This is used to allow parameters to be declared before parsing.
+ * Sets the frame to use by this parser.
+ * This is used to allow parameters to be declared before parsing.
* @param theFrame the register map
*/
public void setFrame(Scope theFrame) {
@@ -43,7 +45,8 @@ public abstract class JexlParser extends
}
/**
- * Gets the frame used by this parser. Since local variables create new named registers, it is important to
+ * Gets the frame used by this parser.
+ *
Since local variables create new symbols, it is important to
* regain access after parsing to known which / how-many registers are needed.
* @return the named register map
*/
@@ -73,7 +76,7 @@ public abstract class JexlParser extends
}
/**
- * Checks whether an identifier is a local variable or argument, ie stored in a register.
+ * Checks whether an identifier is a local variable or argument, ie a symbol, stored in a register.
* @param identifier the identifier
* @param image the identifier image
* @return the image
@@ -89,7 +92,8 @@ public abstract class JexlParser extends
}
/**
- * Declares a local variable. This method creates an new entry in the named register map.
+ * Declares a local variable.
+ * This method creates an new entry in the symbol map.
* @param identifier the identifier used to declare
* @param image the variable name
*/
@@ -103,7 +107,8 @@ public abstract class JexlParser extends
}
/**
- * Declares a local parameter. This method creates an new entry in the named register map.
+ * Declares a local parameter.
+ * This method creates an new entry in the symbol map.
* @param identifier the identifier used to declare
* @param image the variable name
*/
Added: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ExceptionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ExceptionTest.java?rev=1332642&view=auto
==============================================================================
--- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ExceptionTest.java (added)
+++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ExceptionTest.java Tue May 1 13:26:36 2012
@@ -0,0 +1,99 @@
+/*
+ * 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.jexl3;
+
+import org.apache.commons.jexl3.internal.Engine;
+
+/**
+ * Checks various exception handling cases.
+ */
+public class ExceptionTest extends JexlTestCase {
+ /** create a named test */
+ public ExceptionTest(String name) {
+ super(name);
+ }
+
+ public static class ThrowNPE {
+ public String method() {
+ throw new NullPointerException("ThrowNPE");
+ }
+ }
+
+ public void testWrappedEx() throws Exception {
+ JexlEngine jexl = new Engine();
+ JexlExpression e = jexl.createExpression("method()");
+ JexlContext jc = new ObjectContext(jexl, new ThrowNPE());
+ try {
+ e.evaluate(jc);
+ fail("Should have thrown NPE");
+ } catch (JexlException xany) {
+ Throwable xth = xany.getCause();
+ assertEquals(NullPointerException.class, xth.getClass());
+ }
+ }
+
+ // Unknown vars and properties versus null operands
+ public void testEx() throws Exception {
+ JexlEngine jexl = createEngine(false);
+ JexlExpression e = jexl.createExpression("c.e * 6");
+ JexlEvalContext ctxt = new JexlEvalContext();
+ // ensure errors will throw
+ ctxt.setSilent(false);
+ // make unknown vars throw
+ ctxt.setStrict(true);
+ // empty cotext
+ try {
+ /* Object o = */ e.evaluate(ctxt);
+ fail("c.e not declared as variable should throw");
+ } catch (JexlException.Variable xjexl) {
+ String msg = xjexl.getMessage();
+ assertTrue(msg.indexOf("c.e") > 0);
+ }
+
+ // disallow null operands
+ ctxt.setStrictArithmetic(true);
+ ctxt.set("c.e", null);
+ try {
+ /* Object o = */ e.evaluate(ctxt);
+ fail("c.e as null operand should throw");
+ } catch (JexlException xjexl) {
+ String msg = xjexl.getMessage();
+ assertTrue(msg.indexOf("null operand") > 0);
+ }
+
+ // allow null operands
+ ctxt.setStrictArithmetic(false);
+ try {
+ /* Object o = */ e.evaluate(ctxt);
+
+ } catch (JexlException xjexl) {
+ fail("c.e in expr should not throw");
+ }
+
+ // ensure c.e is not a defined property
+ ctxt.set("c", "{ 'a' : 3, 'b' : 5}");
+ ctxt.set("e", Integer.valueOf(2));
+ try {
+ /* Object o = */ e.evaluate(ctxt);
+ fail("c.e not accessible as property should throw");
+ } catch (JexlException.Property xjexl) {
+ String msg = xjexl.getMessage();
+ assertTrue(msg.indexOf("e") > 0);
+ }
+ }
+
+}
Propchange: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ExceptionTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java?rev=1332642&r1=1332641&r2=1332642&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java (original)
+++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java Tue May 1 13:26:36 2012
@@ -738,25 +738,6 @@ public class IssuesTest extends JexlTest
assertEquals("OK", e.evaluate(jc));
}
- public static class ThrowNPE {
- public String method() {
- throw new NullPointerException("ThrowNPE");
- }
- }
-
- public void test126() throws Exception {
- JexlEngine jexl = new Engine();
- JexlExpression e = jexl.createExpression("method()");
- JexlContext jc = new ObjectContext(jexl, new ThrowNPE());
- try {
- e.evaluate(jc);
- fail("Should have thrown NPE");
- } catch (JexlException xany) {
- Throwable xth = xany.getCause();
- assertEquals(NullPointerException.class, xth.getClass());
- }
- }
-
public void test130a() throws Exception {
String myName = "Test.Name";
Object myValue = "Test.Value";
@@ -786,7 +767,7 @@ public class IssuesTest extends JexlTest
assertEquals(myValue, myObjectWithTernaryConditional);
}
- public void test131() throws Exception {
+ public void testBigdOp() throws Exception {
BigDecimal sevendot475 = new BigDecimal("7.475");
BigDecimal SO = new BigDecimal("325");
JexlContext jc = new MapContext();