package org.mvel2.tests.core; import junit.framework.TestCase; import org.mvel2.MVEL; import org.mvel2.ParserContext; import org.mvel2.integration.impl.MapVariableResolverFactory; import org.mvel2.util.SharedVariableSpaceModel; import org.mvel2.util.SimpleVariableSpaceModel; import org.mvel2.util.VariableSpaceCompiler; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** * @author Mike Brock . */ public class IndexedVariablesTests extends TestCase { public void testVariableInjection1() { 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 < 5000; i++) { foo++; }; foo;"; ParserContext ctx = ParserContext.create(); ctx.addIndexedInput(varNames); ctx.setIndexAllocation(true); SharedVariableSpaceModel model = VariableSpaceCompiler.compileShared(expr, ctx, values); 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())); // // for (int x = 0; x < 10; x++) { // long tm = System.currentTimeMillis(); // for (int i = 0; i < 10000; i++) { // MVEL.executeExpression(indexCompile, model.createFactory()); // } // tm = System.currentTimeMillis() - tm; // System.out.println("(StaticInjection (ms): " + tm + ")"); // // tm = System.currentTimeMillis(); // Map<String, Object> map = new HashMap<String, Object>(); // map.put("x", 10); // map.put("y", 20); // map.put("z", 30); // // MapVariableResolverFactory factory = new MapVariableResolverFactory(map); // for (int i = 0; i < 10000; i++) { // MVEL.executeExpression(dynamicCompile, factory); // } // tm = System.currentTimeMillis() - tm; // System.out.println("(MapInjection (ms): " + tm + ")"); // } } 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))); } public void testVariableInjection3() { String[] varNames = {"x", "y", "z"}; Object[] values = {10, 20, 30}; String expr = "def add(a,b) { a + b }; foo = -1; res = x + y + z;\n" + "if (x > 9) {\n" + " res = z - y - x;\n" + " int k = 5;\n" + " foo = add(5,10);" + "}; \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))); } }