Author: adrianc
Date: Sun Dec 28 10:15:20 2008 New Revision: 729759 URL: http://svn.apache.org/viewvc?rev=729759&view=rev Log: Final work on Unified Expression Language integration. L-values can contain nested expressions. Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/FlexibleMapAccessor.java ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ContextAccessor.java Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/FlexibleMapAccessor.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/FlexibleMapAccessor.java?rev=729759&r1=729758&r2=729759&view=diff ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/FlexibleMapAccessor.java (original) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/FlexibleMapAccessor.java Sun Dec 28 10:15:20 2008 @@ -21,10 +21,12 @@ import java.io.Serializable; import java.util.Locale; import java.util.Map; +import javax.el.*; import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilGenerics; import org.ofbiz.base.util.cache.UtilCache; +import org.ofbiz.base.util.string.FlexibleStringExpander; import org.ofbiz.base.util.string.UelUtil; /** @@ -35,18 +37,19 @@ @SuppressWarnings("serial") public class FlexibleMapAccessor<T> implements Serializable { public static final String module = FlexibleMapAccessor.class.getName(); - protected static final String openBracket = "${"; - protected static final String closeBracket = "}"; protected static final UtilCache<String, FlexibleMapAccessor<?>> fmaCache = new UtilCache<String, FlexibleMapAccessor<?>>("flexibleMapAccessor.ExpressionCache"); @SuppressWarnings("unchecked") protected static final FlexibleMapAccessor nullFma = new FlexibleMapAccessor(null); protected final String original; - protected String bracketedOriginal; + protected final String bracketedOriginal; + protected final FlexibleStringExpander fse; protected boolean isAscending = true; protected FlexibleMapAccessor(String name) { this.original = name; + FlexibleStringExpander fse = null; + String bracketedOriginal = null; if (name != null && name.length() > 0) { if (name.charAt(0) == '-') { this.isAscending = false; @@ -55,8 +58,14 @@ this.isAscending = true; name = name.substring(1); } - this.bracketedOriginal = openBracket + UelUtil.prepareExpression(name) + closeBracket; + if (name.contains(FlexibleStringExpander.openBracket)) { + fse = FlexibleStringExpander.getInstance(UelUtil.prepareExpression(name)); + } else { + bracketedOriginal = FlexibleStringExpander.openBracket.concat(UelUtil.prepareExpression(name).concat(FlexibleStringExpander.closeBracket)); + } } + this.bracketedOriginal = bracketedOriginal; + this.fse = fse; if (Debug.verboseOn()) { Debug.logVerbose("FlexibleMapAccessor created, original = " + this.original, module); } @@ -122,12 +131,14 @@ } Object obj = null; try { - obj = UelUtil.evaluate(base, this.bracketedOriginal); - } catch (Exception e) { - // PropertyNotFound exceptions are common, so logging verbose + obj = UelUtil.evaluate(base, getExpression(base)); + } catch (PropertyNotFoundException e) { + // PropertyNotFound exceptions are common, so log verbose if (Debug.verboseOn()) { Debug.logVerbose("UEL exception while getting value: " + e + ", original = " + this.original, module); } + } catch (Exception e) { + Debug.logInfo("UEL exception while getting value: " + e + ", original = " + this.original, module); } return UtilGenerics.<T>cast(obj); } @@ -148,9 +159,9 @@ throw new IllegalArgumentException("Cannot put a value in a null base Map"); } try { - UelUtil.setValue(base, this.bracketedOriginal, value == null ? Object.class : value.getClass(), value); + UelUtil.setValue(base, getExpression(base), value == null ? Object.class : value.getClass(), value); } catch (Exception e) { - Debug.logInfo("UEL exception while setting value: " + e + ", original = " + this.original + ", value = " + value, module); + Debug.logInfo("UEL exception while setting value: " + e + ", original = " + this.original, module); } } @@ -168,13 +179,23 @@ } try { Map<String, Object> writableMap = UtilGenerics.cast(base); - UelUtil.removeValue(writableMap, this.bracketedOriginal); + UelUtil.removeValue(writableMap, getExpression(base)); } catch (Exception e) { Debug.logInfo("UEL exception while removing value: " + e + ", original = " + this.original, module); } return object; } + protected String getExpression(Map<String, ? extends Object> base) { + String expression = null; + if (this.fse != null) { + expression = FlexibleStringExpander.openBracket.concat(this.fse.expandString(base).concat(FlexibleStringExpander.closeBracket)); + } else { + expression = this.bracketedOriginal; + } + return expression; + } + public String toString() { if (this.isEmpty()) { return super.toString(); Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ContextAccessor.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ContextAccessor.java?rev=729759&r1=729758&r2=729759&view=diff ============================================================================== --- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ContextAccessor.java (original) +++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ContextAccessor.java Sun Dec 28 10:15:20 2008 @@ -32,8 +32,6 @@ protected String name; protected FlexibleMapAccessor<T> fma; - protected boolean needsExpand; - protected boolean empty; public ContextAccessor(String name) { init(name); @@ -49,34 +47,16 @@ protected void init(String name) { this.name = name; - if (name == null || name.length() == 0) { - empty = true; - needsExpand = false; - fma = FlexibleMapAccessor.getInstance(name); - } else { - empty = false; - int openPos = name.indexOf("${"); - if (openPos != -1 && name.indexOf("}", openPos) != -1) { - fma = null; - needsExpand = true; - } else { - fma = FlexibleMapAccessor.getInstance(name); - needsExpand = false; - } - } + this.fma = FlexibleMapAccessor.getInstance(name); } public boolean isEmpty() { - return this.empty; + return this.fma.isEmpty(); } /** Based on name get from Map or from List in Map */ public T get(MethodContext methodContext) { - if (this.needsExpand) { - return UtilGenerics.<T>cast(methodContext.getEnv(name)); - } else { - return UtilGenerics.<T>cast(methodContext.getEnv(fma)); - } + return UtilGenerics.<T>cast(methodContext.getEnv(fma)); } /** Based on name put in Map or from List in Map; @@ -86,30 +66,17 @@ * number the value will inserted/added at that point instead of set at the point. */ public void put(MethodContext methodContext, T value) { - if (this.needsExpand) { - methodContext.putEnv(name, value); - } else { - methodContext.putEnv(fma, value); - } + methodContext.putEnv(fma, value); } /** Based on name remove from Map or from List in Map */ public T remove(MethodContext methodContext) { - if (this.needsExpand) { - return UtilGenerics.<T>cast(methodContext.removeEnv(name)); - } else { - return UtilGenerics.<T>cast(methodContext.removeEnv(fma)); - } + return UtilGenerics.<T>cast(methodContext.removeEnv(fma)); } /** Based on name get from Map or from List in Map */ public T get(Map<String, ? extends Object> theMap, MethodContext methodContext) { - if (this.needsExpand) { - FlexibleMapAccessor<T> fma = FlexibleMapAccessor.getInstance(methodContext.expandString(name)); - return fma.get(theMap); - } else { - return fma.get(theMap); - } + return fma.get(theMap); } /** Based on name put in Map or from List in Map; @@ -119,22 +86,12 @@ * number the value will inserted/added at that point instead of set at the point. */ public void put(Map<String, Object> theMap, T value, MethodContext methodContext) { - if (this.needsExpand) { - FlexibleMapAccessor<T> fma = FlexibleMapAccessor.getInstance(methodContext.expandString(name)); - fma.put(theMap, value); - } else { - fma.put(theMap, value); - } + fma.put(theMap, value); } /** Based on name remove from Map or from List in Map */ public T remove(Map<String, ? extends Object> theMap, MethodContext methodContext) { - if (this.needsExpand) { - FlexibleMapAccessor<T> fma = FlexibleMapAccessor.getInstance(methodContext.expandString(name)); - return fma.remove(theMap); - } else { - return fma.remove(theMap); - } + return fma.remove(theMap); } /** The equals and hashCode methods are imnplemented just case this object is ever accidently used as a Map key */ @@ -145,7 +102,7 @@ /** The equals and hashCode methods are imnplemented just case this object is ever accidently used as a Map key */ public boolean equals(Object obj) { if (obj instanceof ContextAccessor) { - ContextAccessor contextAccessor = (ContextAccessor) obj; + ContextAccessor<?> contextAccessor = (ContextAccessor<?>) obj; if (this.name == null) { return contextAccessor.name == null; } |
Free forum by Nabble | Edit this page |