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 2012/02/11 18:08:00 UTC
svn commit: r1243101 - in /commons/proper/jexl/trunk/src:
main/java/org/apache/commons/jexl3/
main/java/org/apache/commons/jexl3/internal/
main/java/org/apache/commons/jexl3/internal/introspection/
main/java/org/apache/commons/jexl3/parser/ test/java/o...
Author: henrib
Date: Sat Feb 11 17:07:59 2012
New Revision: 1243101
URL: http://svn.apache.org/viewvc?rev=1243101&view=rev
Log:
JEXL-127; refined exception handling, checkstyle
Removed:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Frame.java
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/JexlException.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Engine.java
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/internal/Scope.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Script.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTJexlLambda.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTJexlScript.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ArithmeticTest.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/JexlException.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/JexlException.java?rev=1243101&r1=1243100&r2=1243101&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/JexlException.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/JexlException.java Sat Feb 11 17:07:59 2012
@@ -23,6 +23,8 @@ import org.apache.commons.jexl3.parser.T
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.UndeclaredThrowableException;
+import java.util.ArrayList;
+import java.util.List;
/**
* Wraps any error that might occur during interpretation of a script or expression.
@@ -66,12 +68,44 @@ public class JexlException extends Runti
* @param cause the exception causing the error
*/
public JexlException(JexlInfo jinfo, String msg, Throwable cause) {
- super(msg, unwrap(cause));
+ super(msg, clean(unwrap(cause)));
mark = null;
info = jinfo;
}
/**
+ * Cleans a JexlException from any org.apache.commons.jexl3 stack trace element.
+ * @return this exception
+ */
+ public JexlException clean() {
+ return clean(this);
+ }
+
+ /**
+ * Cleans a Throwable from any org.apache.commons.jexl3 stack trace element.
+ * @param <X> the throwable type
+ * @param xthrow the thowable
+ * @return the throwable
+ */
+ private static <X extends Throwable> X clean(X xthrow) {
+ if (xthrow != null) {
+ StackTraceElement[] stack = xthrow.getStackTrace();
+ StackTraceElement se = null;
+ List<StackTraceElement> stackJexl = new ArrayList<StackTraceElement>();
+ stackJexl.add(stack[0]);
+ for (int s = 1; s < stack.length; ++s) {
+ se = stack[s];
+ String className = se.getClassName();
+ if (!className.startsWith("org.apache.commons.jexl3")) {
+ stackJexl.add(se);
+ }
+ }
+ xthrow.setStackTrace(stackJexl.toArray(new StackTraceElement[stackJexl.size()]));
+ }
+ return xthrow;
+ }
+
+ /**
* Unwraps the cause of a throwable due to reflection.
* @param xthrow the throwable
* @return the cause
@@ -216,7 +250,6 @@ public class JexlException extends Runti
* Creates a new Variable exception instance.
* @param node the offending ASTnode
* @param var the unknown variable
- * @param cause the exception causing the error
*/
public Variable(JexlNode node, String var) {
super(node, var, null);
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Engine.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Engine.java?rev=1243101&r1=1243100&r2=1243101&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Engine.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Engine.java Sat Feb 11 17:07:59 2012
@@ -335,7 +335,7 @@ public class Engine extends JexlEngine {
Scope scope = new Scope(null, "#0");
ASTJexlScript script = parse(expr, null, scope);
JexlNode node = script.jjtGetChild(0);
- Frame frame = script.createFrame(bean);
+ Scope.Frame frame = script.createFrame(bean);
Interpreter interpreter = createInterpreter(context, frame);
return node.jjtAccept(interpreter, null);
} catch (JexlException xjexl) {
@@ -343,7 +343,7 @@ public class Engine extends JexlEngine {
logger.warn(xjexl.getMessage(), xjexl.getCause());
return null;
}
- throw xjexl;
+ throw xjexl.clean();
} finally {
parser.ALLOW_REGISTERS = false;
}
@@ -366,7 +366,7 @@ public class Engine extends JexlEngine {
Scope scope = new Scope(null, "#0", "#1");
ASTJexlScript script = parse(expr, null, scope);
JexlNode node = script.jjtGetChild(0);
- Frame frame = script.createFrame(bean, value);
+ Scope.Frame frame = script.createFrame(bean, value);
Interpreter interpreter = createInterpreter(context, frame);
node.jjtAccept(interpreter, null);
} catch (JexlException xjexl) {
@@ -374,7 +374,7 @@ public class Engine extends JexlEngine {
logger.warn(xjexl.getMessage(), xjexl.getCause());
return;
}
- throw xjexl;
+ throw xjexl.clean();
} finally {
parser.ALLOW_REGISTERS = false;
}
@@ -403,7 +403,7 @@ public class Engine extends JexlEngine {
logger.warn(xjexl.getMessage(), xjexl.getCause());
return null;
}
- throw xjexl;
+ throw xjexl.clean();
}
}
return result;
@@ -448,7 +448,7 @@ public class Engine extends JexlEngine {
logger.warn(xjexl.getMessage(), xjexl.getCause());
return null;
}
- throw xjexl;
+ throw xjexl.clean();
}
}
return result;
@@ -460,7 +460,7 @@ public class Engine extends JexlEngine {
* @param frame the interpreter frame
* @return an Interpreter
*/
- protected Interpreter createInterpreter(JexlContext context, Frame frame) {
+ protected Interpreter createInterpreter(JexlContext context, Scope.Frame frame) {
return new Interpreter(this, context == null ? EMPTY_CONTEXT : context, frame);
}
@@ -694,9 +694,9 @@ public class Engine extends JexlEngine {
cache.put(expr, script);
}
} catch (TokenMgrError xtme) {
- throw new JexlException.Tokenization(jexlInfo, expression, xtme);
+ throw new JexlException.Tokenization(jexlInfo, expression, xtme).clean();
} catch (ParseException xparse) {
- throw new JexlException.Parsing(jexlInfo, expression, xparse);
+ throw new JexlException.Parsing(jexlInfo, expression, xparse).clean();
} finally {
parser.setFrame(null);
}
@@ -729,7 +729,7 @@ public class Engine extends JexlEngine {
StackTraceElement[] stack = xinfo.getStackTrace();
StackTraceElement se = null;
Class<?> clazz = getClass();
- for (int s = 1; s < stack.length; ++s, se = null) {
+ for (int s = 1; s < stack.length; ++s) {
se = stack[s];
String className = se.getClassName();
if (!className.equals(clazz.getName())) {
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=1243101&r1=1243100&r2=1243101&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 Sat Feb 11 17:07:59 2012
@@ -120,7 +120,7 @@ public class Interpreter extends ParserV
/** Cache executors. */
protected final boolean cache;
/** Registers or arguments. */
- protected final Frame frame;
+ protected final Scope.Frame frame;
/** Cancellation support. */
protected volatile boolean cancelled = false;
/** Empty parameters for method matching. */
@@ -130,9 +130,9 @@ public class Interpreter extends ParserV
* Creates an interpreter.
* @param engine the engine creating this interpreter
* @param aContext the context to evaluate expression
- * @param frame the engine evaluation frame
+ * @param eFrame the interpreter evaluation frame
*/
- protected Interpreter(Engine engine, JexlContext aContext, Frame eFrame) {
+ protected Interpreter(Engine engine, JexlContext aContext, Scope.Frame eFrame) {
this.jexl = engine;
this.logger = jexl.logger;
this.uberspect = jexl.uberspect;
@@ -155,8 +155,13 @@ public class Interpreter extends ParserV
this.frame = eFrame;
this.functors = null;
}
-
- protected Interpreter(Interpreter copy, Frame eFrame) {
+
+ /**
+ * Creates a copy of an interpreter, used for function/lambda evaluation.
+ * @param copy the interpreter to copy
+ * @param eFrame the interpreter evaluation frame
+ */
+ protected Interpreter(Interpreter copy, Scope.Frame eFrame) {
this.jexl = copy.jexl;
this.logger = copy.logger;
this.uberspect = copy.uberspect;
@@ -167,8 +172,8 @@ public class Interpreter extends ParserV
this.strictEngine = copy.strictEngine;
this.strictArithmetic = copy.strictArithmetic;
this.cache = copy.cache;
+ this.functors = copy.functors;
this.frame = eFrame;
- this.functors = null;
}
/**
@@ -191,7 +196,7 @@ public class Interpreter extends ParserV
logger.warn(xjexl.getMessage(), xjexl.getCause());
return null;
}
- throw xjexl;
+ throw xjexl.clean();
} finally {
functors = null;
}
@@ -422,7 +427,7 @@ public class Interpreter extends ParserV
// determine initial object & property:
JexlNode objectNode = null;
- Object object = register >= 0 ? frame.registers[register] : null;
+ Object object = register >= 0 ? frame.get(register) : null;
JexlNode propertyNode = null;
Object property = null;
boolean isVariable = true;
@@ -504,7 +509,7 @@ public class Interpreter extends ParserV
}
// deal with ant variable; set context
if (isRegister) {
- frame.registers[register] = right;
+ frame.set(register, right);
return right;
} else if (antVar) {
if (isVariable && object == null) {
@@ -668,7 +673,7 @@ public class Interpreter extends ParserV
if (register < 0) {
context.set(loopVariable.image, value);
} else {
- frame.registers[register] = value;
+ frame.set(register, value);
}
// execute statement
result = statement.jjtAccept(this, data);
@@ -766,7 +771,7 @@ public class Interpreter extends ParserV
if (data == null) {
int register = node.getRegister();
if (register >= 0) {
- return frame.registers[register];
+ return frame.get(register);
}
Object value = context.get(name);
if (value == null
@@ -837,17 +842,32 @@ public class Interpreter extends ParserV
}
}
+ /**
+ * A function closure.
+ */
private static final class Closure {
- Frame frame;
- ASTJexlLambda lambda;
- Closure(ASTJexlLambda l, Frame f) {
+ /** The frame. */
+ private final Scope.Frame frame;
+ /** The actual lambda. */
+ private final ASTJexlLambda lambda;
+ /** Creates a closure.
+ * @param l the lambda
+ * @param f the interpreter frame
+ */
+ Closure(ASTJexlLambda l, Scope.Frame f) {
lambda = l;
frame = lambda.createFrame(f);
}
}
+ /**
+ * Evaluates a closure.
+ * @param closure the closure
+ * @param argv the arguments
+ * @return the result of evaluation
+ */
private Object call(Closure closure, Object[] argv) {
- Frame cframe = closure.frame;
+ Scope.Frame cframe = closure.frame;
if (cframe != null) {
cframe.assign(argv);
}
@@ -952,7 +972,7 @@ public class Interpreter extends ParserV
if (bean == context) {
int register = methodNode.getRegister();
if (register >= 0) {
- functor = frame.registers[register];
+ functor = frame.get(register);
} else {
functor = context.get(methodName);
}
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Scope.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Scope.java?rev=1243101&r1=1243100&r2=1243101&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Scope.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Scope.java Sat Feb 11 17:07:59 2012
@@ -37,42 +37,38 @@ public final class Scope {
*/
private int vars;
/**
- * The number of hoisted variables.
- */
- private int hoisted;
- /**
- * 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
+ * The map of named varialbes aka script parameters and local variables.
+ * Each parameter is associated to a register and is materialized as an offset in the stacked array used
* during evaluation.
*/
- private Map<String, Integer> namedRegisters = null;
+ private Map<String, Integer> namedVariables = null;
/**
- * The map of registers to parent registers when hoisted by closure.
+ * The map of local hoisted variables to parent scope variables, ie closure.
*/
- private Map<Integer, Integer> hoistedRegisters = null;
+ private Map<Integer, Integer> hoistedVariables = null;
/**
* Creates a new scope with a list of parameters.
+ * @param scope the parent scope if any
* @param parameters the list of parameters
*/
public Scope(Scope scope, String... parameters) {
if (parameters != null) {
parms = parameters.length;
- namedRegisters = new LinkedHashMap<String, Integer>();
+ namedVariables = new LinkedHashMap<String, Integer>();
for (int p = 0; p < parms; ++p) {
- namedRegisters.put(parameters[p], p);
+ namedVariables.put(parameters[p], p);
}
} else {
parms = 0;
}
vars = 0;
- hoisted = 0;
parent = scope;
}
@Override
public int hashCode() {
- return namedRegisters == null ? 0 : parms ^ namedRegisters.hashCode();
+ return namedVariables == null ? 0 : parms ^ namedVariables.hashCode();
}
@Override
@@ -90,16 +86,16 @@ public final class Scope {
return true;
} else if (frame == null || parms != frame.parms) {
return false;
- } else if (namedRegisters == null) {
- return frame.namedRegisters == null;
+ } else if (namedVariables == null) {
+ return frame.namedVariables == null;
} else {
- return namedRegisters.equals(frame.namedRegisters);
+ return namedVariables.equals(frame.namedVariables);
}
}
/**
* Checks whether an identifier is a local variable or argument, ie stored in a register.
- * If this fails, attempt to solve by hoisting parent registers.
+ * If this fails, attempt to solve by hoisting parent stacked.
* @param name the register name
* @return the register index
*/
@@ -110,24 +106,23 @@ public final class Scope {
/**
* Checks whether an identifier is a local variable or argument, ie stored in a register.
* @param name the register name
- * @param hoist whether solving by hoisting parent registers is allowed
+ * @param hoist whether solving by hoisting parent stacked is allowed
* @return the register index
*/
private Integer getRegister(String name, boolean hoist) {
- Integer register = namedRegisters != null ? namedRegisters.get(name) : null;
+ Integer register = namedVariables != null ? namedVariables.get(name) : null;
if (register == null && hoist && parent != null) {
Integer pr = parent.getRegister(name, false);
if (pr != null) {
- if (hoistedRegisters == null) {
- hoistedRegisters = new LinkedHashMap<Integer, Integer>();
+ if (hoistedVariables == null) {
+ hoistedVariables = new LinkedHashMap<Integer, Integer>();
}
- register = Integer.valueOf(namedRegisters.size());
- if (namedRegisters == null) {
- namedRegisters = new LinkedHashMap<String, Integer>();
+ if (namedVariables == null) {
+ namedVariables = new LinkedHashMap<String, Integer>();
}
- namedRegisters.put(name, register);
- hoistedRegisters.put(register, pr);
- hoisted += 1;
+ register = Integer.valueOf(namedVariables.size());
+ namedVariables.put(name, register);
+ hoistedVariables.put(register, pr);
}
}
return register;
@@ -141,15 +136,15 @@ public final class Scope {
* @param name the parameter name
*/
public void declareParameter(String name) {
- if (namedRegisters == null) {
- namedRegisters = new LinkedHashMap<String, Integer>();
+ if (namedVariables == null) {
+ namedVariables = new LinkedHashMap<String, Integer>();
} else if (vars > 0) {
throw new IllegalStateException("cant declare parameters after variables");
}
- Integer register = namedRegisters.get(name);
+ Integer register = namedVariables.get(name);
if (register == null) {
- register = Integer.valueOf(namedRegisters.size());
- namedRegisters.put(name, register);
+ register = Integer.valueOf(namedVariables.size());
+ namedVariables.put(name, register);
parms += 1;
}
}
@@ -163,13 +158,13 @@ public final class Scope {
* @return the register index storing this variable
*/
public Integer declareVariable(String name) {
- if (namedRegisters == null) {
- namedRegisters = new LinkedHashMap<String, Integer>();
+ if (namedVariables == null) {
+ namedVariables = new LinkedHashMap<String, Integer>();
}
- Integer register = namedRegisters.get(name);
+ Integer register = namedVariables.get(name);
if (register == null) {
- register = Integer.valueOf(namedRegisters.size());
- namedRegisters.put(name, register);
+ register = Integer.valueOf(namedVariables.size());
+ namedVariables.put(name, register);
vars += 1;
}
return register;
@@ -177,21 +172,22 @@ public final class Scope {
/**
* Creates a frame by copying values up to the number of parameters.
- * @param values the argument values
+ * <p>This captures the hoisted variables values.</p>
+ * @param frame the caller frame
* @return the arguments array
*/
- public Frame createFrame(Frame caller) {
- if (namedRegisters != null) {
- Object[] arguments = new Object[namedRegisters.size()];
- if (caller != null && hoistedRegisters != null && parent != null) {
- for (Map.Entry<Integer, Integer> hoist : hoistedRegisters.entrySet()) {
+ public Frame createFrame(Frame frame) {
+ if (namedVariables != null) {
+ Object[] arguments = new Object[namedVariables.size()];
+ if (frame != null && hoistedVariables != null && parent != null) {
+ for (Map.Entry<Integer, Integer> hoist : hoistedVariables.entrySet()) {
Integer target = hoist.getKey();
Integer source = hoist.getValue();
- Object arg = caller.registers[source.intValue()];
+ Object arg = frame.get(source.intValue());
arguments[target.intValue()] = arg;
}
}
- return new Frame(arguments, namedRegisters.keySet().toArray(new String[namedRegisters.size()]));
+ return new Frame(arguments);
} else {
return null;
}
@@ -206,22 +202,22 @@ public final class Scope {
}
/**
- * Gets this script registers, i.e. parameters and local variables.
+ * Gets this script stacked, i.e. parameters and local variables.
* @return the register names
*/
public String[] getRegisters() {
- return namedRegisters != null ? namedRegisters.keySet().toArray(new String[0]) : new String[0];
+ return namedVariables != null ? namedVariables.keySet().toArray(new String[0]) : new String[0];
}
/**
- * Gets this script parameters, i.e. registers assigned before creating local variables.
+ * Gets this script parameters, i.e. stacked assigned before creating local variables.
* @return the parameter names
*/
public String[] getParameters() {
- if (namedRegisters != null && parms > 0) {
+ if (namedVariables != null && parms > 0) {
String[] pa = new String[parms];
int p = 0;
- for (Map.Entry<String, Integer> entry : namedRegisters.entrySet()) {
+ for (Map.Entry<String, Integer> entry : namedVariables.entrySet()) {
if (entry.getValue().intValue() < parms) {
pa[p++] = entry.getKey();
}
@@ -233,14 +229,14 @@ public final class Scope {
}
/**
- * Gets this script local variable, i.e. registers assigned to local variables.
+ * Gets this script local variable, i.e. stacked assigned to local variables.
* @return the parameter names
*/
public String[] getLocalVariables() {
- if (namedRegisters != null && vars > 0) {
+ if (namedVariables != null && vars > 0) {
String[] pa = new String[parms];
int p = 0;
- for (Map.Entry<String, Integer> entry : namedRegisters.entrySet()) {
+ for (Map.Entry<String, Integer> entry : namedVariables.entrySet()) {
if (entry.getValue().intValue() >= parms) {
pa[p++] = entry.getKey();
}
@@ -250,5 +246,51 @@ public final class Scope {
return null;
}
}
-
+
+ /**
+ * A call frame, created from a scope, stores the arguments and local variables in a "stack frame" (sic).
+ * @since 3.0
+ */
+ public static final class Frame {
+ /** The actual stack frame. */
+ private final Object[] stack;
+
+ /**
+ * Creates a new frame.
+ * @param r the stack frame
+ */
+ public Frame(Object[] r) {
+ stack = r;
+ }
+
+ /**
+ * Gets a value.
+ * @param s the offset in this frame
+ * @return the stacked value
+ */
+ public Object get(int s) {
+ return stack[s];
+ }
+
+ /**
+ * Sets a value.
+ * @param r the offset in this frame
+ * @param value the value to set in this frame
+ */
+ public void set(int r, Object value) {
+ stack[r] = value;
+ }
+
+ /**
+ * Assign values to this frame.
+ * @param values the values
+ * @return this frame
+ */
+ public Frame assign(Object... values) {
+ if (stack != null && values != null && values.length > 0) {
+ System.arraycopy(values, 0, stack, 0, Math.min(stack.length, values.length));
+ }
+ return this;
+ }
+ }
}
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Script.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Script.java?rev=1243101&r1=1243100&r2=1243101&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Script.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/Script.java Sat Feb 11 17:07:59 2012
@@ -57,7 +57,7 @@ public class Script implements JexlScrip
if (script.jjtGetNumChildren() < 1) {
return null;
}
- Frame frame = script.createFrame((Object[]) null);
+ Scope.Frame frame = script.createFrame((Object[]) null);
Interpreter interpreter = jexl.createInterpreter(context, frame);
return interpreter.interpret(script.jjtGetChild(0));
}
@@ -94,7 +94,7 @@ public class Script implements JexlScrip
*/
@Override
public Object execute(JexlContext context) {
- Frame frame = script.createFrame((Object[]) null);
+ Scope.Frame frame = script.createFrame((Object[]) null);
Interpreter interpreter = jexl.createInterpreter(context, frame);
return interpreter.interpret(script);
}
@@ -104,7 +104,7 @@ public class Script implements JexlScrip
*/
@Override
public Object execute(JexlContext context, Object... args) {
- Frame frame = script.createFrame(args != null && args.length > 0? args : null);
+ Scope.Frame frame = script.createFrame(args != null && args.length > 0? args : null);
Interpreter interpreter = jexl.createInterpreter(context, frame);
return interpreter.interpret(script);
}
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java?rev=1243101&r1=1243100&r2=1243101&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java Sat Feb 11 17:07:59 2012
@@ -257,7 +257,7 @@ public final class TemplateEngine extend
@Override
public final TemplateExpression prepare(JexlContext context) {
try {
- Frame frame = context instanceof TemplateContext
+ Scope.Frame frame = context instanceof TemplateContext
? ((TemplateContext) context).getFrame()
: null;
Interpreter interpreter = jexl.createInterpreter(context, frame);
@@ -275,7 +275,7 @@ public final class TemplateEngine extend
@Override
public final Object evaluate(JexlContext context) {
try {
- Frame frame = context instanceof TemplateContext
+ Scope.Frame frame = context instanceof TemplateContext
? ((TemplateContext) context).getFrame()
: null;
Interpreter interpreter = jexl.createInterpreter(context, frame);
@@ -973,7 +973,7 @@ public final class TemplateEngine extend
@Override
public TemplateScript prepare(JexlContext context) {
- Frame frame = script.createFrame((Object[]) null);
+ Scope.Frame frame = script.createFrame((Object[]) null);
TemplateContext tcontext = new TemplateContext(context, frame, exprs, null);
TemplateExpression[] immediates = new TemplateExpression[exprs.length];
for (int e = 0; e < exprs.length; ++e) {
@@ -989,7 +989,7 @@ public final class TemplateEngine extend
@Override
public void evaluate(JexlContext context, Writer writer, Object... args) {
- Frame frame = script.createFrame(args);
+ Scope.Frame frame = script.createFrame(args);
TemplateContext tcontext = new TemplateContext(context, frame, exprs, writer);
Interpreter interpreter = jexl.createInterpreter(tcontext, frame);
interpreter.interpret(script);
@@ -1009,7 +1009,7 @@ public final class TemplateEngine extend
/** The writer used to output. */
private final Writer writer;
/** The call frame. */
- private final Frame frame;
+ private final Scope.Frame frame;
/**
* Creates a TemplateScript context instance.
@@ -1018,7 +1018,7 @@ public final class TemplateEngine extend
* @param expressions the list of TemplateExpression from the TemplateScript to evaluate
* @param out the output writer
*/
- protected TemplateContext(JexlContext jcontext, Frame jframe,
+ protected TemplateContext(JexlContext jcontext, Scope.Frame jframe,
UnifiedExpression[] expressions, Writer out) {
wrap = jcontext;
frame = jframe;
@@ -1030,7 +1030,7 @@ public final class TemplateEngine extend
* Gets this context calling frame.
* @return the engine frame
*/
- public Frame getFrame() {
+ public Scope.Frame getFrame() {
return frame;
}
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java?rev=1243101&r1=1243100&r2=1243101&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java Sat Feb 11 17:07:59 2012
@@ -201,7 +201,7 @@ public class Uberspect implements JexlUb
}
// last, look for get("foo") if we did not try yet
if (property != null && !(identifier instanceof String)) {
- // if that didn't work, look for set("foo")
+ // if that didn't work, look for get("foo")
executor = DuckGetExecutor.discover(is, claz, property);
if (executor != null) {
return executor;
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTJexlLambda.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTJexlLambda.java?rev=1243101&r1=1243100&r2=1243101&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTJexlLambda.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTJexlLambda.java Sat Feb 11 17:07:59 2012
@@ -16,7 +16,7 @@
*/
package org.apache.commons.jexl3.parser;
-import org.apache.commons.jexl3.internal.Frame;
+import org.apache.commons.jexl3.internal.Scope;
/**
* Enhanced script to allow parameters declaration.
@@ -35,9 +35,9 @@ public class ASTJexlLambda extends ASTJe
* @param values the argument values
* @return the arguments array
*/
- public Frame createFrame(Frame frame, Object... values) {
+ public Scope.Frame createFrame(Scope.Frame frame, Object... values) {
if (scope != null) {
- Frame cframe = scope.createFrame(frame);
+ Scope.Frame cframe = scope.createFrame(frame);
if (cframe != null) {
return cframe.assign(values);
}
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTJexlScript.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTJexlScript.java?rev=1243101&r1=1243100&r2=1243101&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTJexlScript.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/ASTJexlScript.java Sat Feb 11 17:07:59 2012
@@ -16,8 +16,6 @@
*/
package org.apache.commons.jexl3.parser;
-import org.apache.commons.jexl3.internal.Engine;
-import org.apache.commons.jexl3.internal.Frame;
import org.apache.commons.jexl3.internal.Scope;
/**
@@ -60,13 +58,14 @@ public class ASTJexlScript extends JexlN
* @param values the argument values
* @return the arguments array
*/
- public Frame createFrame(Object... values) {
+ public Scope.Frame createFrame(Object... values) {
if (scope != null) {
- Frame frame = scope.createFrame(null);
- return frame != null? frame.assign(values) : null;
- } else {
- return null;
- }
+ Scope.Frame frame = scope.createFrame(null);
+ if (frame != null) {
+ return frame.assign(values);
+ }
+ }
+ return null;
}
/**
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=1243101&r1=1243100&r2=1243101&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 Sat Feb 11 17:07:59 2012
@@ -16,13 +16,12 @@
*/
package org.apache.commons.jexl3.parser;
-import java.io.Reader;
-import java.util.Stack;
import org.apache.commons.jexl3.JexlException;
import org.apache.commons.jexl3.JexlInfo;
-import org.apache.commons.jexl3.internal.Engine;
import org.apache.commons.jexl3.internal.Scope;
+import java.util.Stack;
+
/**
* The base class for parsing, manages the parameter/local variable frame.
* @author henri
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt?rev=1243101&r1=1243100&r2=1243101&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt Sat Feb 11 17:07:59 2012
@@ -114,7 +114,6 @@ PARSER_END(Parser)
| < COLON : ":" >
| < COMMA : "," >
| < DOT : "." >
- | < LAMBDA : "->" >
}
<*> TOKEN : { /* CONDITIONALS */
Modified: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java?rev=1243101&r1=1243100&r2=1243101&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java (original)
+++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ArithmeticTest.java Sat Feb 11 17:07:59 2012
@@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.jexl3.junit.Asserter;
@@ -181,7 +182,7 @@ public class ArithmeticTest extends Jexl
public void testCoercions() throws Exception {
asserter.assertExpression("1", new Integer(1)); // numerics default to Integer
- asserter.assertExpression("5L", new Long(5));
+ asserter.assertExpression("5L", new Long(5));
asserter.setVariable("I2", new Integer(2));
asserter.setVariable("L2", new Long(2));
@@ -225,6 +226,22 @@ public class ArithmeticTest extends Jexl
}
}
+ public static class IterableContainer implements Iterable<Integer> {
+ private final Set<Integer> values;
+
+ public IterableContainer(int[] is) {
+ values = new HashSet<Integer>();
+ for (int value : is) {
+ values.add(value);
+ }
+ }
+
+ @Override
+ public Iterator<Integer> iterator() {
+ return values.iterator();
+ }
+ }
+
public void testRegexp() throws Exception {
asserter.setVariable("str", "abc456");
asserter.assertExpression("str =~ '.*456'", Boolean.TRUE);
@@ -249,7 +266,7 @@ public class ArithmeticTest extends Jexl
// check in/not-in on array, list, map, set and duck-type collection
int[] ai = {2, 4, 42, 54};
List<Integer> al = new ArrayList<Integer>();
- for(int i : ai) {
+ for (int i : ai) {
al.add(i);
}
Map<Integer, String> am = new HashMap<Integer, String>();
@@ -258,19 +275,19 @@ public class ArithmeticTest extends Jexl
am.put(42, "forty-two");
am.put(54, "fifty-four");
MatchingContainer ad = new MatchingContainer(ai);
+ IterableContainer ic = new IterableContainer(ai);
Set<Integer> as = ad.values;
- Object[] vars = { ai, al, am, ad, as };
-
- for(Object var : vars) {
+ Object[] vars = {ai, al, am, ad, as, ic};
+
+ for (Object var : vars) {
asserter.setVariable("container", var);
- for(int x : ai) {
+ for (int x : ai) {
asserter.setVariable("x", x);
asserter.assertExpression("x =~ container", Boolean.TRUE);
}
asserter.setVariable("x", 169);
asserter.assertExpression("x !~ container", Boolean.TRUE);
}
-
}
/**
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=1243101&r1=1243100&r2=1243101&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 Sat Feb 11 17:07:59 2012
@@ -495,7 +495,7 @@ public class IssuesTest extends JexlTest
public String getPropA() {
return propA;
}
-
+
public String uppercase(String str) {
return str.toUpperCase();
}
@@ -718,9 +718,6 @@ public class IssuesTest extends JexlTest
assertTrue((Boolean) result);
}
-
-
-
public static class Foo125 {
public String method() {
return "OK";
@@ -739,4 +736,23 @@ public class IssuesTest extends JexlTest
JexlContext jc = new Foo125Context(jexl, new Foo125());
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<ThrowNPE>(jexl, new ThrowNPE());
+ try {
+ e.evaluate(jc);
+ fail("Should have thrown NPE");
+ } catch(JexlException xany) {
+ Throwable xth = xany.getCause();
+ assertEquals(NullPointerException.class, xth.getClass());
+ }
+ }
}