Author: lukaszlenart Date: Mon Jun 3 08:47:16 2013 New Revision: 1488897 URL: http://svn.apache.org/r1488897 Log: WW-4090 Removes double evaluation of parsed expression
Modified: struts/struts2/branches/STRUTS_2_3_14_2_X/xwork-core/src/main/java/com/opensymphony/xwork2/util/OgnlTextParser.java struts/struts2/branches/STRUTS_2_3_14_2_X/xwork-core/src/test/java/com/opensymphony/xwork2/util/TextParseUtilTest.java Modified: struts/struts2/branches/STRUTS_2_3_14_2_X/xwork-core/src/main/java/com/opensymphony/xwork2/util/OgnlTextParser.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_14_2_X/xwork-core/src/main/java/com/opensymphony/xwork2/util/OgnlTextParser.java?rev=1488897&r1=1488896&r2=1488897&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_3_14_2_X/xwork-core/src/main/java/com/opensymphony/xwork2/util/OgnlTextParser.java (original) +++ struts/struts2/branches/STRUTS_2_3_14_2_X/xwork-core/src/main/java/com/opensymphony/xwork2/util/OgnlTextParser.java Mon Jun 3 08:47:16 2013 @@ -11,17 +11,16 @@ public class OgnlTextParser implements T // deal with the "pure" expressions first! //expression = expression.trim(); Object result = expression; + int pos = 0; + for (char open : openChars) { int loopCount = 1; - int pos = 0; - //this creates an implicit StringBuffer and shouldn't be used in the inner loop final String lookupChars = open + "{"; while (true) { int start = expression.indexOf(lookupChars, pos); if (start == -1) { - pos = 0; loopCount++; start = expression.indexOf(lookupChars); } Modified: struts/struts2/branches/STRUTS_2_3_14_2_X/xwork-core/src/test/java/com/opensymphony/xwork2/util/TextParseUtilTest.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_14_2_X/xwork-core/src/test/java/com/opensymphony/xwork2/util/TextParseUtilTest.java?rev=1488897&r1=1488896&r2=1488897&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_3_14_2_X/xwork-core/src/test/java/com/opensymphony/xwork2/util/TextParseUtilTest.java (original) +++ struts/struts2/branches/STRUTS_2_3_14_2_X/xwork-core/src/test/java/com/opensymphony/xwork2/util/TextParseUtilTest.java Mon Jun 3 08:47:16 2013 @@ -97,6 +97,24 @@ public class TextParseUtilTest extends X assertEquals("count must be between 123 and 456, current value is 98765.", s); } + public void testNestedExpression() throws Exception { + ValueStack stack = ActionContext.getContext().getValueStack(); + stack.push(new HashMap<String, Object>() {{ put("foo", "${%{1+1}}"); }}); + String s = TextParseUtil.translateVariables("${foo}", stack); + assertEquals("${%{1+1}}", s); + stack.pop(); + } + + public void testMixedOpenChars() throws Exception { + ValueStack stack = ActionContext.getContext().getValueStack(); + stack.push(new HashMap<String, Object>() {{ put("foo", "bar"); }}); + String s = TextParseUtil.translateVariables("${foo}-%{foo}", stack); + assertEquals("bar-bar", s); + s = TextParseUtil.translateVariables("%{foo}-${foo}", stack); + assertEquals("%{foo}-bar", s); // this is bad, but it is the only way not to double evaluate passed expression + stack.pop(); + } + public void testCommaDelimitedStringToSet() { assertEquals(0, TextParseUtil.commaDelimitedStringToSet("").size()); assertEquals(new HashSet<String>(Arrays.asList("foo", "bar", "tee")), @@ -132,10 +150,13 @@ public class TextParseUtilTest extends X public void testTranslateVariablesRecursive() { ValueStack stack = ActionContext.getContext().getValueStack(); - stack.push(new HashMap<String, Object>() {{ put("foo", "${1+1}"); }}); + stack.push(new HashMap<String, Object>() {{ put("foo", "${1+1}"); put("bar", "${${1+2}}"); }}); Object s = TextParseUtil.translateVariables('$', "foo: ${foo}", stack, String.class, null, 2); assertEquals("foo: 2", s); + + s = TextParseUtil.translateVariables('$', "foo: ${bar}", stack, String.class, null, 1); + assertEquals("foo: ${${1+2}}", s); } public void testTranslateVariablesWithNull() {