You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/10/03 19:27:42 UTC

svn commit: r1004006 - in /tomcat/trunk: java/org/apache/catalina/deploy/ java/org/apache/catalina/startup/ test/org/apache/catalina/core/ test/org/apache/catalina/startup/ test/webapp-3.0/WEB-INF/

Author: markt
Date: Sun Oct  3 17:27:42 2010
New Revision: 1004006

URL: http://svn.apache.org/viewvc?rev=1004006&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49922
Don't map filter twice if filter matches multiple mapping.

Modified:
    tomcat/trunk/java/org/apache/catalina/deploy/FilterMap.java
    tomcat/trunk/java/org/apache/catalina/deploy/WebXml.java
    tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
    tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java
    tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java
    tomcat/trunk/test/webapp-3.0/WEB-INF/web.xml

Modified: tomcat/trunk/java/org/apache/catalina/deploy/FilterMap.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/FilterMap.java?rev=1004006&r1=1004005&r2=1004006&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/deploy/FilterMap.java (original)
+++ tomcat/trunk/java/org/apache/catalina/deploy/FilterMap.java Sun Oct  3 17:27:42 2010
@@ -80,7 +80,11 @@ public class FilterMap implements Serial
     private String[] servletNames = new String[0];
 
     public String[] getServletNames() {
-        return (this.servletNames);
+        if (matchAllServletNames) {
+            return new String[] {};
+        } else {
+            return (this.servletNames);
+        }
     }
 
     public void addServletName(String servletName) {
@@ -121,7 +125,11 @@ public class FilterMap implements Serial
     private String[] urlPatterns = new String[0];
 
     public String[] getURLPatterns() {
-        return (this.urlPatterns);
+        if (matchAllUrlPatterns) {
+            return new String[] {};
+        } else {
+            return (this.urlPatterns);
+        }
     }
 
     public void addURLPattern(String urlPattern) {

Modified: tomcat/trunk/java/org/apache/catalina/deploy/WebXml.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/WebXml.java?rev=1004006&r1=1004005&r2=1004006&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/deploy/WebXml.java (original)
+++ tomcat/trunk/java/org/apache/catalina/deploy/WebXml.java Sun Oct  3 17:27:42 2010
@@ -278,13 +278,37 @@ public class WebXml {
     public Map<String,FilterDef> getFilters() { return filters; }
     
     // filter-mapping
-    private Set<FilterMap> filterMaps = new LinkedHashSet<FilterMap>();
-    private Set<String> filterMappingNames = new HashSet<String>();
+    private Map<String,FilterMap> filterMaps =
+        new LinkedHashMap<String,FilterMap>();
     public void addFilterMapping(FilterMap filterMap) {
-        filterMaps.add(filterMap);
-        filterMappingNames.add(filterMap.getFilterName());
+        FilterMap fm = filterMaps.get(filterMap.getFilterName());
+        if (fm == null) {
+            filterMaps.put(filterMap.getFilterName(), filterMap);
+        } else {
+            for (String dispatcher : filterMap.getDispatcherNames()) {
+                fm.setDispatcher(dispatcher);
+            }
+            if (!fm.getMatchAllServletNames()) {
+                if (filterMap.getMatchAllServletNames()) {
+                    fm.addServletName("*");
+                } else {
+                    for (String servletName : filterMap.getServletNames()) {
+                        fm.addServletName(servletName);
+                    }
+                }
+            }
+            if (!fm.getMatchAllUrlPatterns()) {
+                if (filterMap.getMatchAllUrlPatterns()) {
+                    fm.addURLPattern("*");
+                } else {
+                    for (String urlPattern : filterMap.getURLPatterns()) {
+                        fm.addURLPattern(urlPattern);
+                    }
+                }
+            }
+        }
     }
-    public Set<FilterMap> getFilterMappings() { return filterMaps; }
+    public Map<String,FilterMap> getFilterMappings() { return filterMaps; }
     
     // listener
     // TODO: description (multiple with language) is ignored
@@ -627,7 +651,7 @@ public class WebXml {
         }
         sb.append('\n');
 
-        for (FilterMap filterMap : filterMaps) {
+        for (FilterMap filterMap : filterMaps.values()) {
             sb.append("  <filter-mapping>\n");
             appendElement(sb, INDENT4, "filter-name",
                     filterMap.getFilterName());
@@ -1176,7 +1200,7 @@ public class WebXml {
             }
             context.addFilterDef(filter);
         }
-        for (FilterMap filterMap : filterMaps) {
+        for (FilterMap filterMap : filterMaps.values()) {
             context.addFilterMap(filterMap);
         }
         for (JspPropertyGroup jspPropertyGroup : jspPropertyGroups) {
@@ -1418,17 +1442,16 @@ public class WebXml {
         // main web.xml override those in fragments and those in fragments
         // override mappings in annotations
         for (WebXml fragment : fragments) {
-            Iterator<FilterMap> iterFilterMaps =
-                fragment.getFilterMappings().iterator();
+            Iterator<String> iterFilterMaps =
+                fragment.getFilterMappings().keySet().iterator();
             while (iterFilterMaps.hasNext()) {
-                FilterMap filterMap = iterFilterMaps.next();
-                if (filterMappingNames.contains(filterMap.getFilterName())) {
+                if (filterMaps.containsKey(iterFilterMaps.next())) {
                     iterFilterMaps.remove();
                 }
             }
         }
         for (WebXml fragment : fragments) {
-            for (FilterMap filterMap : fragment.getFilterMappings()) {
+            for (FilterMap filterMap : fragment.getFilterMappings().values()) {
                 // Additive
                 addFilterMapping(filterMap);
             }

Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=1004006&r1=1004005&r2=1004006&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Sun Oct  3 17:27:42 2010
@@ -33,6 +33,7 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -2192,7 +2193,7 @@ public class ContextConfig
             fragment.addFilterMapping(filterMap);
         }
         if (urlPatternsSet || dispatchTypesSet) {
-            Set<FilterMap> fmap = fragment.getFilterMappings();
+            Collection<FilterMap> fmap = fragment.getFilterMappings().values();
             FilterMap descMap = null;
             for (FilterMap map : fmap) {
                 if (filterName.equals(map.getFilterName())) {

Modified: tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java?rev=1004006&r1=1004005&r2=1004006&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java (original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java Sun Oct  3 17:27:42 2010
@@ -26,6 +26,9 @@ import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.deploy.FilterDef;
@@ -33,6 +36,7 @@ import org.apache.catalina.deploy.Filter
 import org.apache.catalina.startup.SimpleHttpClient;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
+import org.apache.tomcat.util.buf.ByteChunk;
 
 public class TestStandardContext extends TomcatBaseTest {
 
@@ -109,4 +113,69 @@ public class TestStandardContext extends
         }
         
     }
+
+
+    public void testBug49922() throws Exception {
+        
+        // Set up a container
+        Tomcat tomcat = getTomcatInstance();
+        
+        // Must have a real docBase - just use temp
+        // Use the normal Tomcat ROOT context
+        File root = new File("test/webapp-3.0");
+        tomcat.addWebapp("", root.getAbsolutePath());
+        
+        tomcat.start();
+
+        // Check path mapping works
+        ByteChunk result = getUrl("http://localhost:" + getPort() +
+        "/bug49922/foo");
+        // Filter should only have been called once
+        assertEquals("Filter", result.toString());
+
+        // Check extension mapping works
+        result = getUrl("http://localhost:" + getPort() +
+        "/foo.do");
+        // Filter should only have been called once
+        assertEquals("Filter", result.toString());
+
+        result = getUrl("http://localhost:" + getPort() +
+                "/bug49922/index.do");
+        // Filter should only have been called once
+        assertEquals("Filter", result.toString());
+    }
+
+    
+    public static final class Bug49922Filter implements Filter {
+        
+        @Override
+        public void destroy() {
+            // NOOP
+        }
+
+        @Override
+        public void doFilter(ServletRequest request, ServletResponse response,
+                FilterChain chain) throws IOException, ServletException {
+            response.setContentType("text/plain");
+            response.getWriter().print("Filter");
+            chain.doFilter(request, response);
+        }
+
+        @Override
+        public void init(FilterConfig filterConfig) throws ServletException {
+            // NOOP
+        }
+    }
+    
+    public static final class Bug49922Servlet extends HttpServlet {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+                throws ServletException, IOException {
+            // NOOP
+        }
+        
+    }
 }

Modified: tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java?rev=1004006&r1=1004005&r2=1004006&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java (original)
+++ tomcat/trunk/test/org/apache/catalina/startup/TestContextConfigAnnotation.java Sun Oct  3 17:27:42 2010
@@ -18,7 +18,7 @@ package org.apache.catalina.startup;
 
 import java.io.File;
 import java.net.URL;
-import java.util.Set;
+import java.util.Collection;
 
 import javax.servlet.DispatcherType;
 
@@ -201,7 +201,8 @@ public class TestContextConfigAnnotation
         assertNotNull(fdef);
         assertEquals(filterDef,fdef);
         assertEquals("tomcat",fdef.getParameterMap().get("message"));
-        Set<FilterMap> filterMappings = webxml.getFilterMappings();
+        Collection<FilterMap> filterMappings =
+            webxml.getFilterMappings().values();
         assertTrue(filterMappings.contains(filterMap));
         // annotation mapping not added s. Servlet Spec 3.0 (Nov 2009)
         // 8.2.3.3.vi page 81

Modified: tomcat/trunk/test/webapp-3.0/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0/WEB-INF/web.xml?rev=1004006&r1=1004005&r2=1004006&view=diff
==============================================================================
--- tomcat/trunk/test/webapp-3.0/WEB-INF/web.xml (original)
+++ tomcat/trunk/test/webapp-3.0/WEB-INF/web.xml Sun Oct  3 17:27:42 2010
@@ -27,6 +27,37 @@
      Used as part of the Tomcat unit tests when a full web application is
      required.
   </description>
+  
+  <!--  Bug 49922 -->
+  <filter>
+    <filter-name>Bug49922</filter-name>
+    <filter-class>
+      org.apache.catalina.core.TestStandardContext$Bug49922Filter
+    </filter-class>
+  </filter>
+  <filter-mapping>
+    <filter-name>Bug49922</filter-name>
+    <url-pattern>/bug49922/*</url-pattern>
+  </filter-mapping>
+  <filter-mapping>
+    <filter-name>Bug49922</filter-name>
+    <url-pattern>*.do</url-pattern>
+  </filter-mapping>
+  <servlet>
+    <servlet-name>Bug49922</servlet-name>
+    <servlet-class>
+      org.apache.catalina.core.TestStandardContext$Bug49922Servlet
+    </servlet-class>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>Bug49922</servlet-name>
+    <url-pattern>/bug49922/*</url-pattern>
+  </servlet-mapping>
+  <servlet-mapping>
+    <servlet-name>Bug49922</servlet-name>
+    <url-pattern>*.do</url-pattern>
+  </servlet-mapping>
+  
   <jsp-config>
     <jsp-property-group>
       <default-content-type>text/plain</default-content-type>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org