Author: doogie
Date: Sun Feb 21 01:33:12 2010
New Revision: 912283
URL: http://svn.apache.org/viewvc?rev=912283&view=rev
Log:
BUG FIX: Fix getOriginal and toString, to return the unparsed version.
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/test/FlexibleStringExpanderTests.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=912283&r1=912282&r2=912283&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 Feb 21 01:33:12 2010
@@ -57,7 +57,7 @@
public static final String openBracket = "${";
public static final String closeBracket = "}";
protected static final UtilCache<String, FlexibleStringExpander> exprCache
= UtilCache.createUtilCache("flexibleStringExpander.ExpressionCache");
- protected static final FlexibleStringExpander nullExpr = new ConstElem("");
+ protected static final FlexibleStringExpander nullExpr = new ConstElem(new
char[0], 0, 0);
/** Evaluate an expression and return the result as a <code>String</code>.
* Null expressions return <code>null</code>.
@@ -167,7 +167,7 @@
}
// Remove the next three lines to cache all expressions
if (!expression.contains(openBracket)) {
- return new ConstElem(expression);
+ return new ConstElem(expression.toCharArray(), 0,
expression.length());
}
FlexibleStringExpander fse = exprCache.get(expression);
if (fse == null) {
@@ -180,11 +180,12 @@
}
private static FlexibleStringExpander parse(String expression) {
- FlexibleStringExpander[] strElems = getStrElems(expression);
+ char[] chars = expression.toCharArray();
+ FlexibleStringExpander[] strElems = getStrElems(chars, 0,
chars.length);
if (strElems.length == 1) {
return strElems[0];
} else {
- return new Elements(expression, strElems);
+ return new Elements(chars, 0, chars.length, strElems);
}
}
@@ -194,19 +195,20 @@
* @return An array of <code>FlexibleStringExpander</code>
* instances
*/
- protected static FlexibleStringExpander[] getStrElems(String expression) {
- if (UtilValidate.isEmpty(expression)) {
+ protected static FlexibleStringExpander[] getStrElems(char[] chars, int
offset, int length) {
+ if (length == 0) {
return null;
}
- int origLen = expression.length();
+ int origLen = length;
ArrayList<FlexibleStringExpander> strElems = new
ArrayList<FlexibleStringExpander>();
- int start = expression.indexOf(openBracket);
+ String expression = new String(chars, 0, length + offset);
+ int start = expression.indexOf(openBracket, offset);
if (start == -1) {
- strElems.add(new ConstElem(expression));
+ strElems.add(new ConstElem(chars, offset, length));
strElems.trimToSize();
return strElems.toArray(new
FlexibleStringExpander[strElems.size()]);
}
- int currentInd = 0;
+ int currentInd = offset;
int end = -1;
while (start != -1) {
end = expression.indexOf(closeBracket, start);
@@ -218,14 +220,14 @@
boolean escapedExpression = (start - 1 >= 0 &&
expression.charAt(start - 1) == '\\');
if (start > currentInd) {
// append everything from the current index to the start of
the expression
- strElems.add(new ConstElem(expression.substring(currentInd,
escapedExpression ? start -1 : start)));
+ strElems.add(new ConstElem(chars, currentInd,
(escapedExpression ? start -1 : start) - currentInd));
}
if (expression.indexOf("bsh:", start + 2) == start + 2 &&
!escapedExpression) {
// checks to see if this starts with a "bsh:", if so treat the
rest of the expression as a bsh scriptlet
- strElems.add(new BshElem(expression.substring(start + 6,
end)));
+ strElems.add(new BshElem(chars, start, Math.min(end + 1, start
+ length) - start, start + 6, end - start - 6));
} else if (expression.indexOf("groovy:", start + 2) == start + 2
&& !escapedExpression) {
// checks to see if this starts with a "groovy:", if so treat
the rest of the expression as a groovy scriptlet
- strElems.add(new GroovyElem(expression.substring(start + 9,
end)));
+ strElems.add(new GroovyElem(chars, start, Math.min(end + 1,
start + length) - start, start + 9, end - start - 9));
} else {
// Scan for matching closing bracket
int ptr = expression.indexOf(openBracket, start + 2);
@@ -238,40 +240,44 @@
}
// Evaluation sequence is important - do not change it
if (escapedExpression) {
- strElems.add(new ConstElem(expression.substring(start, end
+ 1)));
+ strElems.add(new ConstElem(chars, start, end + 1 - start));
} else {
String subExpression = expression.substring(start + 2,
end);
int currencyPos = subExpression.indexOf("?currency(");
int closeParen = currencyPos > 0 ?
subExpression.indexOf(")", currencyPos + 10) : -1;
if (closeParen != -1) {
- strElems.add(new CurrElem(subExpression));
+ strElems.add(new CurrElem(chars, start, Math.min(end +
1, start + length) - start, start + 2, end - start - 1));
} else if (subExpression.contains(openBracket)) {
- strElems.add(new NestedVarElem(subExpression));
+ strElems.add(new NestedVarElem(chars, start,
Math.min(end + 1, start + length) - start, start + 2, Math.min(end - 2, start +
length) - start));
} else {
- strElems.add(new VarElem(subExpression));
+ strElems.add(new VarElem(chars, start, Math.min(end +
1, start + length) - start, start + 2, Math.min(end - 2, start + length) -
start));
}
}
}
// reset the current index to after the expression, and the start
to the beginning of the next expression
currentInd = end + 1;
- if (currentInd > origLen) {
- currentInd = origLen;
+ if (currentInd > origLen + offset) {
+ currentInd = origLen + offset;
}
start = expression.indexOf(openBracket, currentInd);
}
// append the rest of the original string, ie after the last expression
- if (currentInd < origLen) {
- strElems.add(new ConstElem(expression.substring(currentInd)));
+ if (currentInd < origLen + offset) {
+ strElems.add(new ConstElem(chars, currentInd, offset + length -
currentInd));
}
return strElems.toArray(new FlexibleStringExpander[strElems.size()]);
}
// Note: a character array is used instead of a String to keep the memory
footprint small.
- protected final char[] orig;
+ protected final char[] chars;
+ protected final int offset;
+ protected final int length;
protected int hint = 20;
- protected FlexibleStringExpander(String original) {
- this.orig = original.toCharArray();
+ protected FlexibleStringExpander(char[] chars, int offset, int length) {
+ this.chars = chars;
+ this.offset = offset;
+ this.length = length;
}
/** Appends this object's expression result to <code>buffer</code>.
@@ -354,7 +360,7 @@
* @return The original expression
*/
public String getOriginal() {
- return new String(this.orig);
+ return new String(this.chars, this.offset, this.length);
}
/** Returns <code>true</code> if the original expression is empty
@@ -364,7 +370,7 @@
* or <code>null</code>
*/
public boolean isEmpty() {
- return this.orig == null || this.orig.length == 0;
+ return this.chars == null || this.length == 0;
}
/** Returns a copy of the original expression.
@@ -373,17 +379,23 @@
*/
@Override
public String toString() {
- return new String(this.orig);
+ return new String(this.chars, this.offset, this.length);
}
/** An object that represents a <code>${bsh:}</code> expression. */
protected static class BshElem extends FlexibleStringExpander {
- protected BshElem(String original) {
- super(original);
+ private final int parseStart;
+ private final int parseLength;
+
+ protected BshElem(char[] chars, int offset, int length, int
parseStart, int parseLength) {
+ super(chars, offset, length);
+ this.parseStart = parseStart;
+ this.parseLength = parseLength;
}
+
public void append(StringBuilder buffer, Map<String, ? extends Object>
context, TimeZone timeZone, Locale locale) {
try {
- Object obj = BshUtil.eval(new String(this.orig),
UtilMisc.makeMapWritable(context));
+ 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));
@@ -403,16 +415,16 @@
/** An object that represents a <code>String</code> constant portion of an
expression. */
protected static class ConstElem extends FlexibleStringExpander {
- protected ConstElem(String original) {
- super(original);
+ protected ConstElem(char[] chars, int offset, int length) {
+ super(chars, offset, length);
}
@Override
public void append(StringBuilder buffer, Map<String, ? extends Object>
context, TimeZone timeZone, Locale locale) {
- buffer.append(this.orig);
+ buffer.append(this.chars, this.offset, this.length);
}
@Override
public String expandString(Map<String, ? extends Object> context,
TimeZone timeZone, Locale locale) {
- return new String(this.orig);
+ return new String(this.chars, this.offset, this.length);
}
}
@@ -420,12 +432,13 @@
protected static class CurrElem extends FlexibleStringExpander {
protected final char[] valueStr;
protected final FlexibleStringExpander codeExpr;
- protected CurrElem(String original) {
- super(original);
- int currencyPos = original.indexOf("?currency(");
- int closeParen = original.indexOf(")", currencyPos + 10);
- this.codeExpr =
FlexibleStringExpander.getInstance(original.substring(currencyPos + 10,
closeParen));
- this.valueStr = openBracket.concat(original.substring(0,
currencyPos)).concat(closeBracket).toCharArray();
+ protected CurrElem(char[] chars, int offset, int length, int
parseStart, int parseLength) {
+ super(chars, offset, length);
+ String parse = new String(chars, parseStart, parseLength);
+ int currencyPos = parse.indexOf("?currency(");
+ int closeParen = parse.indexOf(")", currencyPos + 10);
+ this.codeExpr =
FlexibleStringExpander.getInstance(parse.substring(currencyPos + 10,
closeParen));
+ this.valueStr = openBracket.concat(parse.substring(0,
currencyPos)).concat(closeBracket).toCharArray();
}
public void append(StringBuilder buffer, Map<String, ? extends Object>
context, TimeZone timeZone, Locale locale) {
try {
@@ -447,8 +460,8 @@
/** A container object that contains expression fragments. */
protected static class Elements extends FlexibleStringExpander {
protected final FlexibleStringExpander[] childElems;
- protected Elements(String original, FlexibleStringExpander[]
childElems) {
- super(original);
+ protected Elements(char[] chars, int offset, int length,
FlexibleStringExpander[] childElems) {
+ super(chars, offset, length);
this.childElems = childElems;
}
public void append(StringBuilder buffer, Map<String, ? extends Object>
context, TimeZone timeZone, Locale locale) {
@@ -461,9 +474,9 @@
/** An object that represents a <code>${groovy:}</code> expression. */
protected static class GroovyElem extends FlexibleStringExpander {
protected final Class<?> parsedScript;
- protected GroovyElem(String script) {
- super(script);
- this.parsedScript = GroovyUtil.parseClass(script);
+ protected GroovyElem(char[] chars, int offset, int length, int
parseStart, int parseLength) {
+ super(chars, offset, length);
+ this.parsedScript = GroovyUtil.parseClass(new String(chars,
parseStart, parseLength));
}
public void append(StringBuilder buffer, Map<String, ? extends Object>
context, TimeZone timeZone, Locale locale) {
try {
@@ -491,11 +504,11 @@
/** An object that represents a nested expression. */
protected static class NestedVarElem extends FlexibleStringExpander {
protected final FlexibleStringExpander[] childElems;
- protected NestedVarElem(String original) {
- super(original);
- this.childElems = getStrElems(original);
- if (original.length() > this.hint) {
- this.hint = original.length();
+ protected NestedVarElem(char[] chars, int offset, int length, int
parseStart, int parseLength) {
+ super(chars, offset, length);
+ this.childElems = getStrElems(chars, parseStart, parseLength);
+ if (length > this.hint) {
+ this.hint = length;
}
}
public void append(StringBuilder buffer, Map<String, ? extends Object>
context, TimeZone timeZone, Locale locale) {
@@ -524,9 +537,9 @@
/** An object that represents a simple, non-nested expression. */
protected static class VarElem extends FlexibleStringExpander {
protected final char[] bracketedOriginal;
- protected VarElem(String original) {
- super(original);
- this.bracketedOriginal =
openBracket.concat(UelUtil.prepareExpression(original)).concat(closeBracket).toCharArray();
+ protected VarElem(char[] chars, int offset, int length, int
parseStart, int parseLength) {
+ super(chars, offset, length);
+ this.bracketedOriginal =
openBracket.concat(UelUtil.prepareExpression(new String(chars, parseStart,
parseLength))).concat(closeBracket).toCharArray();
}
public void append(StringBuilder buffer, Map<String, ? extends Object>
context, TimeZone timeZone, Locale locale) {
Object obj = null;
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/test/FlexibleStringExpanderTests.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/test/FlexibleStringExpanderTests.java?rev=912283&r1=912282&r2=912283&view=diff
==============================================================================
---
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/test/FlexibleStringExpanderTests.java
(original)
+++
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/test/FlexibleStringExpanderTests.java
Sun Feb 21 01:33:12 2010
@@ -60,14 +60,14 @@
public void testParsing() {
parserTest("visible nested replacement", "${'Hello ${var}'}!", true,
"${'Hello ${var}'}!");
parserTest("hidden (runtime) nested null callreplacement", "Hello
${${groovy:" + FlexibleStringExpanderTests.class.getName() +
".StaticReturnNull()}}World!", true, "Hello ${${groovy:" +
FlexibleStringExpanderTests.class.getName() + ".StaticReturnNull()}}World!");
- parserTest("UEL integration(nested): throw Exception",
"${${throwException.value}}", true, "${throwException.value}");
- parserTest("nested-constant-emptynest-emptynest", "${a${}${}", true,
"a${}${}");
+ parserTest("UEL integration(nested): throw Exception",
"${${throwException.value}}", true, "${${throwException.value}}");
+ parserTest("nested-constant-emptynest-emptynest", "${a${}${}", true,
"${a${}${}");
parserTest("null", null, true, "");
parserTest("empty", "", true, "");
parserTest("constant-only", "a", false, "a");
- parserTest("nested-constant-emptynest-emptynest", "${a${}${}", true,
"a${}${}");
- parserTest("bsh", "${bsh:}", true, "");
- parserTest("groovy", "${groovy:}", true, "");
+ parserTest("nested-constant-emptynest-emptynest", "${a${}${}", true,
"${a${}${}");
+ parserTest("bsh", "${bsh:}", true, "${bsh:}");
+ parserTest("groovy", "${groovy:}", true, "${groovy:}");
parserTest("escaped", "\\${}", true, "\\${}");
parserTest("constant-escaped", "a\\${}", true, "a\\${}");
@@ -75,8 +75,8 @@
parserTest("escaped-groovy", "\\${groovy:}", true, "\\${groovy:}");
parserTest("missing-}", "${", true, "${");
- parserTest("nested-constant-missing-}", "${a${}", true, "a${}");
- parserTest("nested-constant-nested-nested-missing-}", "${a${${}",
true, "a${${}");
+ parserTest("nested-constant-missing-}", "${a${}", true, "${a${}");
+ parserTest("nested-constant-nested-nested-missing-}", "${a${${}",
true, "${a${${}");
parserTest("escaped-missing-}", "\\${", true, "\\${");
parserTest("constant-escaped-missing-}", "a\\${", true, "a\\${");
@@ -88,14 +88,14 @@
parserTest("currency", "${?currency(usd)", true, "${?currency(usd)");
parserTest("currency", "${price?currency(usd", true,
"${price?currency(usd");
parserTest("currency", "${price?currency(usd)", true,
"${price?currency(usd)");
- parserTest("currency", "${?currency(}", true, "?currency(");
- parserTest("currency", "${?currency()}", true, "?currency()");
- parserTest("currency", "${?currency(usd}", true, "?currency(usd");
- parserTest("currency", "${?currency(usd)}", true, "?currency(usd)");
- parserTest("currency", "${price?currency(}", true, "price?currency(");
- parserTest("currency", "${price?currency()}", true,
"price?currency()");
- parserTest("currency", "${price?currency(usd}", true,
"price?currency(usd");
- parserTest("currency", "${price?currency(usd)}", true,
"price?currency(usd)");
+ parserTest("currency", "${?currency(}", true, "${?currency(}");
+ parserTest("currency", "${?currency()}", true, "${?currency()}");
+ parserTest("currency", "${?currency(usd}", true, "${?currency(usd}");
+ parserTest("currency", "${?currency(usd)}", true, "${?currency(usd)}");
+ parserTest("currency", "${price?currency(}", true,
"${price?currency(}");
+ parserTest("currency", "${price?currency()}", true,
"${price?currency()}");
+ parserTest("currency", "${price?currency(usd}", true,
"${price?currency(usd}");
+ parserTest("currency", "${price?currency(usd)}", true,
"${price?currency(usd)}");
parserTest("currency", "a${price?currency(usd)}b", true,
"a${price?currency(usd)}b");
}
@@ -115,14 +115,14 @@
assertEquals("expandString(null):" + label, "",
fse.expandString(null, timeZone, locale));
}
} else {
- //assertEquals("getOriginal():" + label, input, fse.getOriginal());
- //assertEquals("toString():" + label, input, fse.toString());
- //assertEquals("expandString(null):" + label, input,
fse.expandString(null));
- //if (timeZone == null) {
- // assertEquals("expandString(null):" + label, input,
fse.expandString(null, locale));
- //} else {
- // assertEquals("expandString(null):" + label, input,
fse.expandString(null, timeZone, locale));
- //}
+ assertEquals("getOriginal():" + label, input, fse.getOriginal());
+ assertEquals("toString():" + label, input, fse.toString());
+ assertEquals("expandString(null):" + label, input,
fse.expandString(null));
+ if (timeZone == null) {
+ assertEquals("expandString(null):" + label, input,
fse.expandString(null, locale));
+ } else {
+ assertEquals("expandString(null):" + label, input,
fse.expandString(null, timeZone, locale));
+ }
}
if (locale == null) {
assertEquals(label, compare, fse.expandString(context));