|
Author: doogie
Date: Mon Feb 22 15:40:16 2010 New Revision: 912625 URL: http://svn.apache.org/viewvc?rev=912625&view=rev Log: Add expand() variants, that don't cast the result to a string, instead just returning the raw value directly. Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java 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=912625&r1=912624&r2=912625&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 Mon Feb 22 15:40:16 2010 @@ -328,7 +328,35 @@ * @param timeZone The time zone to be used for localization * @param locale The locale to be used for localization */ - protected abstract void append(StringBuilder buffer, Map<String, ? extends Object> context, TimeZone timeZone, Locale locale); + protected abstract Object get(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale); + + private static Locale getLocale(Locale locale, Map<String, ? extends Object> context) { + if (locale == null) { + locale = (Locale) context.get("locale"); + if (locale == null && context.containsKey("autoUserLogin")) { + Map<String, Object> autoUserLogin = UtilGenerics.cast(context.get("autoUserLogin")); + locale = UtilMisc.ensureLocale(autoUserLogin.get("lastLocale")); + } + if (locale == null) { + locale = Locale.getDefault(); + } + } + return locale; + } + + private static TimeZone getTimeZone(TimeZone timeZone, Map<String, ? extends Object> context) { + if (timeZone == null) { + timeZone = (TimeZone) context.get("timeZone"); + if (timeZone == null && context.containsKey("autoUserLogin")) { + Map<String, String> autoUserLogin = UtilGenerics.cast(context.get("autoUserLogin")); + timeZone = UtilDateTime.toTimeZone(autoUserLogin.get("lastTimeZone")); + } + if (timeZone == null) { + timeZone = TimeZone.getDefault(); + } + } + return timeZone; + } /** Evaluate this object's expression and return the result as a <code>String</code>. * Null or empty expressions return an empty <code>String</code>. @@ -366,28 +394,17 @@ if (context == null) { return this.toString(); } - if (locale == null) { - locale = (Locale) context.get("locale"); - if (locale == null && context.containsKey("autoUserLogin")) { - Map<String, Object> autoUserLogin = UtilGenerics.cast(context.get("autoUserLogin")); - locale = UtilMisc.ensureLocale(autoUserLogin.get("lastLocale")); - } - if (locale == null) { - locale = Locale.getDefault(); - } - } - if (timeZone == null) { - timeZone = (TimeZone) context.get("timeZone"); - if (timeZone == null && context.containsKey("autoUserLogin")) { - Map<String, String> autoUserLogin = UtilGenerics.cast(context.get("autoUserLogin")); - timeZone = UtilDateTime.toTimeZone(autoUserLogin.get("lastTimeZone")); - } - if (timeZone == null) { - timeZone = TimeZone.getDefault(); + timeZone = getTimeZone(timeZone, context); + locale = getLocale(locale, context); + Object obj = get(context, timeZone, locale); + StringBuilder buffer = new StringBuilder(this.hint); + try { + if (obj != null) { + buffer.append(ObjectType.simpleTypeConvert(obj, "String", null, timeZone, locale, true)); } + } catch (Exception e) { + buffer.append(obj); } - StringBuilder buffer = new StringBuilder(this.hint); - this.append(buffer, context, timeZone, locale); if (buffer.length() > this.hint) { synchronized(this) { this.hint = buffer.length(); @@ -396,6 +413,45 @@ return buffer.toString(); } + /** Evaluate this object's expression and return the result as an <code>Object</code>. + * Null or empty expressions return an empty <code>String</code>. + * A <code>null context</code> argument will return the original expression. + * + * @param context The evaluation context + * @return This object's expression result as a <code>String</code> + */ + public Object expand(Map<String, ? extends Object> context) { + return this.expand(context, null, null); + } + + /** Evaluate this object's expression and return the result as an <code>Object</code>. + * Null or empty expressions return an empty <code>String</code>. + * A <code>null context</code> argument will return the original expression. + * + * @param context The evaluation context + * @param locale The locale to be used for localization + * @return This object's expression result as a <code>String</code> + */ + public Object expand(Map<String, ? extends Object> context, Locale locale) { + return this.expand(context, null, locale); + } + + /** Evaluate this object's expression and return the result as an <code>Object</code>. + * Null or empty expressions return an empty <code>String</code>. + * A <code>null context</code> argument will return the original expression. + * + * @param context The evaluation context + * @param timeZone The time zone to be used for localization + * @param locale The locale to be used for localization + * @return This object's expression result as a <code>String</code> + */ + public Object expand(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + if (context == null) { + return null; + } + return get(context, getTimeZone(timeZone, context), getLocale(locale, context)); + } + /** Returns a copy of the original expression. * * @return The original expression @@ -453,15 +509,11 @@ } @Override - protected void append(StringBuilder buffer, Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + protected Object get(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { try { Object obj = BshUtil.eval(new String(this.chars, this.parseStart, this.parseLength), UtilMisc.makeMapWritable(context)); if (obj != null) { - try { - buffer.append(ObjectType.simpleTypeConvert(obj, "String", null, timeZone, locale, true)); - } catch (Exception e) { - buffer.append(obj); - } + return obj; } else { if (Debug.verboseOn()) { Debug.logVerbose("BSH scriptlet evaluated to null [" + this + "], got no return so inserting nothing.", module); @@ -470,6 +522,7 @@ } catch (EvalError e) { Debug.logWarning(e, "Error evaluating BSH scriptlet [" + this + "], inserting nothing; error was: " + e, module); } + return null; } } @@ -478,21 +531,25 @@ protected ConstSimpleElem(char[] chars) { super(chars); } + @Override public boolean isEmpty() { return this.chars.length == 0; } + @Override public String getOriginal() { return new String(this.chars); } + @Override - public void append(StringBuilder buffer, Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { - buffer.append(this.chars); + public String expandString(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + return getOriginal(); } + @Override - public String expandString(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { - return new String(this.chars); + protected Object get(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + return isEmpty() ? null : getOriginal(); } } @@ -503,8 +560,8 @@ } @Override - protected void append(StringBuilder buffer, Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { - buffer.append(this.chars, this.offset, this.length); + protected Object get(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + return getOriginal(); } @Override @@ -528,12 +585,12 @@ } @Override - protected void append(StringBuilder buffer, Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + protected Object get(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { try { Object obj = UelUtil.evaluate(context, new String(this.valueStr)); if (obj != null) { String currencyCode = this.codeExpr.expandString(context, timeZone, locale); - buffer.append(UtilFormatOut.formatCurrency(new BigDecimal(obj.toString()), currencyCode, locale)); + return UtilFormatOut.formatCurrency(new BigDecimal(obj.toString()), currencyCode, locale); } } catch (PropertyNotFoundException e) { if (Debug.verboseOn()) { @@ -542,6 +599,7 @@ } catch (Exception e) { Debug.logError("Error evaluating expression: " + e, module); } + return null; } } @@ -555,10 +613,12 @@ } @Override - protected void append(StringBuilder buffer, Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + protected Object get(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + StringBuilder buffer = new StringBuilder(); for (FlexibleStringExpander child : this.childElems) { - child.append(buffer, context, timeZone, locale); + buffer.append(child.expandString(context, timeZone, locale)); } + return buffer.toString(); } } @@ -572,15 +632,11 @@ } @Override - protected void append(StringBuilder buffer, Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + protected Object get(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { try { Object obj = InvokerHelper.createScript(this.parsedScript, GroovyUtil.getBinding(context)).run(); if (obj != null) { - try { - buffer.append(ObjectType.simpleTypeConvert(obj, "String", null, timeZone, locale, true)); - } catch (Exception e) { - buffer.append(obj); - } + return obj; } else { if (Debug.verboseOn()) { Debug.logVerbose("Groovy scriptlet evaluated to null [" + this + "], got no return so inserting nothing.", module); @@ -590,6 +646,7 @@ // handle other things, like the groovy.lang.MissingPropertyException Debug.logWarning(e, "Error evaluating Groovy scriptlet [" + this + "], inserting nothing; error was: " + e, module); } + return null; } } @@ -606,19 +663,16 @@ } @Override - protected void append(StringBuilder buffer, Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + protected Object get(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { StringBuilder expr = new StringBuilder(this.hint); for (FlexibleStringExpander child : this.childElems) { - child.append(expr, context, timeZone, locale); + expr.append(child.expandString(context, timeZone, locale)); } if (expr.length() == 0) { - return; + return ""; } try { - Object obj = UelUtil.evaluate(context, openBracket.concat(expr.toString()).concat(closeBracket)); - if (obj != null) { - buffer.append((String) ObjectType.simpleTypeConvert(obj, "String", null, timeZone, locale, false)); - } + return UelUtil.evaluate(context, openBracket.concat(expr.toString()).concat(closeBracket)); } catch (PropertyNotFoundException e) { if (Debug.verboseOn()) { Debug.logVerbose("Error evaluating expression: " + e, module); @@ -626,6 +680,7 @@ } catch (Exception e) { Debug.logError("Error evaluating expression: " + e, module); } + return ""; } } @@ -639,7 +694,7 @@ } @Override - protected void append(StringBuilder buffer, Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { + protected Object get(Map<String, ? extends Object> context, TimeZone timeZone, Locale locale) { Object obj = null; try { obj = UelUtil.evaluate(context, new String(this.bracketedOriginal)); @@ -656,14 +711,11 @@ String str = (String) obj; if (str.contains(openBracket)) { FlexibleStringExpander fse = FlexibleStringExpander.getInstance(str); - fse.append(buffer, context, timeZone, locale); - return; + return fse.get(context, timeZone, locale); } } catch (ClassCastException e) {} - try { - buffer.append((String) ObjectType.simpleTypeConvert(obj, "String", null, timeZone, locale, false)); - } catch (Exception e) {} } + return obj; } } } |
| Free forum by Nabble | Edit this page |
