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 2009/06/12 19:32:49 UTC

svn commit: r784213 - in /tiles/framework/trunk: src/site/apt/tutorial/advanced/ tiles-core/src/main/java/org/apache/tiles/definition/pattern/ tiles-core/src/test/java/org/apache/tiles/definition/pattern/

Author: apetrelli
Date: Fri Jun 12 17:32:49 2009
New Revision: 784213

URL: http://svn.apache.org/viewvc?rev=784213&view=rev
Log:
TILES-419
Added Regexp support for wildcard matching and added docs.

Added:
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolver.java   (with props)
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolverTest.java   (with props)
Modified:
    tiles/framework/trunk/src/site/apt/tutorial/advanced/wildcard.apt

Modified: tiles/framework/trunk/src/site/apt/tutorial/advanced/wildcard.apt
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/src/site/apt/tutorial/advanced/wildcard.apt?rev=784213&r1=784212&r2=784213&view=diff
==============================================================================
--- tiles/framework/trunk/src/site/apt/tutorial/advanced/wildcard.apt (original)
+++ tiles/framework/trunk/src/site/apt/tutorial/advanced/wildcard.apt Fri Jun 12 17:32:49 2009
@@ -23,8 +23,12 @@
 
 Wildcard support
 
-  By default, Tiles 2.1 supports wildcards in definition names. Wilcards help a
-  lot in writing less code to declare your definitions. Take this example:
+  By default, Tiles 2.2 supports wildcards in definition names. Wilcards help a
+  lot in writing less code to declare your definitions.
+
+  There are two styles:
+
+  * the wildcard-based style (available by default):
 
 ------------------------------------
 <definition name="test.definition*.message*" template="/layout{1}.jsp">
@@ -34,7 +38,21 @@
 </definition>
 ------------------------------------
 
-  If you insert a definition that matches the definition, for example:
+  * the regular expression style (notice the ~ character that indicates that a regexp will be used), available by calling
+  {{{../../apidocs/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAO.html#setPatternDefinitionResolver(org.apache.tiles.definition.pattern.PatternDefinitionResolver)}CachingLocaleUrlDefinitionDAO.setPatternDefinitionResolver}}
+  with an instance of
+  {{{../../apidocs/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolver.html}RegexpPatternDefinitionResolver}}
+  :
+
+------------------------------------
+<definition name="~test\.definition(.*)\.message(.*)" template="/layout{1}.jsp">
+    <put-attribute name="title"  value="This definition has a message: {2}."/>
+    <put-attribute name="header" value="/header.jsp"/>
+    <put-attribute name="body"   value="/body.jsp"/>
+</definition>
+------------------------------------
+
+  In both cases, if you insert a definition that matches the definition, for example:
 
 ------------------------------------
 <tiles:insertDefinition name="test.definitionOne.messageThisIsAMessage" />

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolver.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolver.java?rev=784213&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolver.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolver.java Fri Jun 12 17:32:49 2009
@@ -0,0 +1,128 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tiles.definition.pattern;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.tiles.Definition;
+
+/**
+ * Matches definition patterns through the use of regular expressions. To allow the use of regular expression,
+ * remember to set the definition name with a tilde (~) as the first character.
+ *
+ * @param <T> The customization key class.
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class RegexpPatternDefinitionResolver<T> implements
+        PatternDefinitionResolver<T> {
+
+    /**
+     * Maps a customization key to a pattern mapping list.
+     */
+    private Map<T, List<PatternMapping>> key2patternMappingList = new HashMap<T, List<PatternMapping>>();
+
+    /** {@inheritDoc} */
+    public Definition resolveDefinition(String name, T customizationKey) {
+        Definition retValue = null;
+        List<PatternMapping> mappings = key2patternMappingList.get(customizationKey);
+        if (mappings != null) {
+            for (PatternMapping mapping : mappings) {
+                Matcher matcher = mapping.pattern.matcher(name);
+                if (matcher.matches()) {
+                    int groupCount = matcher.groupCount() + 1;
+                    Object[] vars = new Object[groupCount];
+                    for (int i = 0; i < groupCount; i++) {
+                        vars[i] = matcher.group(i);
+                    }
+                    retValue = PatternUtil.replaceDefinition(mapping.definition, name, vars);
+                    break;
+                }
+            }
+        }
+        return retValue;
+    }
+
+    /** {@inheritDoc} */
+    public void storeDefinitionPatterns(Map<String, Definition> localeDefsMap,
+            T customizationKey) {
+        List<PatternMapping> patternMappingList = key2patternMappingList.get(customizationKey);
+        if (patternMappingList == null) {
+            patternMappingList = new ArrayList<PatternMapping>();
+            key2patternMappingList.put(customizationKey, patternMappingList);
+        }
+        addRegexpMappings(localeDefsMap, patternMappingList);
+    }
+
+    /**
+     * Adds the regular expression mappings.
+     *
+     * @param localeDefsMap The map containing the definitions.
+     * @param patternMappingList The list of pattern mapping.
+     */
+    private void addRegexpMappings(Map<String, Definition> localeDefsMap,
+            List<PatternMapping> patternMappingList) {
+        for (Map.Entry<String, Definition> entry: localeDefsMap.entrySet()) {
+            String name = entry.getKey();
+            if (name.startsWith("~")) {
+                patternMappingList.add(new PatternMapping(name.substring(1),
+                        entry.getValue()));
+            }
+        }
+    }
+
+    /**
+     * Maps a pattern to a definition.
+     *
+     * @version $Rev$ $Date$
+     * @since 2.2.0
+     */
+    private static class PatternMapping {
+
+        /**
+         * The pattern.
+         */
+        private Pattern pattern;
+
+        /**
+         * The definition.
+         */
+        private Definition definition;
+
+        /**
+         * Constructor.
+         *
+         * @param regexp The regular expression for the pattern.
+         * @param definition The definition.
+         * @since 2.2.0
+         */
+        public PatternMapping(String regexp, Definition definition) {
+            pattern = Pattern.compile(regexp);
+            this.definition = definition;
+        }
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolver.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolverTest.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolverTest.java?rev=784213&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolverTest.java (added)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolverTest.java Fri Jun 12 17:32:49 2009
@@ -0,0 +1,74 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tiles.definition.pattern;
+
+import static org.junit.Assert.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tiles.Attribute;
+import org.apache.tiles.Definition;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests {@link RegexpPatternDefinitionResolver}.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.2.0
+ */
+public class RegexpPatternDefinitionResolverTest {
+
+    /**
+     * The resolver to test.
+     */
+    private RegexpPatternDefinitionResolver<Integer> resolver;
+
+    /**
+     * Sets up the resolver.
+     */
+    @Before
+    public void setUp() {
+        resolver = new RegexpPatternDefinitionResolver<Integer>();
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.definition.pattern.RegexpPatternDefinitionResolver#resolveDefinition(java.lang.String, java.lang.Object)}.
+     */
+    @Test
+    public void testResolveDefinition() {
+        Integer key = 1;
+        Map<String, Definition> defsMap = new HashMap<String, Definition>();
+        Definition def = new Definition();
+        def.setName("~testDef(.*)\\.message(.*)");
+        def.setTemplateAttribute(Attribute.createTemplateAttribute("/test{1}.jsp"));
+        def.putAttribute("body", new Attribute("message{2}"));
+        defsMap.put("~testDef(.*)\\.message(.*)", def);
+        resolver.storeDefinitionPatterns(defsMap, key);
+        Definition result = resolver.resolveDefinition("testDefOne.messageTwo", key);
+        assertNotNull(result);
+        assertEquals("testDefOne.messageTwo", result.getName());
+        assertEquals("/testOne.jsp", result.getTemplateAttribute().getValue());
+        assertEquals("messageTwo", result.getAttribute("body").getValue());
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolverTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/pattern/RegexpPatternDefinitionResolverTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL