You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by dd...@apache.org on 2006/12/18 22:54:38 UTC

svn commit: r488435 - /struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/web/TilesDecorationFilter.java

Author: ddewolf
Date: Mon Dec 18 13:54:38 2006
New Revision: 488435

URL: http://svn.apache.org/viewvc?view=rev&rev=488435
Log:
adding flexibility to apply different tiles to different subtrees

Modified:
    struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/web/TilesDecorationFilter.java

Modified: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/web/TilesDecorationFilter.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/web/TilesDecorationFilter.java?view=diff&rev=488435&r1=488434&r2=488435
==============================================================================
--- struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/web/TilesDecorationFilter.java (original)
+++ struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/web/TilesDecorationFilter.java Mon Dec 18 13:54:38 2006
@@ -38,6 +38,9 @@
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
+import java.util.Map;
+import java.util.Enumeration;
+import java.util.HashMap;
 
 /**
  * Decoration Filter.  Intercepts all requests and decorates them
@@ -86,6 +89,8 @@
 
     private String definitionName = "layout";
 
+    private Map<String, String> alternateDefinitions;
+
     private ComponentContextMutator mutator = null;
 
     public FilterConfig getFilterConfig() {
@@ -108,6 +113,8 @@
             definitionName = temp;
         }
 
+        alternateDefinitions = parseAlternateDefinitions();
+
         temp = config.getInitParameter("mutator");
         if(temp != null) {
             try {
@@ -120,6 +127,22 @@
         }
     }
 
+    protected Map<String, String> parseAlternateDefinitions() {
+        Map<String, String> map = new HashMap<String, String>();
+        Enumeration<String> e = filterConfig.getInitParameterNames();
+        while(e.hasMoreElements()) {
+            String parm = e.nextElement();
+            if(parm.startsWith("definition(") && parm.endsWith("*)")) {
+                String value = filterConfig.getInitParameter(parm);
+                String mask = parm.substring("definition(".length());
+                mask = mask.substring(0, mask.lastIndexOf("*)"));
+                map.put(mask, value);
+                LOG.info("Mapping all requests matching '"+mask+"*' to definition '"+value+"'");
+            }
+        }
+        return map;
+    }
+
     public void destroy() {
         filterConfig = null;
     }
@@ -130,13 +153,25 @@
         TilesContainer container = TilesAccess.getContainer(getServletContext());
         mutator.mutate(container.getComponentContext(req, res), req);
         try {
+            String definitionName = getDefinitionForRequest(req);
             container.render(req, res, definitionName);
         } catch (TilesException e) {
-            throw new ServletException("Error wrapping jsp with tile definition.", e);
+            throw new ServletException("Error wrapping jsp with tile definition. "+e.getMessage(), e);
         }
     }
 
-
+    private String getDefinitionForRequest(ServletRequest request) {
+        if(alternateDefinitions.size() < 1) {
+            return definitionName;
+        }
+        String base = getRequestBase(request);
+        for(Map.Entry<String, String> pair : alternateDefinitions.entrySet()) {
+            if(base.startsWith(pair.getKey())) {
+                return pair.getValue();
+            }
+        }
+        return definitionName;
+    }
 
     private String getRequestBase(ServletRequest request) {
         // Included Path