/* * Copyright (c) 2001-2017, Inversoft Inc., All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific * language governing permissions and limitations under the License. */ package org.primeframework.mvc.parameter.el; import java.time.Duration; import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import org.apache.commons.lang3.ArrayUtils; import org.example.action.ExtensionInheritance; import org.example.domain.Action; import org.example.domain.ActionField; import org.example.domain.Address; import org.example.domain.AddressField; import org.example.domain.Covariant; import org.example.domain.GenericBean; import org.example.domain.NestedDataUnwrappedAction; import org.example.domain.User; import org.example.domain.UserField; import org.primeframework.mvc.PrimeBaseTest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.Test; import com.google.inject.Inject; import static java.util.Arrays.asList; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; /** * Tests the expression evaluator. * * @author Brian Pontarelli */ public class DefaultExpressionEvaluatorTest extends PrimeBaseTest { private static final Logger logger = LoggerFactory.getLogger(DefaultExpressionEvaluatorTest.class); DefaultExpressionEvaluator evaluator; @Test public void charArrayCachePerformance() { // On a MacBook Pro Quad core the cache is slower by 5 milliseconds for 1 million iterations. String expression = "user.address['work'].city"; Instant start = Instant.now(); char c = 0; for (int i = 0; i < 1_000_000; i++) { char[] ca = expression.toCharArray(); c = ca[2]; } logger.info(Character.toString(c)); logger.info("Time for toCharArray: " + Math.abs(Duration.between(Instant.now(), start).toMillis())); start = Instant.now(); c = 0; // for (int i = 0; i < 1_000_000; i++) { // This method has been removed because it was slow // char[] ca = evaluator.toCharArray(expression); // c = ca[2]; // } logger.info(Character.toString(c)); logger.info("Time for cache: " + Math.abs(Duration.between(Instant.now(), start).toMillis())); } @Test public void covariantTypes() { Covariant bean = new Covariant(); bean.value = "value"; bean.override = "base"; assertEquals(evaluator.getValue("abstract", bean), "value"); assertEquals(evaluator.getValue("override", bean), "value"); evaluator.setValue("abstractNesting.name", bean, "Brian Pontarelli"); assertEquals(bean.user.getName(), "Brian Pontarelli"); assertEquals(evaluator.getValue("abstractNesting.name", bean), "Brian Pontarelli"); evaluator.setValue("interface.name", bean, "Brian Pontarelli"); assertEquals(evaluator.getValue("interface.name", bean), "Brian Pontarelli"); } @Test public void expansion() { // Test nested property set and type conversion ActionField action = new ActionField(); action.user = new UserField(); action.user.name = "Fred"; String result = evaluator.expand("My name is ${user.name}", action, false); assertEquals(result, "My name is Fred"); // Test nested property set action.user.name = "/Fred"; result = evaluator.expand("My name is ${user.name}", action, true); assertEquals(result, "My name is %2FFred"); // Test type conversion action.user.age = 35; result = evaluator.expand("My age is ${user.age}", action, true); assertEquals(result, "My age is 35"); } @Test public void fieldGetting() { // Test local property null ActionField action = new ActionField(); assertNull(evaluator.getValue("user", action)); // Test local property get UserField user = new UserField(); action.user = user; assertSame(user, evaluator.getValue("user", action)); // Test nested property get action.user.age = 32; action.user.name = "Brian"; action.user.active = true; assertEquals(evaluator.getValue("user.age", action), (Integer) 32); assertEquals(evaluator.getValue("user.name", action), "Brian"); assertTrue(evaluator.getValue("user.active", action)); // Test collection property gets AddressField address = new AddressField(); address.city = "Broomfield"; address.state = "CO"; address.street = "Test"; address.zipcode = "80020"; action.user.addresses.put("home", address); assertNull(evaluator.getValue("user.addresses['work']", action)); assertEquals(evaluator.getValue("user.addresses['home'].city", action), "Broomfield"); assertEquals(evaluator.getValue("user.addresses['home'].state", action), "CO"); assertEquals(evaluator.getValue("user.addresses['home'].street", action), "Test"); assertEquals(evaluator.getValue("user.addresses['home'].zipcode", action), "80020"); UserField brother = new UserField(); brother.name = "Brett"; brother.age = 34; user.siblings.add(brother); assertEquals(evaluator.getValue("user.siblings[0].age", action), (Integer) 34); assertEquals(evaluator.getValue("user.siblings[0].name", action), "Brett"); user.securityQuestions = new String[]{"What is your pet's name?", "What is your home town?"}; assertEquals(evaluator.getValue("user.securityQuestions[0]", action), "What is your pet's name?"); assertEquals(evaluator.getValue("user.securityQuestions[1]", action), "What is your home town?"); } @Test public void fieldInheritance() { ExtensionInheritance action = new ExtensionInheritance(); // Manually set the field and then retrieve it from the base class action.baseField = "bar"; assertEquals(evaluator.getValue("baseField", action), "bar"); // Set value in the base class and retrieve it. evaluator.setValue("baseField", action, ArrayUtils.toArray("baz"), null); assertEquals(evaluator.getValue("baseField", action), "baz"); } /** * Tests getting of fields */ @Test public void fieldSetting() { // Test nested property set and type conversion ActionField action = new ActionField(); evaluator.setValue("user.age", action, ArrayUtils.toArray("32"), null); evaluator.setValue("user.name", action, ArrayUtils.toArray("Brian"), null); evaluator.setValue("user.active", action, ArrayUtils.toArray("true"), null); assertEquals(action.user.age, (Integer) 32); assertEquals(action.user.name, "Brian"); assertTrue(action.user.active); // Test collection property sets action.user.addresses = null; evaluator.setValue("user.addresses['home'].city", action, ArrayUtils.toArray("Broomfield"), null); evaluator.setValue("user.addresses['home'].state", action, ArrayUtils.toArray("CO"), null); evaluator.setValue("user.addresses['home'].street", action, ArrayUtils.toArray("Test"), null); evaluator.setValue("user.addresses['home'].zipcode", action, ArrayUtils.toArray("80020"), null); assertEquals(action.user.addresses.size(), 1); assertNull(action.user.addresses.get("work")); assertEquals(action.user.addresses.get("home").city, "Broomfield"); assertEquals(action.user.addresses.get("home").state, "CO"); assertEquals(action.user.addresses.get("home").street, "Test"); assertEquals(action.user.addresses.get("home").zipcode, "80020"); evaluator.setValue("user.siblings[0].age", action, ArrayUtils.toArray("34"), null); evaluator.setValue("user.siblings[0].name", action, ArrayUtils.toArray("Brett"), null); assertEquals(action.user.siblings.size(), 1); assertEquals(action.user.siblings.get(0).age, (Integer) 34); assertEquals(action.user.siblings.get(0).name, "Brett"); evaluator.setValue("user.securityQuestions[0]", action, ArrayUtils.toArray("What is your pet's name?"), null); evaluator.setValue("user.securityQuestions[1]", action, ArrayUtils.toArray("What is your home town?"), null); assertEquals(action.user.securityQuestions.length, 2); assertEquals(action.user.securityQuestions[0], "What is your pet's name?"); assertEquals(action.user.securityQuestions[1], "What is your home town?"); action.user.securityQuestions = null; evaluator.setValue("user.securityQuestions", action, new String[]{"What is your pet's name?", "What is your home town?"}, null); assertEquals(action.user.securityQuestions.length, 2); assertEquals(action.user.securityQuestions[0], "What is your pet's name?"); assertEquals(action.user.securityQuestions[1], "What is your home town?"); } /** * Tests setting a collection with a single value onto a plain field. */ @Test public void fieldSettingWithCollectionSingleValue() { // Test nested property set and type conversion ActionField action = new ActionField(); evaluator.setValue("user.name", action, asList("Brian")); evaluator.setValue("user.active", action, ArrayUtils.toArray("true"), null); assertEquals(action.user.name, "Brian"); } @Test public void genericInheritanceImplements() { GenericBean bean = new GenericBean(); evaluator.setValue("mapSubclass['foo']", bean, "value"); assertEquals(bean.mapSubclass.get("foo"), "value"); evaluator.setValue("mapSubclass['foo']", bean, new String[]{"value"}, Collections.emptyMap()); assertEquals(bean.mapSubclass.get("foo"), "value"); evaluator.setValue("mapImplements['foo']", bean, "value"); assertEquals(bean.mapImplements.get("foo"), "value"); evaluator.setValue("mapImplements['foo']", bean, new String[]{"value"}, Collections.emptyMap()); assertEquals(bean.mapImplements.get("foo"), "value"); } @Test public void nonStringKeyForMap() { Action action = new Action(); action.setUser(null); evaluator.setValue("user.ids[0]", action, new String[]{"0"}, null); assertEquals(action.getUser().getIds().get(0).intValue(), 0); ActionField actionField = new ActionField(); actionField.user = null; evaluator.setValue("user.ids[0]", actionField, new String[]{"0"}, null); assertEquals(actionField.user.ids.get(0).intValue(), 0); } @Test(enabled = false) public void performance() throws InterruptedException { // Set cases Object action = new ActionField(); long start = System.currentTimeMillis(); evaluator.setValue("user.age", action, ArrayUtils.toArray("32"), null); long end = System.currentTimeMillis(); System.out.println("Setting field time was " + (end - start)); start = System.currentTimeMillis(); evaluator.setValue("user.addresses['home'].zipcode", action, ArrayUtils.toArray("80020"), null); end = System.currentTimeMillis(); System.out.println("Setting field time was " + (end - start)); action = new Action(); start = System.currentTimeMillis(); evaluator.setValue("user.age", action, ArrayUtils.toArray("32"), null); end = System.currentTimeMillis(); System.out.println("Setting property time was " + (end - start)); start = System.currentTimeMillis(); evaluator.setValue("user.addresses['home'].zipcode", action, ArrayUtils.toArray("80020"), null); end = System.currentTimeMillis(); System.out.println("Setting proeprty time was " + (end - start)); // Get cases action = new ActionField(); ((ActionField) action).user = new UserField(); ((ActionField) action).user.age = 10; start = System.currentTimeMillis(); evaluator.getValue("user.age", action); end = System.currentTimeMillis(); System.out.println("Getting field time was " + (end - start)); ((ActionField) action).user = new UserField(); ((ActionField) action).user.addresses.put("home", new AddressField()); ((ActionField) action).user.addresses.get("home").zipcode = "80020"; start = System.currentTimeMillis(); evaluator.getValue("user.addresses['home'].zipcode", action); end = System.currentTimeMillis(); System.out.println("Getting field time was " + (end - start)); action = new Action(); ((Action) action).setUser(new User()); ((Action) action).getUser().setAge(10); start = System.currentTimeMillis(); evaluator.getValue("user.age", action); end = System.currentTimeMillis(); System.out.println("Getting property time was " + (end - start)); ((Action) action).setUser(new User()); ((Action) action).getUser().getAddresses().put("home", new Address()); ((Action) action).getUser().getAddresses().get("home").setZipcode("80020"); start = System.currentTimeMillis(); evaluator.getValue("user.addresses['home'].zipcode", action); end = System.currentTimeMillis(); System.out.println("Getting property time was " + (end - start)); // Loop action = new ActionField(); ((ActionField) action).user = new UserField(); ((ActionField) action).user.addresses.put("home", new AddressField()); ((ActionField) action).user.addresses.get("home").zipcode = "80020"; start = System.currentTimeMillis(); for (int i = 0; i < 50; i++) { evaluator.getValue("user.addresses['home'].zipcode", action); } end = System.currentTimeMillis(); System.out.println("50 times was " + (end - start)); JCThread[] threads = new JCThread[50]; for (int i = 0; i < 50; i++) { threads[i] = new JCThread(); threads[i].setName("" + i); threads[i].start(); } for (int i = 0; i < 50; i++) { threads[i].join(); } } @Test public void propertyGetting() { // Test local property null Action action = new Action(); assertNull(evaluator.getValue("user", action)); // Test local property get User user = new User(); action.setUser(user); assertSame(user, evaluator.getValue("user", action)); // Test nested property get action.getUser().setAge(32); action.getUser().setName("Brian"); action.getUser().setActive(true); assertEquals(evaluator.getValue("user.age", action), (Integer) 32); assertEquals(evaluator.getValue("user.name", action), "Brian"); assertTrue(evaluator.getValue("user.active", action)); // Test collection property gets Address address = new Address(); address.setCity("Broomfield"); address.setState("CO"); address.setStreet("Test"); address.setZipcode("80020"); action.getUser().getAddresses().put("home", address); assertNull(evaluator.getValue("user.addresses['work']", action)); assertEquals(evaluator.getValue("user.addresses['home'].city", action), "Broomfield"); assertEquals(evaluator.getValue("user.addresses['home'].state", action), "CO"); assertEquals(evaluator.getValue("user.addresses['home'].street", action), "Test"); assertEquals(evaluator.getValue("user.addresses['home'].zipcode", action), "80020"); User brother = new User(); brother.setName("Brett"); brother.setAge(34); user.getSiblings().add(brother); assertEquals(evaluator.getValue("user.siblings[0].age", action), (Integer) 34); assertEquals(evaluator.getValue("user.siblings[0].name", action), "Brett"); user.setSecurityQuestions("What is your pet's name?", "What is your home town?"); assertEquals(evaluator.getValue("user.securityQuestions[0]", action), "What is your pet's name?"); assertEquals(evaluator.getValue("user.securityQuestions[1]", action), "What is your home town?"); // Test indexed collection property gets (using the indexed property methoods) assertNull(evaluator.getValue("user.address['work']", action)); assertEquals(evaluator.getValue("user.address['home'].city", action), "Broomfield"); assertEquals(evaluator.getValue("user.address['home'].state", action), "CO"); assertEquals(evaluator.getValue("user.address['home'].street", action), "Test"); assertEquals(evaluator.getValue("user.address['home'].zipcode", action), "80020"); assertEquals(evaluator.getValue("user.sibling[0].age", action), (Integer) 34); assertEquals(evaluator.getValue("user.sibling[0].name", action), "Brett"); } @Test public void propertyGettingAndSettingInUnwrappedField() { NestedDataUnwrappedAction action = new NestedDataUnwrappedAction(); // Manually set values and retrieve them action.bean1.data1.bar = "bing"; action.bean1.data1.baz = "boom"; assertEquals(evaluator.getValue("bean1.bar", action), "bing"); assertEquals(evaluator.getValue("bean1.baz", action), "boom"); // Set values using the evaluator and retrieve them. evaluator.setValue("bean1.bar", action, ArrayUtils.toArray("bada-bing"), null); evaluator.setValue("bean1.baz", action, ArrayUtils.toArray("bada-boom"), null); assertEquals(evaluator.getValue("bean1.bar", action), "bada-bing"); assertEquals(evaluator.getValue("bean1.baz", action), "bada-boom"); // Retrieve initial values of null fields assertNull(evaluator.getValue("bean2.user", action)); assertNull(evaluator.getValue("bean2.user.name", action)); assertNull(evaluator.getValue("bean2.bar", action)); assertNull(evaluator.getValue("bean2.baz", action)); // Set values of null fields and retrieve them evaluator.setValue("bean2.user.name", action, ArrayUtils.toArray("Art Vandelay"), null); evaluator.setValue("bean2.bar", action, ArrayUtils.toArray("bing"), null); evaluator.setValue("bean2.baz", action, ArrayUtils.toArray("boom"), null); assertEquals(evaluator.getValue("bean2.user.name", action), "Art Vandelay"); assertEquals(evaluator.getValue("bean2.bar", action), "bing"); assertEquals(evaluator.getValue("bean2.baz", action), "boom"); } /** * /** * Tests setting of bean properties */ @Test public void propertySetting() { // Test nested property set and type conversion Action action = new Action(); action.setUser(null); evaluator.setValue("user.age", action, ArrayUtils.toArray("32"), null); evaluator.setValue("user.name", action, ArrayUtils.toArray("Brian"), null); evaluator.setValue("user.active", action, ArrayUtils.toArray("true"), null); evaluator.setValue("user.male", action, null, null); assertEquals(action.getUser().getAge(), (Integer) 32); assertEquals(action.getUser().getName(), "Brian"); assertTrue(action.getUser().isActive()); assertFalse(action.getUser().isMale()); // Test collection property sets action.getUser().setAddresses(null); evaluator.setValue("user.addresses['home'].city", action, ArrayUtils.toArray("Broomfield"), null); evaluator.setValue("user.addresses['home'].state", action, ArrayUtils.toArray("CO"), null); evaluator.setValue("user.addresses['home'].street", action, ArrayUtils.toArray("Test"), null); evaluator.setValue("user.addresses['home'].zipcode", action, ArrayUtils.toArray("80020"), null); assertEquals(action.getUser().getAddresses().size(), 1); assertNull(action.getUser().getAddresses().get("work")); assertEquals(action.getUser().getAddresses().get("home").getCity(), "Broomfield"); assertEquals(action.getUser().getAddresses().get("home").getState(), "CO"); assertEquals(action.getUser().getAddresses().get("home").getStreet(), "Test"); assertEquals(action.getUser().getAddresses().get("home").getZipcode(), "80020"); // Test collection property sets with flat names (i.e. JSON conversions) action.getUser().setAddresses(null); evaluator.setValue("user.addresses.home.city", action, ArrayUtils.toArray("Broomfield"), null); evaluator.setValue("user.addresses.home.state", action, ArrayUtils.toArray("CO"), null); evaluator.setValue("user.addresses.home.street", action, ArrayUtils.toArray("Test"), null); evaluator.setValue("user.addresses.home.zipcode", action, ArrayUtils.toArray("80020"), null); assertEquals(action.getUser().getAddresses().size(), 1); assertNull(action.getUser().getAddresses().get("work")); assertEquals(action.getUser().getAddresses().get("home").getCity(), "Broomfield"); assertEquals(action.getUser().getAddresses().get("home").getState(), "CO"); assertEquals(action.getUser().getAddresses().get("home").getStreet(), "Test"); assertEquals(action.getUser().getAddresses().get("home").getZipcode(), "80020"); // Test empty is null evaluator.setValue("user.addresses['home'].zipcode", action, ArrayUtils.toArray(""), null); assertNull(action.getUser().getAddresses().get("home").getZipcode()); action.getUser().setSiblings(null); evaluator.setValue("user.siblings[0].age", action, ArrayUtils.toArray("34"), null); evaluator.setValue("user.siblings[0].name", action, ArrayUtils.toArray("Brett"), null); assertTrue(action.getUser().getSiblings() instanceof ArrayList); assertEquals(action.getUser().getSiblings().size(), 1); assertEquals(action.getUser().getSiblings().get(0).getAge(), (Integer) 34); assertEquals(action.getUser().getSiblings().get(0).getName(), "Brett"); evaluator.setValue("user.securityQuestions[0]", action, ArrayUtils.toArray("What is your pet's name?"), null); evaluator.setValue("user.securityQuestions[1]", action, ArrayUtils.toArray("What is your home town?"), null); assertEquals(action.getUser().getSecurityQuestions().length, 2); assertEquals(action.getUser().getSecurityQuestions()[0], "What is your pet's name?"); assertEquals(action.getUser().getSecurityQuestions()[1], "What is your home town?"); action.getUser().setSecurityQuestions(); evaluator.setValue("user.securityQuestions", action, new String[]{"What is your pet's name?", "What is your home town?"}, null); assertEquals(action.getUser().getSecurityQuestions()[0], "What is your pet's name?"); assertEquals(action.getUser().getSecurityQuestions()[1], "What is your home town?"); // Test indexed collection property sets (using the indexed property methoods) action.getUser().setAddresses(new HashMap<>()); evaluator.setValue("user.address['home'].city", action, ArrayUtils.toArray("Broomfield"), null); evaluator.setValue("user.address['home'].state", action, ArrayUtils.toArray("CO"), null); evaluator.setValue("user.address['home'].street", action, ArrayUtils.toArray("Test"), null); evaluator.setValue("user.address['home'].zipcode", action, ArrayUtils.toArray("80020"), null); assertEquals(action.getUser().getAddresses().size(), 1); assertNull(action.getUser().getAddresses().get("work")); assertEquals(action.getUser().getAddresses().get("home").getCity(), "Broomfield"); assertEquals(action.getUser().getAddresses().get("home").getState(), "CO"); assertEquals(action.getUser().getAddresses().get("home").getStreet(), "Test"); assertEquals(action.getUser().getAddresses().get("home").getZipcode(), "80020"); action.getUser().setSiblings(new ArrayList<>()); evaluator.setValue("user.sibling[0].age", action, ArrayUtils.toArray("34"), null); evaluator.setValue("user.sibling[0].name", action, ArrayUtils.toArray("Brett"), null); assertEquals(action.getUser().getSiblings().size(), 1); assertEquals(action.getUser().getSiblings().get(0).getAge(), (Integer) 34); assertEquals(action.getUser().getSiblings().get(0).getName(), "Brett"); // Test arrays and complex maps evaluator.setValue("roleIds", action, ArrayUtils.toArray("1", "2", "3"), null); evaluator.setValue("choices['ids']", action, ArrayUtils.toArray("1", "2", "3"), null); assertEquals(action.getRoleIds().length, 3); assertEquals(action.getRoleIds()[0], 1); assertEquals(action.getRoleIds()[1], 2); assertEquals(action.getRoleIds()[2], 3); assertEquals(action.getChoices().get("ids").size(), 3); assertEquals((int) action.getChoices().get("ids").get(0), 1); assertEquals((int) action.getChoices().get("ids").get(1), 2); assertEquals((int) action.getChoices().get("ids").get(2), 3); // Test arrays inside maps evaluator.setValue("associations['ids']", action, ArrayUtils.toArray("1", "2", "3"), null); assertEquals(action.getAssociations().get("ids").length, 3); assertEquals((int) action.getAssociations().get("ids")[0], 1); assertEquals((int) action.getAssociations().get("ids")[1], 2); assertEquals((int) action.getAssociations().get("ids")[2], 3); } @Inject public void setEvaluator(DefaultExpressionEvaluator evaluator) { this.evaluator = evaluator; } // @Test // public void testMvel() throws InterruptedException { // // Set cases // // // Get cases // // // Get cases // // Object action = new ActionField(); // ((ActionField) action).user = new UserField(); // ((ActionField) action).user.age = 10; // long start = System.currentTimeMillis(); // MVEL.eval("user.age", action); // long end = System.currentTimeMillis(); // System.out.println("MVEL Getting field time was " + (end - start)); // // ((ActionField) action).user = new UserField(); // ((ActionField) action).user.addresses.put("home", new AddressField()); // ((ActionField) action).user.addresses.get("home").zipcode = "80020"; // start = System.currentTimeMillis(); // MVEL.eval("user.addresses['home'].zipcode", action); // end = System.currentTimeMillis(); // System.out.println("MVEL Getting field time was " + (end - start)); // // action = new Action(); // ((Action) action).setUser(new User()); // ((Action) action).getUser().setAge(10); // start = System.currentTimeMillis(); // MVEL.eval("user.age", action); // end = System.currentTimeMillis(); // System.out.println("MVEL Getting property time was " + (end - start)); // // ((Action) action).setUser(new User()); // ((Action) action).getUser().getAddresses().put("home", new Address()); // ((Action) action).getUser().getAddresses().get("home").setZipcode("80020"); // start = System.currentTimeMillis(); // MVEL.eval("user.addresses['home'].zipcode", action); // end = System.currentTimeMillis(); // System.out.println("MVEL Getting property time was " + (end - start)); // // // Loop // // action = new ActionField(); // ((ActionField) action).user = new UserField(); // ((ActionField) action).user.addresses.put("home", new AddressField()); // ((ActionField) action).user.addresses.get("home").zipcode = "80020"; // start = System.currentTimeMillis(); // for (int i = 0; i < 50; i++) { // MVEL.eval("user.addresses['home'].zipcode", action); // } // end = System.currentTimeMillis(); // System.out.println("MVEL 50 times was " + (end - start)); // // MVELThread[] threads = new MVELThread[50]; // for (int i = 0; i < 50; i++) { // threads[i] = new MVELThread(); // threads[i].setName("" + i); // threads[i].start(); // } // // for (int i = 0; i < 50; i++) { // threads[i].join(); // } // } public class JCThread extends Thread { @Override public void run() { Object action = new ActionField(); ((ActionField) action).user = new UserField(); ((ActionField) action).user.addresses.put("home", new AddressField()); ((ActionField) action).user.addresses.get("home").zipcode = "80020"; long start = System.currentTimeMillis(); for (int i = 0; i < 50000; i++) { evaluator.getValue("user.addresses['home'].zipcode", action); } long end = System.currentTimeMillis(); System.out.println("50000 times for " + this.getName() + " was " + (end - start) + " should be around 6500ms"); } } // public class MVELThread extends Thread { // @Override // public void run() { // // Object action = new ActionField(); // ((ActionField) action).user = new UserField(); // ((ActionField) action).user.addresses.put("home", new AddressField()); // ((ActionField) action).user.addresses.get("home").zipcode = "80020"; // long start = System.currentTimeMillis(); // for (int i = 0; i < 50000; i++) { // MVEL.eval("user.addresses['home'].zipcode", action); // } // long end = System.currentTimeMillis(); // System.out.println("MVEL 50000 times for " + this.getName() + " was " + (end - start)); // } // } }