Author: apetrelli
Date: Sun Mar 14 14:54:04 2010
New Revision: 922874

URL: http://svn.apache.org/viewvc?rev=922874&view=rev
Log:
TILES-502
Merge from trunk to tiles3 in sandbox.
Applied patch by Mck SembWever.

Modified:
    tiles/sandbox/trunk/tiles3/   (props changed)
    
tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java
    
tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java
    tiles/sandbox/trunk/tiles3/tiles-test-pom/tiles-test/   (props changed)
    
tiles/sandbox/trunk/tiles3/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tools.xml
   (props changed)

Propchange: tiles/sandbox/trunk/tiles3/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Mar 14 14:54:04 2010
@@ -1 +1 @@
-/tiles/framework/trunk:829356,836356,880940,880948,887758,900938-902966,904552
+/tiles/framework/trunk:829356,836356,880940,880948,887758,900938-902966,904552,921998

Modified: 
tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java
URL: 
http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java?rev=922874&r1=922873&r2=922874&view=diff
==============================================================================
--- 
tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java
 (original)
+++ 
tiles/sandbox/trunk/tiles3/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java
 Sun Mar 14 14:54:04 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();
@@ -201,8 +209,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/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java
URL: 
http://svn.apache.org/viewvc/tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java?rev=922874&r1=922873&r2=922874&view=diff
==============================================================================
--- 
tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java
 (original)
+++ 
tiles/sandbox/trunk/tiles3/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java
 Sun Mar 14 14:54:04 2010
@@ -173,4 +173,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());
+    }
 }

Propchange: tiles/sandbox/trunk/tiles3/tiles-test-pom/tiles-test/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Mar 14 14:54:04 2010
@@ -1,3 +1,3 @@
-/tiles/framework/trunk/tiles-test-pom/tiles-test:829356,836356,880940,880948,887758,900938-902966,904552
+/tiles/framework/trunk/tiles-test-pom/tiles-test:829356,836356,880940,880948,887758,900938-902966,904552,921998
 /tiles/sandbox/trunk/tiles-test:740289
 /tiles/sandbox/trunk/tiles-test-sandbox:740290-745038,747727-751891

Propchange: 
tiles/sandbox/trunk/tiles3/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tools.xml
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Mar 14 14:54:04 2010
@@ -1 +1 @@
-/tiles/framework/trunk/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tools.xml:829356,836356,880940,880948,887758,900938-902966,904552
+/tiles/framework/trunk/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tools.xml:829356,836356,880940,880948,887758,900938-902966,904552,921998


Reply via email to