Fixed, rev 724373. -Adrian
--- On Sun, 12/7/08, Hans Bakker <[EMAIL PROTECTED]> wrote: > From: Hans Bakker <[EMAIL PROTECTED]> > Subject: Re: svn commit: r724146 - in /ofbiz/trunk: ./ > applications/product/script/org/ofbiz/product/inventory/ framework/base/lib/ > framework/base/src/org/ofbiz/base/util/string/ > To: [email protected] > Date: Sunday, December 7, 2008, 7:34 PM > This commit causes the following error: > going to: > https://localhost3:8443/accounting/control/AdminMain?organizationPartyId=Company > > gives the error: > org.ofbiz.widget.screen.ScreenRenderException: Error > rendering screen > [component://common/widget/CommonScreens.xml#GlobalDecorator]: > javax.el.ELException: Error parsing > '${uiLabelMap.}': syntax error at > position 13, encountered '}', expected (Error > parsing '${uiLabelMap.}': > syntax error at position 13, encountered '}', > expected ) > > regards, > Hans > > On Sun, 2008-12-07 at 16:11 +0000, [EMAIL PROTECTED] > wrote: > > Author: adrianc > > Date: Sun Dec 7 08:11:44 2008 > > New Revision: 724146 > > > > URL: > http://svn.apache.org/viewvc?rev=724146&view=rev > > Log: > > Integrated the Unified Expression Language (JSR-245) > into the FlexibleStringExpander class. > > > > This commit also includes an example usage in > InventoryServices.xml. > > > > Added: > > ofbiz/trunk/framework/base/lib/juel-2.1.0.jar > (with props) > > > ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java > (with props) > > Modified: > > ofbiz/trunk/.classpath > > ofbiz/trunk/LICENSE > > > ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryServices.xml > > > ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java > > > > Modified: ofbiz/trunk/.classpath > > URL: > http://svn.apache.org/viewvc/ofbiz/trunk/.classpath?rev=724146&r1=724145&r2=724146&view=diff > > > ============================================================================== > > --- ofbiz/trunk/.classpath (original) > > +++ ofbiz/trunk/.classpath Sun Dec 7 08:11:44 2008 > > @@ -98,6 +98,7 @@ > > <classpathentry kind="lib" > path="framework/base/lib/log4j-1.2.15.jar"/> > > <classpathentry kind="lib" > path="framework/base/lib/junitperf.jar"/> > > <classpathentry kind="lib" > path="framework/base/lib/junit.jar"/> > > + <classpathentry kind="lib" > path="framework/base/lib/juel-2.1.0.jar"/> > > <classpathentry kind="lib" > path="framework/base/lib/jdbm-1.0.jar"/> > > <classpathentry kind="lib" > path="framework/base/lib/jakarta-regexp-1.5.jar"/> > > <classpathentry kind="lib" > path="framework/base/lib/icu4j-3_6.jar"/> > > > > Modified: ofbiz/trunk/LICENSE > > URL: > http://svn.apache.org/viewvc/ofbiz/trunk/LICENSE?rev=724146&r1=724145&r2=724146&view=diff > > > ============================================================================== > > --- ofbiz/trunk/LICENSE (original) > > +++ ofbiz/trunk/LICENSE Sun Dec 7 08:11:44 2008 > > @@ -17,6 +17,7 @@ > > > ofbiz/trunk/framework/base/lib/avalon-util-exception-1.0.0.jar > > ofbiz/trunk/framework/base/lib/jakarta-regexp-1.5.jar > > ofbiz/trunk/framework/base/lib/jpim-0.1.jar > > +ofbiz/trunk/framework/base/lib/juel-2.1.0.jar > > ofbiz/trunk/framework/base/lib/log4j-1.2.15.jar > > ofbiz/trunk/framework/base/lib/mx4j-3.0.1.jar > > ofbiz/trunk/framework/base/lib/mx4j-remote-3.0.1.jar > > @@ -1929,6 +1930,7 @@ > > > ========================================================================= > > The following library distributed with Apache OFBiz > is licensed under the > > COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL): > > +ofbiz/trunk/framework/base/lib/juel-2.1.0.jar > (javax.el.* API) > > ofbiz/trunk/framework/base/lib/mail.jar > > > ========================================================================= > > COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) > Version 1.0 1. > > > > Modified: > ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryServices.xml > > URL: > http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryServices.xml?rev=724146&r1=724145&r2=724146&view=diff > > > ============================================================================== > > --- > ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryServices.xml > (original) > > +++ > ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryServices.xml > Sun Dec 7 08:11:44 2008 > > @@ -775,7 +775,7 @@ > > <field-to-list > field-name="item" > list-name="reservations"/> > > </else> > > </if> > > - <set > field="reserveQtyAccum" > value="${bsh:reserveQtyAccum + > item.getDouble("quantity");}" > type="Double"/> > > + <set > field="reserveQtyAccum" > value="${reserveQtyAccum + item.quantity}" > type="Double"/> > > </if-empty> > > </then> > > </if> > > > > Added: ofbiz/trunk/framework/base/lib/juel-2.1.0.jar > > URL: > http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/lib/juel-2.1.0.jar?rev=724146&view=auto > > > ============================================================================== > > Binary file - no diff available. > > > > Propchange: > ofbiz/trunk/framework/base/lib/juel-2.1.0.jar > > > ------------------------------------------------------------------------------ > > svn:mime-type = application/octet-stream > > > > Modified: > ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java > > URL: > http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java?rev=724146&r1=724145&r2=724146&view=diff > > > ============================================================================== > > --- > ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java > (original) > > +++ > ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java > Sun Dec 7 08:11:44 2008 > > @@ -36,20 +36,21 @@ > > > > import bsh.EvalError; > > > > -/** Expands string values within a Map context > supporting the ${} syntax for > > - * variable placeholders and the "." (dot) > and "[]" (square-brace) syntax > > - * elements for accessing Map entries and List > elements in the context. > > - * It Also supports the execution of bsh files by > using the 'bsh:' prefix. > > +/** Expands String values that contain Unified > Expression Language syntax. > > + * Also supports the execution of bsh scripts by > using the 'bsh:' prefix. > > * Further it is possible to control the output by > specifying the suffix > > * '?currency(XXX)' to format the output > according the current locale > > - * and specified (XXX) currency > > + * and specified (XXX) currency.<p>This class > extends the UEL by allowing > > + * nested expressions.</p> > > */ > > @SuppressWarnings("serial") > > public class FlexibleStringExpander implements > Serializable { > > > > public static final String module = > FlexibleStringExpander.class.getName(); > > - protected static UtilCache<String, > FlexibleStringExpander> exprCache = new > UtilCache<String, > FlexibleStringExpander>("flexibleStringExpander.ExpressionCache"); > > - protected static FlexibleStringExpander nullExpr > = new FlexibleStringExpander(null); > > + public static final String openBracket = > "${"; > > + public static final String closeBracket = > "}"; > > + protected static final UtilCache<String, > FlexibleStringExpander> exprCache = new > UtilCache<String, > FlexibleStringExpander>("flexibleStringExpander.ExpressionCache"); > > + protected static final FlexibleStringExpander > nullExpr = new FlexibleStringExpander(null); > > protected String orig; > > protected List<StrElem> strElems = null; > > protected int hint = 20; > > @@ -61,7 +62,7 @@ > > public FlexibleStringExpander(String original) { > > // TODO: Change this to protected, remove > @deprecated javadoc comment > > this.orig = original; > > - if (original != null && > original.contains("${")) { > > + if (original != null && > original.contains(openBracket)) { > > this.strElems = getStrElems(original); > > if (original.length() > this.hint) { > > this.hint = original.length(); > > @@ -146,7 +147,7 @@ > > return nullExpr; > > } > > // Remove the next three lines to cache all > expressions > > - if (!original.contains("${")) { > > + if (!original.contains(openBracket)) { > > return new > FlexibleStringExpander(original); > > } > > FlexibleStringExpander fse = > exprCache.get(original); > > @@ -192,7 +193,7 @@ > > * @return The original String expanded by > replacing varaible place holders. > > */ > > public static String expandString(String > original, Map<String, ? extends Object> context, > TimeZone timeZone, Locale locale) { > > - if (context == null || original == null || > !original.contains("${")) { > > + if (context == null || original == null || > !original.contains(openBracket)) { > > return original; > > } > > FlexibleStringExpander fse = > FlexibleStringExpander.getInstance(original); > > @@ -209,7 +210,7 @@ > > } > > int origLen = original.length(); > > ArrayList<StrElem> strElems = new > ArrayList<StrElem>(); > > - int start = original.indexOf("${"); > > + int start = original.indexOf(openBracket); > > if (start == -1) { > > strElems.add(new ConstElem(original)); > > strElems.trimToSize(); > > @@ -218,7 +219,7 @@ > > int currentInd = 0; > > int end = -1; > > while (start != -1) { > > - end = original.indexOf("}", > start); > > + end = original.indexOf(closeBracket, > start); > > if (end == -1) { > > Debug.logWarning("Found a ${ > without a closing } (curly-brace) in the String: " + > original, module); > > break; > > @@ -231,10 +232,10 @@ > > if (original.indexOf("bsh:", > start + 2) == start + 2) { > > strElems.add(new > BshElem(original.substring(start + 6, end))); > > } else { > > - int ptr = > original.indexOf("${", start + 2); > > + int ptr = > original.indexOf(openBracket, start + 2); > > while (ptr != -1 && end != -1 > && ptr < end) { > > - end = > original.indexOf("}", end + 1); > > - ptr = > original.indexOf("${", ptr + 2); > > + end = > original.indexOf(closeBracket, end + 1); > > + ptr = > original.indexOf(openBracket, ptr + 2); > > } > > if (end == -1) { > > end = origLen; > > @@ -243,7 +244,7 @@ > > // Evaluation sequence is important - > do not change it > > if > (expression.contains("?currency(")) { > > strElems.add(new > CurrElem(expression)); > > - } else if > (expression.contains("${")){ > > + } else if > (expression.contains(openBracket)){ > > strElems.add(new > NestedVarElem(expression)); > > } else { > > strElems.add(new > VarElem(expression)); > > @@ -254,7 +255,7 @@ > > if (currentInd > origLen) { > > currentInd = origLen; > > } > > - start = original.indexOf("${", > currentInd); > > + start = original.indexOf(openBracket, > currentInd); > > } > > // append the rest of the original string, ie > after the last variable > > if (currentInd < origLen) { > > @@ -344,8 +345,7 @@ > > this.hint = expr.length(); > > } > > } > > - FlexibleMapAccessor<Object> fma = > new FlexibleMapAccessor<Object>(expr.toString()); > > - Object obj = fma.get(context, locale); > > + Object obj = UelUtil.evaluate(context, > openBracket + expr.toString() + closeBracket); > > if (obj != null) { > > try { > > buffer.append((String) > ObjectType.simpleTypeConvert(obj, "String", null, > timeZone, locale, true)); > > @@ -357,16 +357,15 @@ > > } > > > > protected static class VarElem implements StrElem > { > > - protected FlexibleMapAccessor<Object> > fma = null; > > + protected String original = null; > > protected VarElem(String original) { > > - this.fma = new > FlexibleMapAccessor<Object>(original); > > + this.original = original; > > } > > public void append(StringBuilder buffer, > Map<String, ? extends Object> context, TimeZone > timeZone, Locale locale) { > > - Object obj = this.fma.get(context, > locale); > > + Object obj = UelUtil.evaluate(context, > openBracket + this.original + closeBracket); > > if (obj == null) { > > - String key = fma.getOriginalName(); > > - if (key.startsWith("env.")) > { > > - obj = > System.getProperty(key.substring(4)); > > + if > (this.original.startsWith("env.")) { > > + obj = > System.getProperty(this.original.substring(4)); > > } > > } > > if (obj != null) { > > > > Added: > 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=724146&view=auto > > > ============================================================================== > > --- > ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java > (added) > > +++ > ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java > Sun Dec 7 08:11:44 2008 > > @@ -0,0 +1,147 @@ > > > +/******************************************************************************* > > + * Licensed to the Apache Software Foundation (ASF) > under one > > + * or more contributor license agreements. See the > NOTICE file > > + * distributed with this work for additional > information > > + * regarding copyright ownership. The ASF licenses > this file > > + * to you 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.ofbiz.base.util.string; > > + > > +import java.lang.reflect.Method; > > +import java.util.Map; > > +import javax.el.*; > > + > > +import javolution.util.FastMap; > > + > > +/** Implements the Unified Expression Language > (JSR-245). */ > > +public class UelUtil { > > + > > + public static final FunctionMapper functionMapper > = new Functions(); > > + protected static final ExpressionFactory > exprFactory = new de.odysseus.el.ExpressionFactoryImpl(); > > + protected static final ELResolver defaultResolver > = new CompositeELResolver() { > > + { > > + add(new ArrayELResolver(false)); > > + add(new ListELResolver(false)); > > + add(new MapELResolver(false)); > > + add(new ResourceBundleELResolver()); > > + add(new BeanELResolver(false)); > > + } > > + }; > > + > > + /** Evaluates a Unified Expression Language > expression and returns the result. > > + * @param context Evaluation context (variables) > > + * @param expression UEL expression > > + * @return Result object > > + */ > > + public static Object evaluate(Map<String, ? > extends Object> context, String expression) { > > + ELContext elContext = new > BasicContext(context); > > + ValueExpression ve = > exprFactory.createValueExpression(elContext, expression, > Object.class); > > + Object obj = null; > > + try { > > + obj = ve.getValue(elContext); > > + } catch (Exception e) {} > > + return obj; > > + } > > + > > + protected static class BasicContext extends > ELContext { > > + protected VariableMapper variables = null; > > + protected BasicContext() {} > > + public BasicContext(Map<String, ? extends > Object> context) { > > + this.variables = new Variables(context); > > + } > > + public ELResolver getELResolver() { > > + return defaultResolver; > > + } > > + public FunctionMapper getFunctionMapper() { > > + return functionMapper; > > + } > > + public VariableMapper getVariableMapper() { > > + return this.variables; > > + } > > + protected class Variables extends > VariableMapper { > > + protected Map<String, Object> > context = FastMap.newInstance(); > > + protected Variables(Map<String, ? > extends Object> context) { > > + this.context.putAll(context); > > + } > > + public ValueExpression > resolveVariable(String variable) { > > + Object obj = > this.context.get(variable); > > + if (obj != null) { > > + return new > BasicValueExpression(obj); > > + } > > + return null; > > + } > > + public ValueExpression setVariable(String > variable, ValueExpression expression) { > > + return new > BasicValueExpression(this.context.put(variable, > expression.getValue(null))); > > + } > > + } > > + @SuppressWarnings("serial") > > + protected class BasicValueExpression extends > ValueExpression { > > + protected Object object; > > + public BasicValueExpression(Object > object) { > > + super(); > > + this.object = object; > > + } > > + public boolean equals(Object obj) { > > + if (this == obj) { > > + return true; > > + } > > + try { > > + BasicValueExpression other = > (BasicValueExpression) obj; > > + return > this.object.equals(other.object); > > + } catch (Exception e) {} > > + return false; > > + } > > + public int hashCode() { > > + return this.object == null ? 0 : > this.object.hashCode(); > > + } > > + public Object getValue(ELContext context) > { > > + return this.object; > > + } > > + public String getExpressionString() { > > + return null; > > + } > > + public boolean isLiteralText() { > > + return false; > > + } > > + public Class<?> getType(ELContext > context) { > > + return this.object == null ? null : > this.object.getClass(); > > + } > > + public boolean isReadOnly(ELContext > context) { > > + return false; > > + } > > + public void setValue(ELContext context, > Object value) { > > + this.object = value; > > + } > > + public String toString() { > > + return "ValueExpression(" + > this.object + ")"; > > + } > > + public Class<?> getExpectedType() { > > + return this.object == null ? null : > this.object.getClass(); > > + } > > + } > > + } > > + > > + protected static class Functions extends > FunctionMapper { > > + protected Map<String, Method> > functionMap = FastMap.newInstance(); > > + public void setFunction(String prefix, String > localName, Method method) { > > + synchronized(this) { > > + functionMap.put(prefix + > ":" + localName, method); > > + } > > + } > > + public Method resolveFunction(String prefix, > String localName) { > > + return functionMap.get(prefix + > ":" + localName); > > + } > > + } > > + > > +} > > > > Propchange: > ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java > > > ------------------------------------------------------------------------------ > > svn:eol-style = native > > > > Propchange: > ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java > > > ------------------------------------------------------------------------------ > > svn:keywords = "Date Rev Author URL Id" > > > > Propchange: > ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java > > > ------------------------------------------------------------------------------ > > svn:mime-type = text/xml > > > > > -- > Antwebsystems.com: Quality OFBiz services for competitive > prices
