public static SimpleVariableSpaceModel compile(String expr, ParserContext pCtx) { String[] varNames = pCtx.getIndexedVarNames(); ParserContext analysisContext = ParserContext.create(); analysisContext.setIndexAllocation(true); MVEL.analysisCompile(expr, analysisContext); Set<String> localNames = analysisContext.getVariables().keySet(); pCtx.addIndexedLocals(localNames); String[] locals = localNames.toArray(new String[localNames.size()]); String[] allVars = new String[varNames.length + locals.length]; System.arraycopy(varNames, 0, allVars, 0, varNames.length); System.arraycopy(locals, 0, allVars, varNames.length, locals.length); return new SimpleVariableSpaceModel(allVars); } }
public VariableResolverFactory createFactory() { Object[] vals = new Object[inputIdentifiers.length]; VariableResolverFactory factory = varModel.createFactory( vals ); DroolsVarFactory df = new DroolsVarFactory(); factory.setNextFactory( df ); return factory; }
public static SimpleVariableSpaceModel compile(String expr, ParserContext pCtx) { String[] varNames = pCtx.getIndexedVarNames(); ParserContext analysisContext = ParserContext.create(); analysisContext.setIndexAllocation(true); MVEL.analysisCompile(expr, analysisContext); Set<String> localNames = analysisContext.getVariables().keySet(); pCtx.addIndexedLocals(localNames); String[] locals = localNames.toArray(new String[localNames.size()]); String[] allVars = new String[varNames.length + locals.length]; System.arraycopy(varNames, 0, allVars, 0, varNames.length); System.arraycopy(locals, 0, allVars, varNames.length, locals.length); return new SimpleVariableSpaceModel(allVars); } }
public void testVariableInjection2() { String[] varNames = {"x", "y", "z"}; Object[] values = {10, 20, 30}; String expr = "foo = -1; res = x + y + z;\n" + "if (x > 9) {\n" + " res = z - y - x;\n" + " int k = 5;\n" + " foo = k;" + "}; \n" + "for (i = 0; i < 100000; i++) { foo++; }; foo;"; ParserContext ctx = ParserContext.create(); ctx.addIndexedInput(varNames); ctx.setIndexAllocation(true); SimpleVariableSpaceModel model = VariableSpaceCompiler.compile(expr, ctx); Serializable indexCompile = MVEL.compileExpression(expr, ctx); Serializable dynamicCompile = MVEL.compileExpression(expr, ParserContext.create()); Map<String, Object> map = new HashMap<String, Object>(); map.put("x", 10); map.put("y", 20); map.put("z", 30); assertEquals(MVEL.executeExpression(dynamicCompile, map), MVEL.executeExpression(indexCompile, model.createFactory(values))); }
System.arraycopy(locals, 0, allVars, varNames.length, locals.length); this.varModel = new SimpleVariableSpaceModel(allVars); this.allVarsLength = allVars.length;
MVEL.executeExpression(indexCompile, model.createFactory(values)));