/* Generated By:JJTree: Do not edit this line. ASTAtEvalEx.java Version 4.3 */ /* JavaCCOptions:MULTI=true,NODE_USES_PARSER=true,VISITOR=false,TRACK_TOKENS=false,NODE_PREFIX=AST,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ package org.openntf.formula.ast; import java.util.Set; import org.openntf.formula.EvaluateException; import org.openntf.formula.FormulaContext; import org.openntf.formula.FormulaParseException; import org.openntf.formula.FormulaReturnException; import org.openntf.formula.ValueHolder; import org.openntf.formula.ValueHolder.DataType; import org.openntf.formula.parse.AtFormulaParserImpl; /** * @author steinsiek * * Extension of @Eval to handle parameters. Example of use: * <p/> * F_FAK := "@if(n=0; 1; n*@EvalEx(F_FAK; n-1))" : "n"; @EvalEx(F_FAK; 80) */ public class ASTAtEvalEx extends SimpleNode { public ASTAtEvalEx(final AtFormulaParserImpl p, final int id) { super(p, id); } @Override public ValueHolder evaluate(final FormulaContext ctx) throws FormulaReturnException { ValueHolder[] oldVHs = null; ValueHolder vhEval = children[0].evaluate(ctx); if (vhEval.dataType == DataType.ERROR) return vhEval; if (vhEval.size != children.length) { IllegalArgumentException ia = new IllegalArgumentException("Wrong number of parameters: Expected " + (vhEval.size - 1) + ", got " + (children.length - 1)); return ValueHolder.valueOf(new EvaluateException(codeLine, codeColumn, ia)); } oldVHs = new ValueHolder[vhEval.size - 1]; for (int i = 1; i < vhEval.size; i++) oldVHs[i - 1] = ctx.setVarLC(vhEval.getString(i).toLowerCase(), children[i].evaluate(ctx)); try { Node n = (Node) ctx.getParser().parse(vhEval.getString(0)); return n.evaluate(ctx); } catch (FormulaParseException e) { return ValueHolder.valueOf(new EvaluateException(codeLine, codeColumn, e)); } finally { if (oldVHs != null) for (int i = 1; i < vhEval.size; i++) ctx.setVarLC(vhEval.getString(i).toLowerCase(), oldVHs[i - 1]); } } @Override protected void analyzeThis(final Set<String> readFields, final Set<String> modifiedFields, final Set<String> variables, final Set<String> functions) { functions.add("@evalex"); } } /* JavaCC - OriginalChecksum=4422466a21b7e75ad1c114b91cc29745 (do not edit this line) */