|
Author: adrianc
Date: Sun Jan 31 00:08:14 2010 New Revision: 904921 URL: http://svn.apache.org/viewvc?rev=904921&view=rev Log: Some changes to the UEL integration. While attempting to upgrade the JUEL library, some flaws in my original code were exposed. This commit fixes them. Also, I added some more unit tests. Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/test/BaseUnitTests.java ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/test/BaseUnitTests.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/test/BaseUnitTests.java?rev=904921&r1=904920&r2=904921&view=diff ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/test/BaseUnitTests.java (original) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/test/BaseUnitTests.java Sun Jan 31 00:08:14 2010 @@ -18,7 +18,9 @@ *******************************************************************************/ package org.ofbiz.base.test; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import junit.framework.TestCase; @@ -28,6 +30,7 @@ import org.ofbiz.base.util.UtilFormatOut; import org.ofbiz.base.util.UtilValidate; import org.ofbiz.base.util.string.FlexibleStringExpander; +import org.ofbiz.base.util.collections.FlexibleMapAccessor; public class BaseUnitTests extends TestCase { @@ -121,11 +124,30 @@ assertTrue("bsh: script", compare.equals(fse.expandString(testMap))); fse = FlexibleStringExpander.getInstance("${groovy:return \"Hello \" + var + \"!\";}"); assertTrue("groovy: script", compare.equals(fse.expandString(testMap))); - // It is assumed the UEL library will have its own unit tests, but we - // will do one UEL expression test to check the UEL integration. testMap.put("testMap", testMap); fse = FlexibleStringExpander.getInstance("Hello ${testMap.var}!"); - assertTrue("UEL integration", compare.equals(fse.expandString(testMap))); + assertTrue("UEL integration: Map", compare.equals(fse.expandString(testMap))); + List<String> testList = new ArrayList<String>(); + testList.add("World"); + testMap.put("testList", testList); + fse = FlexibleStringExpander.getInstance("Hello ${testList[0]}!"); + assertTrue("UEL integration: List", compare.equals(fse.expandString(testMap))); + } + + // These tests rely upon FlexibleStringExpander, so they + // should follow the FlexibleStringExpander tests. + public void testFlexibleMapAccessor() { + String compare = "Hello World!"; + Map<String, Object> testMap = new HashMap<String, Object>(); + FlexibleMapAccessor<String> fma = FlexibleMapAccessor.getInstance("parameters.var"); + fma.put(testMap, "World"); + FlexibleStringExpander fse = FlexibleStringExpander.getInstance("Hello ${parameters.var}!"); + assertTrue("UEL auto-vivify Map", compare.equals(fse.expandString(testMap))); + fma = FlexibleMapAccessor.getInstance("parameters.someList[+0]"); + fma.put(testMap, "World"); + fse = FlexibleStringExpander.getInstance("Hello ${parameters.someList[0]}!"); + assertTrue("UEL auto-vivify List " + fse.expandString(testMap), compare.equals(fse.expandString(testMap))); + } public void testDateTimeConverters() { Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java?rev=904921&r1=904920&r2=904921&view=diff ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java (original) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java Sun Jan 31 00:08:14 2010 @@ -120,9 +120,11 @@ } protected static class BasicContext extends ELContext { + protected final Map<String, Object> variables; protected final VariableMapper variableMapper; public BasicContext(Map<String, ? extends Object> context) { - this.variableMapper = new BasicVariableMapper(context, this); + this.variableMapper = new BasicVariableMapper(this); + this.variables = UtilGenerics.cast(context); } @Override public ELResolver getELResolver() { @@ -139,11 +141,9 @@ } protected static class BasicVariableMapper extends VariableMapper { - protected final ELContext elContext; - protected final Map<String, Object> variables; - protected BasicVariableMapper(Map<String, ? extends Object> context, ELContext parentContext) { - this.variables = UtilGenerics.cast(context); - this.elContext = parentContext; + protected final BasicContext elContext; + protected BasicVariableMapper(BasicContext elContext) { + this.elContext = elContext; } /** @@ -154,46 +154,109 @@ */ @Override public ValueExpression resolveVariable(String variable) { - Object obj = UelUtil.resolveVariable(variable, this.variables, null); + Object obj = UelUtil.resolveVariable(variable, this.elContext.variables, null); if (obj != null) { - return new BasicValueExpression(obj); + return new BasicValueExpression(variable, this.elContext); } return null; } @Override public ValueExpression setVariable(String variable, ValueExpression expression) { - return new BasicValueExpression(this.variables.put(variable, expression.getValue(this.elContext))); + Object originalObj = this.elContext.variables.put(variable, expression.getValue(this.elContext)); + if (originalObj == null) { + return null; + } + return new ReadOnlyExpression(originalObj); } } @SuppressWarnings("serial") - protected static class BasicValueExpression extends ValueExpression { - protected Object object; - public BasicValueExpression(Object object) { - super(); + protected static class ReadOnlyExpression extends ValueExpression { + protected final Object object; + protected ReadOnlyExpression(Object object) { this.object = object; } + + @Override + public Class<?> getExpectedType() { + return this.object.getClass(); + } + + @Override + public Class<?> getType(ELContext context) { + return this.getExpectedType(); + } + + @Override + public Object getValue(ELContext context) { + return this.object; + } + + @Override + public boolean isReadOnly(ELContext context) { + return true; + } + + @Override + public void setValue(ELContext context, Object value) { + throw new PropertyNotWritableException(); + } + @Override public boolean equals(Object obj) { if (this == obj) { return true; } try { - BasicValueExpression other = (BasicValueExpression) obj; - if (this.object == other.object) { - return true; - } + ReadOnlyExpression other = (ReadOnlyExpression) obj; return this.object.equals(other.object); - } catch (Exception e) {} + } catch (ClassCastException e) {} return false; } + + @Override + public String getExpressionString() { + return null; + } + @Override public int hashCode() { - return this.object == null ? 0 : this.object.hashCode(); + return this.object.hashCode(); + } + + @Override + public boolean isLiteralText() { + return false; + } + + } + + @SuppressWarnings("serial") + protected static class BasicValueExpression extends ValueExpression { + protected final BasicContext elContext; + protected final String varName; + public BasicValueExpression(String varName, BasicContext elContext) { + this.elContext = elContext; + this.varName = varName; + } + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + try { + BasicValueExpression other = (BasicValueExpression) obj; + return this.varName.equals(other.varName); + } catch (ClassCastException e) {} + return false; + } + @Override + public int hashCode() { + return this.varName.hashCode(); } @Override public Object getValue(ELContext context) { - return this.object; + return this.elContext.variables.get(this.varName); } @Override public String getExpressionString() { @@ -205,7 +268,7 @@ } @Override public Class<?> getType(ELContext context) { - return this.object == null ? null : this.object.getClass(); + return this.getExpectedType(); } @Override public boolean isReadOnly(ELContext context) { @@ -213,15 +276,16 @@ } @Override public void setValue(ELContext context, Object value) { - this.object = value; + this.elContext.variables.put(this.varName, value); } @Override public String toString() { - return "ValueExpression(" + this.object + ")"; + return "ValueExpression(" + this.varName + ")"; } @Override public Class<?> getExpectedType() { - return this.object == null ? null : this.object.getClass(); + Object obj = this.elContext.variables.get(this.varName); + return obj == null ? null : obj.getClass(); } } @@ -236,11 +300,11 @@ if (Debug.verboseOn()) { Debug.logVerbose("ExtendedCompositeResolver.setValue: base = " + base + ", property = " + property + ", value = " + val, module); } - ValueExpression ve = new BasicValueExpression(val); - VariableMapper vm = context.getVariableMapper(); - vm.setVariable(property.toString(), ve); - context.setPropertyResolved(true); - return; + try { + BasicContext elContext = (BasicContext) context; + elContext.variables.put(property.toString(), val); + context.setPropertyResolved(true); + } catch (ClassCastException e) {} } } } |
| Free forum by Nabble | Edit this page |
