public class Interpreter extends ParserVisitor
Modifier and Type | Field and Description |
---|---|
protected JexlArithmetic |
arithmetic
The arithmetic handler.
|
protected boolean |
cache
Cache executors.
|
protected boolean |
cancelled
Cancellation support.
|
protected JexlContext |
context
The context to store/retrieve variables.
|
protected static Object[] |
EMPTY_PARAMS
Empty parameters for method matching.
|
protected Scope.Frame |
frame
symbol values.
|
protected Map<String,Object> |
functions
The map of symboled functions.
|
protected Map<String,Object> |
functors
The map of symboled functions.
|
protected Engine |
jexl
The JEXL engine.
|
protected org.apache.commons.logging.Log |
logger
The logger.
|
protected JexlContext.NamespaceResolver |
ns
The context to store/retrieve variables.
|
protected Operators |
operators
The operators evaluation delegate.
|
protected boolean |
silent
Silent interpreter flag.
|
protected boolean |
strictArithmetic
Strict interpreter flag.
|
protected boolean |
strictEngine
Strict interpreter flag (may temporarily change when calling size and empty as functions).
|
protected JexlUberspect |
uberspect
The uberspect.
|
Modifier | Constructor and Description |
---|---|
protected |
Interpreter(Engine engine,
JexlContext aContext,
Scope.Frame eFrame)
Creates an interpreter.
|
Modifier and Type | Method and Description |
---|---|
protected Object |
call(JexlNode node,
Object target,
Object functor,
ASTArguments argNode)
Calls a method (or function).
|
protected Object |
executeAssign(JexlNode node,
JexlOperator assignop,
Object data)
Executes an assignment with an optional side-effect operator.
|
protected JexlNode |
findNullOperand(RuntimeException xrt,
JexlNode node,
Object left,
Object right)
Finds the node causing a NPE for diadic operators.
|
Object |
getAttribute(Object object,
Object attribute)
Gets an attribute of an object.
|
protected Object |
getAttribute(Object object,
Object attribute,
JexlNode node)
Gets an attribute of an object.
|
Object |
interpret(JexlNode node)
Interpret the given script/expression.
|
protected Object |
invocationFailed(JexlException xjexl)
Triggered when method, function or constructor invocation fails.
|
protected boolean |
isCancelled()
Checks whether this interpreter execution was cancelled due to thread interruption.
|
protected boolean |
isLocalVariable(ASTReference node,
int which)
Checks whether a reference child node holds a local variable reference.
|
protected boolean |
isTernaryProtected(JexlNode node)
Check if a null evaluated expression is protected by a ternary expression.
|
protected void |
operatorError(JexlNode node,
JexlOperator operator,
Throwable cause)
Triggered when an operator fails.
|
protected Object |
resolveNamespace(String prefix,
JexlNode node)
Resolves a namespace, eventually allocating an instance using context as constructor argument.
|
void |
setAttribute(Object object,
Object attribute,
Object value)
Sets an attribute of an object.
|
protected void |
setAttribute(Object object,
Object attribute,
Object value,
JexlNode node)
Sets an attribute of an object.
|
protected Object |
unsolvableMethod(JexlNode node,
String method)
Triggered when a method can not be resolved.
|
protected Object |
unsolvableProperty(JexlNode node,
String var,
Throwable cause)
Triggered when a property can not be resolved.
|
protected Object |
unsolvableVariable(JexlNode node,
String var,
boolean undef)
Triggered when a variable can not be resolved.
|
protected Object |
visit(ASTAddNode node,
Object data) |
protected Object |
visit(ASTAndNode node,
Object data) |
protected Object[] |
visit(ASTArguments node,
Object data) |
protected Object |
visit(ASTArrayAccess node,
Object data) |
protected Object |
visit(ASTArrayLiteral node,
Object data) |
protected Object |
visit(ASTAssignment node,
Object data) |
protected Object |
visit(ASTBitwiseAndNode node,
Object data) |
protected Object |
visit(ASTBitwiseComplNode node,
Object data) |
protected Object |
visit(ASTBitwiseOrNode node,
Object data) |
protected Object |
visit(ASTBitwiseXorNode node,
Object data) |
protected Object |
visit(ASTBlock node,
Object data) |
protected Object |
visit(ASTBreak node,
Object data) |
protected Object |
visit(ASTConstructorNode node,
Object data) |
protected Object |
visit(ASTContinue node,
Object data) |
protected Object |
visit(ASTDivNode node,
Object data) |
protected Object |
visit(ASTEmptyFunction node,
Object data) |
protected Object |
visit(ASTEmptyMethod node,
Object data) |
protected Object |
visit(ASTEQNode node,
Object data) |
protected Object |
visit(ASTERNode node,
Object data) |
protected Object |
visit(ASTEWNode node,
Object data) |
protected Object |
visit(ASTExtendedLiteral node,
Object data) |
protected Object |
visit(ASTFalseNode node,
Object data) |
protected Object |
visit(ASTForeachStatement node,
Object data) |
protected Object |
visit(ASTFunctionNode node,
Object data) |
protected Object |
visit(ASTGENode node,
Object data) |
protected Object |
visit(ASTGTNode node,
Object data) |
protected Object |
visit(ASTIdentifierAccess node,
Object data) |
protected Object |
visit(ASTIdentifier node,
Object data) |
protected Object |
visit(ASTIfStatement node,
Object data) |
protected Object |
visit(ASTJexlScript node,
Object data) |
protected Object |
visit(ASTJxltLiteral node,
Object data) |
protected Object |
visit(ASTLENode node,
Object data) |
protected Object |
visit(ASTLTNode node,
Object data) |
protected Object |
visit(ASTMapEntry node,
Object data) |
protected Object |
visit(ASTMapLiteral node,
Object data) |
protected Object |
visit(ASTMethodNode node,
Object data) |
protected Object |
visit(ASTModNode node,
Object data) |
protected Object |
visit(ASTMulNode node,
Object data) |
protected Object |
visit(ASTNENode node,
Object data) |
protected Object |
visit(ASTNEWNode node,
Object data) |
protected Object |
visit(ASTNotNode node,
Object data) |
protected Object |
visit(ASTNRNode node,
Object data) |
protected Object |
visit(ASTNSWNode node,
Object data) |
protected Object |
visit(ASTNullLiteral node,
Object data) |
protected Object |
visit(ASTNumberLiteral node,
Object data) |
protected Object |
visit(ASTOrNode node,
Object data) |
protected Object |
visit(ASTRangeNode node,
Object data) |
protected Object |
visit(ASTReferenceExpression node,
Object data) |
protected Object |
visit(ASTReference node,
Object data) |
protected Object |
visit(ASTReturnStatement node,
Object data) |
protected Object |
visit(ASTSetAddNode node,
Object data) |
protected Object |
visit(ASTSetAndNode node,
Object data) |
protected Object |
visit(ASTSetDivNode node,
Object data) |
protected Object |
visit(ASTSetLiteral node,
Object data) |
protected Object |
visit(ASTSetModNode node,
Object data) |
protected Object |
visit(ASTSetMultNode node,
Object data) |
protected Object |
visit(ASTSetOrNode node,
Object data) |
protected Object |
visit(ASTSetSubNode node,
Object data) |
protected Object |
visit(ASTSetXorNode node,
Object data) |
protected Object |
visit(ASTSizeFunction node,
Object data) |
protected Object |
visit(ASTSizeMethod node,
Object data) |
protected Object |
visit(ASTStringLiteral node,
Object data) |
protected Object |
visit(ASTSubNode node,
Object data) |
protected Object |
visit(ASTSWNode node,
Object data) |
protected Object |
visit(ASTTernaryNode node,
Object data) |
protected Object |
visit(ASTTrueNode node,
Object data) |
protected Object |
visit(ASTUnaryMinusNode node,
Object data) |
protected Object |
visit(ASTVar node,
Object data) |
protected Object |
visit(ASTWhileStatement node,
Object data) |
visit, visit
protected final Engine jexl
protected final org.apache.commons.logging.Log logger
protected final JexlUberspect uberspect
protected final JexlArithmetic arithmetic
protected final Operators operators
protected final JexlContext context
protected final JexlContext.NamespaceResolver ns
protected boolean strictEngine
protected final boolean strictArithmetic
protected final boolean silent
protected final boolean cache
protected final Scope.Frame frame
protected volatile boolean cancelled
protected static final Object[] EMPTY_PARAMS
protected Interpreter(Engine engine, JexlContext aContext, Scope.Frame eFrame)
engine
- the engine creating this interpreteraContext
- the context to evaluate expressioneFrame
- the interpreter evaluation framepublic Object interpret(JexlNode node)
If the underlying JEXL engine is silent, errors will be logged through its logger as warning.
node
- the script or expression to interpret.JexlException
- if any error occurs during interpretation.protected JexlNode findNullOperand(RuntimeException xrt, JexlNode node, Object left, Object right)
xrt
- the RuntimeExceptionnode
- the parent nodeleft
- the left argumentright
- the right argumentprotected Object unsolvableVariable(JexlNode node, String var, boolean undef)
node
- the node where the error originated fromvar
- the variable nameundef
- whether the variable is undefined or nullprotected Object unsolvableMethod(JexlNode node, String method)
node
- the node where the error originated frommethod
- the method nameprotected Object unsolvableProperty(JexlNode node, String var, Throwable cause)
node
- the node where the error originated fromvar
- the property namecause
- the cause if anyprotected void operatorError(JexlNode node, JexlOperator operator, Throwable cause)
node
- the node where the error originated fromoperator
- the method namecause
- the cause of error (if any)JexlException
- if isStrictprotected Object invocationFailed(JexlException xjexl)
xjexl
- the JexlException wrapping the original errorprotected boolean isCancelled()
protected Object resolveNamespace(String prefix, JexlNode node)
The lifetime of such instances span the current expression or script evaluation.
prefix
- the prefix name (may be null for global namespace)node
- the AST nodeprotected Object visit(ASTAddNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSubNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTMulNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTDivNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTModNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTBitwiseAndNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTBitwiseOrNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTBitwiseXorNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTEQNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTNENode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTGENode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTGTNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTLENode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTLTNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSWNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTNSWNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTEWNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTNEWNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTERNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTNRNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTRangeNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTUnaryMinusNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTBitwiseComplNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTNotNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTIfStatement node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTBlock node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTReturnStatement node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTContinue node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTBreak node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTForeachStatement node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTWhileStatement node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTAndNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTOrNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTNullLiteral node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTTrueNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTFalseNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTNumberLiteral node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTStringLiteral node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTArrayLiteral node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTExtendedLiteral node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSetLiteral node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTMapLiteral node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTMapEntry node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTTernaryNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSizeFunction node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSizeMethod node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTEmptyFunction node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTEmptyMethod node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTJexlScript node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTVar node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTReferenceExpression node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTIdentifier node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTArrayAccess node, Object data)
visit
in class ParserVisitor
protected boolean isTernaryProtected(JexlNode node)
The rationale is that the ternary / elvis expressions are meant for the user to explictly take control over the error generation; ie, ternaries can return null even if the engine in isStrict mode would normally throw an exception.
node
- the expression nodeprotected boolean isLocalVariable(ASTReference node, int which)
node
- the reference nodewhich
- the child we are checkingprotected Object visit(ASTIdentifierAccess node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTReference node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTAssignment node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSetAddNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSetSubNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSetMultNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSetDivNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSetModNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSetAndNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSetOrNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTSetXorNode node, Object data)
visit
in class ParserVisitor
protected Object executeAssign(JexlNode node, JexlOperator assignop, Object data)
node
- the nodeassignop
- the assignment operator or null if simply assignmentdata
- the dataprotected Object[] visit(ASTArguments node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTMethodNode node, Object data)
visit
in class ParserVisitor
protected Object visit(ASTFunctionNode node, Object data)
visit
in class ParserVisitor
protected Object call(JexlNode node, Object target, Object functor, ASTArguments argNode)
Method resolution is a follows: 1 - attempt to find a method in the target passed as parameter; 2 - if this fails, seeks a JexlScript or JexlMethod or a duck-callable* as a property of that target; 3 - if this fails, narrow the arguments and try again 1 4 - if this fails, seeks a context or arithmetic method with the proper name taking the target as first argument;
*duck-callable: an object where a "call" function existsnode
- the method nodetarget
- the target of the method, what it should be invoked uponfunctor
- the object carrying the method or function or the method identifierargNode
- the node carrying the argumentsprotected Object visit(ASTConstructorNode node, Object data)
visit
in class ParserVisitor
public Object getAttribute(Object object, Object attribute)
object
- to retrieve value fromattribute
- the attribute of the object, e.g. an index (1, 0, 2) or key for a mapprotected Object getAttribute(Object object, Object attribute, JexlNode node)
object
- to retrieve value fromattribute
- the attribute of the object, e.g. an index (1, 0, 2) or key for a mapnode
- the node that evaluated as the objectpublic void setAttribute(Object object, Object attribute, Object value)
object
- to set the value toattribute
- the attribute of the object, e.g. an index (1, 0, 2) or key for a mapvalue
- the value to assign to the object's attributeprotected void setAttribute(Object object, Object attribute, Object value, JexlNode node)
object
- to set the value toattribute
- the attribute of the object, e.g. an index (1, 0, 2) or key for a mapvalue
- the value to assign to the object's attributenode
- the node that evaluated as the objectprotected Object visit(ASTJxltLiteral node, Object data)
visit
in class ParserVisitor
Copyright © 2001–2015 The Apache Software Foundation. All rights reserved.