svn commit: r904921 - in /ofbiz/trunk/framework/base/src/org/ofbiz/base: test/BaseUnitTests.java util/string/UelUtil.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r904921 - in /ofbiz/trunk/framework/base/src/org/ofbiz/base: test/BaseUnitTests.java util/string/UelUtil.java

adrianc
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) {}
             }
         }
     }