From: markt Date: Sat, 3 Apr 2010 12:41:31 +0000 (+0000) Subject: TCK failures: If a servlet/filter has any mappings in the main web.xml, these overrid... X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=f800271615e0c93f0168d8ab9ec604f1b967d9bc;p=tomcat7.0 TCK failures: If a servlet/filter has any mappings in the main web.xml, these override rather than replace the mappings defined in the fragments. The same goes for fragments and annotations. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@930514 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/deploy/WebXml.java b/java/org/apache/catalina/deploy/WebXml.java index 7f8ce3681..7ee63f67c 100644 --- a/java/org/apache/catalina/deploy/WebXml.java +++ b/java/org/apache/catalina/deploy/WebXml.java @@ -272,8 +272,10 @@ public class WebXml { // filter-mapping private Set filterMaps = new LinkedHashSet(); + private Set filterMappingNames = new HashSet(); public void addFilterMapping(FilterMap filterMap) { filterMaps.add(filterMap); + filterMappingNames.add(filterMap.getFilterName()); } public Set getFilterMappings() { return filterMaps; } @@ -301,8 +303,10 @@ public class WebXml { // servlet-mapping private Map servletMappings = new HashMap(); + private Set servletMappingNames = new HashSet(); public void addServletMapping(String urlPattern, String servletName) { servletMappings.put(urlPattern, servletName); + servletMappingNames.add(servletName); } public Map getServletMappings() { return servletMappings; } @@ -1407,9 +1411,22 @@ public class WebXml { } errorPages.putAll(temp.getErrorPages()); + // As per 'clarification' from the Servlet EG, filter mappings in the + // main web.xml override those in fragments and those in fragments + // override mappings in annotations + for (WebXml fragment : fragments) { + Iterator iterFilterMaps = + fragment.getFilterMappings().iterator(); + while (iterFilterMaps.hasNext()) { + FilterMap filterMap = iterFilterMaps.next(); + if (filterMappingNames.contains(filterMap.getFilterName())) { + iterFilterMaps.remove(); + } + } + } for (WebXml fragment : fragments) { for (FilterMap filterMap : fragment.getFilterMappings()) { - // Always additive + // Additive addFilterMapping(filterMap); } } @@ -1550,10 +1567,23 @@ public class WebXml { serviceRefs.putAll(temp.getServiceRefs()); mergeInjectionFlags.clear(); + // As per 'clarification' from the Servlet EG, servlet mappings in the + // main web.xml override those in fragments and those in fragments + // override mappings in annotations + for (WebXml fragment : fragments) { + Iterator> iterServletMaps = + fragment.getServletMappings().entrySet().iterator(); + while (iterServletMaps.hasNext()) { + Map.Entry servletMap = iterServletMaps.next(); + if (servletMappingNames.contains(servletMap.getValue())) { + iterServletMaps.remove(); + } + } + } for (WebXml fragment : fragments) { for (Map.Entry mapping : fragment.getServletMappings().entrySet()) { - // Always additive + // Additive addServletMapping(mapping.getKey(), mapping.getValue()); } } diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java index 25faae0e9..b248c6832 100644 --- a/java/org/apache/catalina/startup/ContextConfig.java +++ b/java/org/apache/catalina/startup/ContextConfig.java @@ -32,6 +32,7 @@ import java.net.URLConnection; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Properties; import java.util.Set; @@ -1210,7 +1211,7 @@ public class ContextConfig // Have to process JARs for fragments Map fragments = processJarsForWebFragments(); - // Merge the fragments into the main web.xml + // Order the fragments Set orderedFragments = WebXml.orderWebFragments(webXml, fragments); @@ -1454,8 +1455,13 @@ public class ContextConfig protected void processAnnotations(Set fragments) { for(WebXml fragment : fragments) { if (!fragment.isMetadataComplete()) { + WebXml annotations = new WebXml(); URL url = fragment.getURL(); - processAnnotationsUrl(url, fragment); + processAnnotationsUrl(url, annotations); + Set set = new HashSet(); + set.add(annotations); + // Merge annotations into fragment - fragment takes priority + fragment.merge(set); } } }