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());
+    }
 }