Author: markt
Date: Tue Nov 10 00:31:25 2009
New Revision: 834286

URL: http://svn.apache.org/viewvc?rev=834286&view=rev
Log:
Add merge code for the remaining elements in web.xml

Modified:
    tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/startup/WebXml.java

Modified: tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties?rev=834286&r1=834285&r2=834286&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties Tue 
Nov 10 00:31:25 2009
@@ -115,9 +115,11 @@
 webXml.duplicateResourceRef=Duplicate resource-ref name
 webXml.reservedName=A web.xml file was detected using a reserved name [{0}]. 
The name element will be ignored for this fragment.
 webXml.mergeConflictDisplayName=The display name was defined in multiple 
fragments with different values including fragment with name [{0}] located at 
[{1}]
-webXml.mergeConflictErrorPage=The Error Page for [{0}] was defined in multiple 
fragments including fragment with name [{1}] located at [{2}]
-webXml.mergeConflictListener=Listener [{0}] was defined in multiple fragments 
including fragment with name [{1}] located at [{2}]
-webXml.mergeConflictLoginConfig=A LoginConfig was defined in multiple 
fragments including fragment with name [{1}] located at [{2}]
-webXml.mergeConflictResource=The Resource [{0}] was defined in multiple 
fragments including fragment with name [{1}] located at [{2}]
-webXml.mergeConflictString=The [{0}] with name [{1}] was defined in multiple 
fragments including fragment with name [{2}] located at [{3}]
+webXml.mergeConflictErrorPage=The Error Page for [{0}] was defined 
inconsistently in multiple fragments including fragment with name [{1}] located 
at [{2}]
+webXml.mergeConflictFilter=The Filter [{0}] was defined inconsistently in 
multiple fragments including fragment with name [{1}] located at [{2}]
+webXml.mergeConflictLoginConfig=A LoginConfig was defined inconsistently in 
multiple fragments including fragment with name [{1}] located at [{2}]
+webXml.mergeConflictResource=The Resource [{0}] was defined inconsistently in 
multiple fragments including fragment with name [{1}] located at [{2}]
+webXml.mergeConflictFilter=The Servlet [{0}] was defined inconsistently in 
multiple fragments including fragment with name [{1}] located at [{2}]
+webXml.mergeConflictSessionTimeout=The session timeout was defined 
inconsistently in multiple fragments with different values including fragment 
with name [{0}] located at [{1}]
+webXml.mergeConflictString=The [{0}] with name [{1}] was defined 
inconsistently in multiple fragments including fragment with name [{2}] located 
at [{3}]
 webXml.multipleOther=Multiple others entries in ordering

Modified: tomcat/trunk/java/org/apache/catalina/startup/WebXml.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/WebXml.java?rev=834286&r1=834285&r2=834286&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/WebXml.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/WebXml.java Tue Nov 10 
00:31:25 2009
@@ -250,6 +250,7 @@
         }
         welcomeFiles.add(welcomeFile);
     }
+    public Set<String> getWelcomeFiles() { return welcomeFiles; }
     
     // error-page
     private Map<String,ErrorPage> errorPages = new HashMap<String,ErrorPage>();
@@ -341,11 +342,12 @@
     // TODO: Should support multiple description elements with language
     // TODO: Should support multiple display-names elements with language
     // TODO: Should support multiple icon elements ???
-    private Set<ContextService> serviceRefs = new HashSet<ContextService>();
+    private Map<String,ContextService> serviceRefs =
+        new HashMap<String,ContextService>();
     public void addServiceRef(ContextService serviceRef) {
-        serviceRefs.add(serviceRef);
+        serviceRefs.put(serviceRef.getName(), serviceRef);
     }
-    public Set<ContextService> getServiceRefs() { return serviceRefs; }
+    public Map<String,ContextService> getServiceRefs() { return serviceRefs; }
     
     // resource-ref
     // TODO: Should support multiple description elements with language
@@ -512,7 +514,7 @@
         for (String role : securityRoles) {
             context.addSecurityRole(role);
         }
-        for (ContextService service : serviceRefs) {
+        for (ContextService service : serviceRefs.values()) {
             context.getNamingResources().addService(service);
         }
         for (ServletDef servlet : servlets.values()) {
@@ -660,6 +662,27 @@
         }
 
         for (WebXml fragment : fragments) {
+            for (Map.Entry<String,FilterDef> entry :
+                    fragment.getFilters().entrySet()) {
+                if (filters.containsKey(entry.getKey())) {
+                    mergeFilter(entry.getValue(),
+                            filters.get(entry.getKey()), false);
+                } else {
+                    if (!(mergeFilter(entry.getValue(),
+                            temp.getFilters().get(entry.getKey()), true))) {
+                        log.error(sm.getString(
+                                "webXml.mergeConflictFilter",
+                                entry.getKey(),
+                                fragment.getName(),
+                                fragment.getURL()));
+
+                        return false;
+                    }
+                }
+            }
+        }
+
+        for (WebXml fragment : fragments) {
             for (JspPropertyGroup jspPropertyGroup : 
fragment.getJspPropertyGroups()) {
                 // Always additive
                 addJspPropertyGroup(jspPropertyGroup);
@@ -757,8 +780,77 @@
             }
         }
 
+        for (WebXml fragment : fragments) {
+            if (!mergeResourceMap(fragment.getServiceRefs(), serviceRefs,
+                    temp.getServiceRefs(), mergeInjectionFlags, fragment)) {
+                return false;
+            }
+        }
+        serviceRefs.putAll(temp.getServiceRefs());
+        mergeInjectionFlags.clear();
+
+        for (WebXml fragment : fragments) {
+            for (Map.Entry<String,String> mapping :
+                    fragment.getServletMappings().entrySet()) {
+                // Always additive
+                addServletMapping(mapping.getKey(), mapping.getValue());
+            }
+        }
+
+        for (WebXml fragment : fragments) {
+            for (Map.Entry<String,ServletDef> entry :
+                    fragment.getServlets().entrySet()) {
+                if (servlets.containsKey(entry.getKey())) {
+                    mergeServlet(entry.getValue(),
+                            servlets.get(entry.getKey()), false);
+                } else {
+                    if (!(mergeServlet(entry.getValue(),
+                            temp.getServlets().get(entry.getKey()), true))) {
+                        log.error(sm.getString(
+                                "webXml.mergeConflictServlet",
+                                entry.getKey(),
+                                fragment.getName(),
+                                fragment.getURL()));
+
+                        return false;
+                    }
+                }
+            }
+        }
+
         
-        // TODO SERVLET3 - Merge remaining elements
+        if (sessionTimeout == null) {
+            for (WebXml fragment : fragments) {
+                Integer value = fragment.getSessionTimeout(); 
+                if (value != null) {
+                    if (temp.getSessionTimeout() == null) {
+                        temp.setSessionTimeout(value.toString());
+                    } else {
+                        log.error(sm.getString(
+                                "webXml.mergeConflictSessionTimeout",
+                                fragment.getName(),
+                                fragment.getURL()));
+                        return false;
+                    }
+                }
+            }
+            sessionTimeout = temp.getSessionTimeout();
+        }
+
+        for (WebXml fragment : fragments) {
+            if (!mergeMap(fragment.getTaglibs(), taglibs,
+                    temp.getTaglibs(), fragment, "Taglibs")) {
+                return false;
+            }
+        }
+        taglibs.putAll(temp.getTaglibs());
+
+        for (WebXml fragment : fragments) {
+            for (String welcomeFile : fragment.getWelcomeFiles()) {
+                // Always additive
+                addWelcomeFile(welcomeFile);
+            }
+        }
 
         return true;
     }
@@ -828,4 +920,88 @@
         }
         return true;
     }
+    
+    private boolean mergeFilter(FilterDef src, FilterDef dest, boolean 
failOnConflict) {
+        if (src.isAsyncSupported() != dest.isAsyncSupported()) {
+            // Always fail
+            return false;
+        }
+        
+        if (dest.getFilterClass()  == null) {
+            dest.setFilterClass(src.getFilterClass());
+        } else if (src.getFilterClass() != null) {
+            if (failOnConflict &&
+                    !src.getFilterClass().equals(dest.getFilterClass())) {
+                return false;
+            }
+        }
+        
+        for (Map.Entry<String,String> srcEntry :
+                src.getParameterMap().entrySet()) {
+            if (dest.getParameterMap().containsKey(srcEntry.getKey())) {
+                if (failOnConflict && !dest.getParameterMap().get(
+                        srcEntry.getKey()).equals(srcEntry.getValue())) {
+                    return false;
+                }
+            } else {
+                dest.addInitParameter(srcEntry.getKey(), srcEntry.getValue());
+            }
+        }
+        return true;
+    }
+    
+    private boolean mergeServlet(ServletDef src, ServletDef dest, boolean 
failOnConflict) {
+        // These tests should be unnecessary...
+        if (dest.getServletClass() != null && dest.getJspFile() != null) {
+            return false;
+        }
+        if (src.getServletClass() != null && src.getJspFile() != null) {
+            return false;
+        }
+        
+        
+        if (dest.getServletClass() == null && dest.getJspFile() == null) {
+            dest.setServletClass(src.getServletClass());
+            dest.setJspFile(src.getJspFile());
+        } else if (failOnConflict) {
+            if (src.getServletClass() != null &&
+                    (dest.getJspFile() != null ||
+                            
!src.getServletClass().equals(dest.getServletClass()))) {
+                return false;
+            }
+            if (src.getJspFile() != null &&
+                    (dest.getServletClass() != null ||
+                            !src.getJspFile().equals(dest.getJspFile()))) {
+                return false;
+            }
+        }
+        
+        // Additive
+        for (SecurityRoleRef securityRoleRef : src.getSecurityRoleRefs()) {
+            dest.addSecurityRoleRef(securityRoleRef);
+        }
+        
+        if (dest.getLoadOnStartup() == null) {
+            dest.setLoadOnStartup(src.getServletClass());
+        } else if (src.getLoadOnStartup() != null) {
+            if (failOnConflict &&
+                    !src.getLoadOnStartup().equals(dest.getLoadOnStartup())) {
+                return false;
+            }
+        }
+        
+        for (Map.Entry<String,String> srcEntry :
+                src.getParameterMap().entrySet()) {
+            if (dest.getParameterMap().containsKey(srcEntry.getKey())) {
+                if (failOnConflict && !dest.getParameterMap().get(
+                        srcEntry.getKey()).equals(srcEntry.getValue())) {
+                    return false;
+                }
+            } else {
+                dest.addInitParameter(srcEntry.getKey(), srcEntry.getValue());
+            }
+        }
+        return true;
+    }
+
 }



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

Reply via email to