You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2009/05/02 20:04:21 UTC
svn commit: r770973 - in /ofbiz/trunk/framework/base/src/org/ofbiz/base/util:
collections/FlexibleMapAccessor.java string/FlexibleStringExpander.java
string/UelUtil.java
Author: adrianc
Date: Sat May 2 18:04:21 2009
New Revision: 770973
URL: http://svn.apache.org/viewvc?rev=770973&view=rev
Log:
UEL improvements:
1. Implemented operator substitution suggested by Jacopo and Scott. It is a subset of the beanshell operator substitution - http://www.beanshell.org/manual/syntax.html#Document_Friendly_Entities.
2. Added an extension to UEL that permits using variables that might not exist in expressions. Example: The expression ${foo + bar} will throw an exception if either foo or bar don't exist. Assuming foo and bar are both intended to be integers, the expression ${foo$integer + bar$integer} will not throw an exception. Instead, Integer instances (initialized to zero) will be created for the missing variables.
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/FlexibleMapAccessor.java
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.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=770973&r1=770972&r2=770973&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 Sat May 2 18:04:21 2009
@@ -138,7 +138,7 @@
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);
+ Debug.logError("UEL exception while getting value: " + e + ", original = " + this.original, module);
}
return UtilGenerics.<T>cast(obj);
}
@@ -161,7 +161,7 @@
try {
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, module);
+ Debug.logError("UEL exception while setting value: " + e + ", original = " + this.original, module);
}
}
@@ -181,7 +181,7 @@
Map<String, Object> writableMap = UtilGenerics.cast(base);
UelUtil.removeValue(writableMap, getExpression(base));
} catch (Exception e) {
- Debug.logInfo("UEL exception while removing value: " + e + ", original = " + this.original, module);
+ Debug.logError("UEL exception while removing value: " + e + ", original = " + this.original, module);
}
return object;
}
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=770973&r1=770972&r2=770973&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 Sat May 2 18:04:21 2009
@@ -25,6 +25,7 @@
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
+import javax.el.*;
import org.ofbiz.base.util.cache.UtilCache;
import org.ofbiz.base.util.*;
@@ -356,8 +357,12 @@
String currencyCode = this.codeExpr.expandString(context, timeZone, locale);
buffer.append(UtilFormatOut.formatCurrency(new BigDecimal(obj.toString()), currencyCode, locale));
}
+ } catch (PropertyNotFoundException e) {
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Error evaluating expression: " + e, module);
+ }
} catch (Exception e) {
- Debug.logVerbose("Error evaluating expression: " + e, module);
+ Debug.logError("Error evaluating expression: " + e, module);
}
}
}
@@ -389,8 +394,12 @@
if (obj != null) {
buffer.append((String) ObjectType.simpleTypeConvert(obj, "String", null, timeZone, locale, false));
}
+ } catch (PropertyNotFoundException e) {
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Error evaluating expression: " + e, module);
+ }
} catch (Exception e) {
- Debug.logVerbose("Error evaluating expression: " + e, module);
+ Debug.logError("Error evaluating expression: " + e, module);
}
}
}
@@ -400,14 +409,18 @@
protected final String bracketedOriginal;
protected VarElem(String original) {
this.original = original;
- this.bracketedOriginal = openBracket + original + closeBracket;
+ this.bracketedOriginal = openBracket + UelUtil.prepareExpression(original) + closeBracket;
}
public void append(StringBuilder buffer, Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) {
Object obj = null;
try {
obj = UelUtil.evaluate(context, this.bracketedOriginal);
+ } catch (PropertyNotFoundException e) {
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Error evaluating expression " + this.original + ": " + e, module);
+ }
} catch (Exception e) {
- Debug.logVerbose("Error evaluating expression: " + e, module);
+ Debug.logError("Error evaluating expression " + this.original + ": " + e, module);
}
if (obj == null) {
if (this.original.startsWith("env.")) {
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=770973&r1=770972&r2=770973&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 Sat May 2 18:04:21 2009
@@ -135,20 +135,52 @@
*/
public ValueExpression resolveVariable(String variable) {
Object obj = null;
- //Object obj = this.variables.get(variable);
+ String createObjectType = null;
+ String name = variable;
+ if (variable.contains("$")) {
+ if (variable.endsWith("$string")) {
+ name = variable.substring(0, variable.length() - 7);
+ createObjectType = "string";
+ } else if (variable.endsWith("$boolean")) {
+ name = variable.substring(0, variable.length() - 8);
+ createObjectType = "boolean";
+ } else if (variable.endsWith("$integer")) {
+ name = variable.substring(0, variable.length() - 8);
+ createObjectType = "integer";
+ } else if (variable.endsWith("$long")) {
+ name = variable.substring(0, variable.length() - 5);
+ createObjectType = "long";
+ } else if (variable.endsWith("$double")) {
+ name = variable.substring(0, variable.length() - 7);
+ createObjectType = "double";
+ }
+ }
if (this.variables instanceof LocalizedMap) {
Locale locale = UtilMisc.ensureLocale(this.variables.get("locale"));
- Object localizedObj = ((LocalizedMap) this.variables).get(variable, locale);
+ Object localizedObj = ((LocalizedMap<?>) this.variables).get(name, locale);
if (localizedObj == null) {
- localizedObj = this.variables.get(variable);
+ localizedObj = this.variables.get(name);
}
obj = localizedObj;
} else {
- obj = this.variables.get(variable);
+ obj = this.variables.get(name);
}
if (obj != null) {
return new BasicValueExpression(obj);
}
+ if (createObjectType != null) {
+ if ("string".equals(createObjectType)) {
+ return new BasicValueExpression("");
+ } else if ("boolean".equals(createObjectType)) {
+ return new BasicValueExpression(Boolean.FALSE);
+ } else if ("integer".equals(createObjectType)) {
+ return new BasicValueExpression(Integer.valueOf(0));
+ } else if ("long".equals(createObjectType)) {
+ return new BasicValueExpression(Long.valueOf(0));
+ } else if ("double".equals(createObjectType)) {
+ return new BasicValueExpression(Double.valueOf(0));
+ }
+ }
return null;
}
public ValueExpression setVariable(String variable, ValueExpression expression) {
@@ -334,23 +366,41 @@
}
}
- /** Prepares an expression for evaluation by UEL. The OFBiz syntax is
+ /** Prepares an expression for evaluation by UEL.<p>The OFBiz syntax is
* converted to UEL-compatible syntax and the resulting expression is
- * returned.
+ * returned. OFBiz syntax provides special forms of common operators to make
+ * it easier to embed UEL expressions in XML:
+ * <table border="1" cellpadding="2">
+ * <tr><td><strong>@gt</strong></td><td>></td></tr>
+ * <tr><td><strong>@lt</strong></td><td><</td></tr>
+ * <tr><td><strong>@lteq</strong></td><td><=</td></tr>
+ * <tr><td><strong>@gteq</strong></td><td>>=</td></tr>
+ * <tr><td><strong>@or</strong></td><td>||</td></tr>
+ * <tr><td><strong>@and</strong></td><td>&&</td></tr>
+ * </table></p>
* @param expression Expression to be converted
* @return Converted expression
*/
public static String prepareExpression(String expression) {
String result = expression;
- int openBrace = expression.indexOf("[+");
- int closeBrace = (openBrace == -1 ? -1 : expression.indexOf(']', openBrace));
+ result = result.replace("[]", "['add']");
+ if (result.contains("@")) {
+ // TODO: create a static Pattern instance and use a Matcher
+ result = result.replace("@or", "||");
+ result = result.replace("@and", "&&");
+ result = result.replace("@lteq", "<=");
+ result = result.replace("@gteq", ">=");
+ result = result.replace("@lt", "<");
+ result = result.replace("@gt", ">");
+ }
+ int openBrace = result.indexOf("[+");
+ int closeBrace = (openBrace == -1 ? -1 : result.indexOf(']', openBrace));
if (closeBrace != -1) {
- String base = expression.substring(0, openBrace);
- String property = expression.substring(openBrace+2, closeBrace).trim();
- String end = expression.substring(closeBrace + 1);
+ String base = result.substring(0, openBrace);
+ String property = result.substring(openBrace+2, closeBrace).trim();
+ String end = result.substring(closeBrace + 1);
result = base + "['insert@" + property + "']" + end;
}
- result = result.replace("[]", "['add']");
return result;
}
}