Add FilterMaps to the web.xml file merge process
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Wed, 28 Oct 2009 12:27:42 +0000 (12:27 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Wed, 28 Oct 2009 12:27:42 +0000 (12:27 +0000)
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@830514 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/catalina/deploy/FilterMap.java
java/org/apache/catalina/startup/WebXml.java

index 0fc750b..1c53d46 100644 (file)
@@ -37,7 +37,8 @@ import javax.servlet.DispatcherType;
 
 public class FilterMap implements Serializable {
 
-
+    private static final long serialVersionUID = 1L;
+    
     // ------------------------------------------------------------- Properties
 
 
@@ -99,6 +100,15 @@ public class FilterMap implements Serializable {
         }
     }
 
+    public void addServletNames(String[] servletNames) {
+        if (servletNames != null) {
+            for (int i = 0; i < servletNames.length; i++) {
+                addServletName(servletNames[i]);
+            }
+        }
+    }
+
+
     
     /**
      * The flag that indicates this mapping will match all url-patterns
@@ -140,6 +150,14 @@ public class FilterMap implements Serializable {
         }
     }
     
+    public void addUrlPatterns(String[] urlPatterns) {
+        if (urlPatterns != null) {
+            for (int i = 0; i < urlPatterns.length; i++) {
+                addURLPattern(urlPatterns[i]);
+            }
+        }
+    }
+
     /**
      *
      * This method will be used to set the current state of the FilterMap
@@ -217,11 +235,15 @@ public class FilterMap implements Serializable {
     
     public int getDispatcherMapping() {
         // per the SRV.6.2.5 absence of any dispatcher elements is
-        // equivelant to a REQUEST value
+        // equivalent to a REQUEST value
         if (dispatcherMapping == NOT_SET) return REQUEST;
         else return dispatcherMapping; 
     }
 
+    public void addDispatcherMapping(int dispatcherMapping) {
+        // Merge the supplied mapping with the current mapping
+        this.dispatcherMapping =  getDispatcherMapping() | dispatcherMapping;
+    }
 
     // --------------------------------------------------------- Public Methods
 
index 4c5c149..63ca166 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.catalina.startup;
 import java.net.URL;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
@@ -170,7 +171,8 @@ public class WebXml {
     // TODO: Should support multiple display-name elements with language
     // TODO: Should support multiple icon elements
     // TODO: Description for init-param is ignored
-    private Map<String,FilterDef> filters = new HashMap<String,FilterDef>();
+    private Map<String,FilterDef> filters =
+        new LinkedHashMap<String,FilterDef>();
     public void addFilter(FilterDef filter) {
         if (filters.containsKey(filter.getFilterName())) {
             // Filter names must be unique within a web(-fragment).xml
@@ -182,11 +184,11 @@ public class WebXml {
     public Map<String,FilterDef> getFilters() { return filters; }
     
     // filter-mapping
-    private Set<FilterMap> filterMaps = new HashSet<FilterMap>();
+    private Map<String,FilterMap> filterMaps = new HashMap<String,FilterMap>();
     public void addFilterMapping(FilterMap filterMap) {
-        filterMaps.add(filterMap);
+        filterMaps.put(filterMap.getFilterName(),filterMap);
     }
-    public Set<FilterMap> getFilterMappings() { return filterMaps; }
+    public Map<String,FilterMap> getFilterMappings() { return filterMaps; }
     
     // listener
     // TODO: description (multiple with language) is ignored
@@ -468,7 +470,7 @@ public class WebXml {
         for (FilterDef filter : filters.values()) {
             context.addFilterDef(filter);
         }
-        for (FilterMap filterMap : filterMaps) {
+        for (FilterMap filterMap : filterMaps.values()) {
             context.addFilterMap(filterMap);
         }
         // jsp-property-group needs to be after servlet configuration
@@ -771,6 +773,25 @@ public class WebXml {
         }
         errorPages.putAll(temp.getErrorPages());
 
+        for (WebXml fragment : fragments) {
+            for (String filterName : fragment.getFilterMappings().keySet()) {
+                FilterMap filterMap =
+                    fragment.getFilterMappings().get(filterName);
+                // Always additive
+                if (filterMaps.containsKey(filterName)) {
+                    FilterMap appFilterMap = filterMaps.get(filterName);
+                    
+                    appFilterMap.addDispatcherMapping(
+                            filterMap.getDispatcherMapping());
+                    appFilterMap.addServletNames(filterMap.getServletNames());
+                    appFilterMap.addUrlPatterns(filterMap.getURLPatterns());
+                } else {
+                    addFilterMapping(filterMap);
+                }
+            }
+        }
+
+        
         // TODO SERVLET3 - Merge remaining elements
 
         for (WebXml fragment : fragments) {