You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tiles.apache.org by ap...@apache.org on 2010/03/11 20:58:08 UTC
svn commit: r921998 - in /tiles/framework/trunk/tiles-core/src:
main/java/org/apache/tiles/definition/pattern/PatternUtil.java
test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java
Author: apetrelli
Date: Thu Mar 11 19:58:08 2010
New Revision: 921998
URL: http://svn.apache.org/viewvc?rev=921998&view=rev
Log:
TILES-502
Applied patch by Mck SembWever.
Modified:
tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java
tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java
Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java?rev=921998&r1=921997&r2=921998&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java Thu Mar 11 19:58:08 2010
@@ -27,6 +27,8 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.apache.tiles.Attribute;
import org.apache.tiles.Definition;
@@ -47,6 +49,10 @@ public final class PatternUtil {
*/
private static final Locale ROOT_LOCALE = new Locale("", "");
+ /** Pattern to find {.*} occurrences that do not match {[0-9]+} so to prevent MessageFormat from crashing.
+ */
+ private static final Pattern INVALID_FORMAT_ELEMENT = Pattern.compile("\\Q{\\E[\\D^}]+\\Q}\\E");
+
/**
* Private constructor to avoid instantiation.
*/
@@ -157,7 +163,9 @@ public final class PatternUtil {
nuattr.setRenderer(attr.getRenderer());
Expression expressionObject = attr.getExpressionObject();
if (expressionObject != null) {
- nuattr.setExpressionObject(new Expression(expressionObject));
+ Expression newExpressionObject = Expression
+ .createExpression(replace(expressionObject.getExpression(), vars), expressionObject.getLanguage());
+ nuattr.setExpressionObject(newExpressionObject);
}
Object value = attr.getValue();
@@ -207,8 +215,17 @@ public final class PatternUtil {
*/
private static String replace(String st, Object... vars) {
if (st != null && st.indexOf('{') >= 0) {
- MessageFormat format = new MessageFormat(st, ROOT_LOCALE);
- return format.format(vars, new StringBuffer(), null).toString();
+ // remember the invalid "{...}" occurrences
+ Matcher m = INVALID_FORMAT_ELEMENT.matcher(st);
+ // replace them with markers
+ st = INVALID_FORMAT_ELEMENT.matcher(st).replaceAll("INVALID_FORMAT_ELEMENT");
+ // do the MessageFormat replacement (escaping quote characters)
+ st = new MessageFormat(st.replaceAll("'", "'''"), ROOT_LOCALE)
+ .format(vars, new StringBuffer(), null).toString();
+ // return the markers to their original invalid occurrences
+ while (m.find()) {
+ st = st.replaceFirst("INVALID_FORMAT_ELEMENT", m.group());
+ }
}
return st;
}
Modified: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java?rev=921998&r1=921997&r2=921998&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java Thu Mar 11 19:58:08 2010
@@ -174,4 +174,22 @@ public class PatternUtilTest {
assertEquals("value1", extractedMap.get(1));
assertEquals("value2", extractedMap.get(2));
}
+
+ /**
+ * Test method for
+ * {@link PatternUtil#replacePlaceholders(Definition, String, Object[])}.
+ * See TILES-502
+ */
+ @Test
+ public void testReplacePlaceholdersEL() {
+ Map<String, Attribute> attributes = new HashMap<String, Attribute>();
+ attributes.put("something", new Attribute("some-{1}-${requestScope.someVariable}.jsp"));
+ Definition definition = new Definition("definitionName", new Attribute(
+ "template"), attributes);
+ Definition nudef = PatternUtil.replacePlaceholders(definition, "nudef",
+ "value0", "value1", "value2", "value3");
+ assertEquals("nudef", nudef.getName());
+ Attribute attribute = nudef.getAttribute("something");
+ assertEquals("some-value1-${requestScope.someVariable}.jsp", attribute.getValue());
+ }
}