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