Merge code for a few more elements
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Sat, 24 Oct 2009 20:52:46 +0000 (20:52 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Sat, 24 Oct 2009 20:52:46 +0000 (20:52 +0000)
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@829448 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/catalina/deploy/ErrorPage.java
java/org/apache/catalina/startup/LocalStrings.properties
java/org/apache/catalina/startup/WebXml.java

index a29ec14..7e4e01f 100644 (file)
@@ -167,5 +167,12 @@ public class ErrorPage implements Serializable {
 
     }
 
+    public String getName() {
+        if (exceptionType == null) {
+            return Integer.toString(errorCode);
+        } else {
+            return exceptionType;
+        }
+    }
 
 }
index 45fc02e..8d77cbd 100644 (file)
@@ -117,5 +117,8 @@ webXml.reservedName=A web.xml file was detected using a reserved name [{0}]. The
 webXml.mergeConflictContextParam=Context parameter [{0}] was defined in multiple fragments with different values including fragment with name [{1}] located at [{2}]
 webXml.mergeConflictDisplayName=The display name was defined in multiple fragments with different values including fragment with name [{0}] located at [{1}]
 webXml.mergeConflictEjbLocalRef=The EjbLocalRef [{0}] was defined in multiple fragments including fragment with name [{1}] located at [{2}]
+webXml.mergeConflictEjbRef=The EjbRef [{0}] was defined in multiple fragments including fragment with name [{1}] located at [{2}]
+webXml.mergeConflictEnvEntry=The Environment entry [{0}] was defined in multiple fragments including fragment with name [{1}] located at [{2}]
+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.multipleOther=Multiple others entries in ordering
index e13e66f..4c5c149 100644 (file)
@@ -249,11 +249,11 @@ public class WebXml {
     }
     
     // error-page
-    private Set<ErrorPage> errorPages = new HashSet<ErrorPage>();
+    private Map<String,ErrorPage> errorPages = new HashMap<String,ErrorPage>();
     public void addErrorPage(ErrorPage errorPage) {
-        errorPages.add(errorPage);
+        errorPages.put(errorPage.getName(), errorPage);
     }
-    public Set<ErrorPage> getErrorPages() { return errorPages; }
+    public Map<String,ErrorPage> getErrorPages() { return errorPages; }
     
     // Digester will check there is only one jsp-config
     // jsp-config/taglib or taglib (2.3 and earlier)
@@ -317,9 +317,11 @@ public class WebXml {
     
     // ejb-ref
     // TODO: Should support multiple description elements with language
-    private Set<ContextEjb> ejbRefs = new HashSet<ContextEjb>();
-    public void addEjbRef(ContextEjb ejbRef) { ejbRefs.add(ejbRef); }
-    public Set<ContextEjb> getEjbRefs() { return ejbRefs; }
+    private Map<String,ContextEjb> ejbRefs = new HashMap<String,ContextEjb>();
+    public void addEjbRef(ContextEjb ejbRef) {
+        ejbRefs.put(ejbRef.getName(),ejbRef);
+    }
+    public Map<String,ContextEjb> getEjbRefs() { return ejbRefs; }
     
     // ejb-local-ref
     // TODO: Should support multiple description elements with language
@@ -454,13 +456,13 @@ public class WebXml {
         for (ContextLocalEjb ejbLocalRef : ejbLocalRefs.values()) {
             context.getNamingResources().addLocalEjb(ejbLocalRef);
         }
-        for (ContextEjb ejbRef : ejbRefs) {
+        for (ContextEjb ejbRef : ejbRefs.values()) {
             context.getNamingResources().addEjb(ejbRef);
         }
         for (ContextEnvironment environment : envEntries.values()) {
             context.getNamingResources().addEnvironment(environment);
         }
-        for (ErrorPage errorPage : errorPages) {
+        for (ErrorPage errorPage : errorPages.values()) {
             context.addErrorPage(errorPage);
         }
         for (FilterDef filter : filters.values()) {
@@ -574,6 +576,8 @@ public class WebXml {
         // Merge rules vary from element to element. See SRV.8.2.3
 
         WebXml temp = new WebXml();
+        Map<String,Boolean> mergeInjectionFlags =
+            new HashMap<String, Boolean>();
 
         for (WebXml fragment : fragments) {
             for (String contextParam : fragment.getContextParams().keySet()) {
@@ -625,9 +629,7 @@ public class WebXml {
                 }
             }
         }
-        
-        Map<String,Boolean> mergeInjectionFlags =
-            new HashMap<String, Boolean>();
+
         for (WebXml fragment : fragments) {
             for (ContextLocalEjb ejbLocalRef :
                     fragment.getEjbLocalRefs().values()) {
@@ -665,6 +667,109 @@ public class WebXml {
             }
         }
         ejbLocalRefs.putAll(temp.getEjbLocalRefs());
+        mergeInjectionFlags.clear();
+
+        for (WebXml fragment : fragments) {
+            for (ContextEjb ejbRef : fragment.getEjbRefs().values()) {
+                String name = ejbRef.getName();
+                boolean mergeInjectionFlag = false;
+                if (ejbRefs.containsKey(name)) {
+                    if (mergeInjectionFlags.containsKey(name)) {
+                        mergeInjectionFlag =
+                            mergeInjectionFlags.get(name).booleanValue(); 
+                    } else {
+                        if (ejbRefs.get(
+                                name).getInjectionTargets().size() == 0) {
+                            mergeInjectionFlag = true;
+                        }
+                        mergeInjectionFlags.put(name,
+                                Boolean.valueOf(mergeInjectionFlag));
+                    }
+                    if (mergeInjectionFlag) {
+                        ejbRefs.get(name).getInjectionTargets().addAll(
+                                ejbRef.getInjectionTargets());
+                    }
+                } else {
+                    // Not defined in main web.xml
+                    if (temp.getEjbRefs().containsKey(name)) {
+                        log.error(sm.getString(
+                                "webXml.mergeConflictEjbRef",
+                                name,
+                                fragment.getName(),
+                                fragment.getURL()));
+                        return false;
+                    } else {
+                        temp.getEjbRefs().put(name, ejbRef);
+                    }
+                }
+            }
+        }
+        ejbRefs.putAll(temp.getEjbRefs());
+        mergeInjectionFlags.clear();
+
+        for (WebXml fragment : fragments) {
+            for (ContextEnvironment envEntry :
+                    fragment.getEnvEntries().values()) {
+                String name = envEntry.getName();
+                boolean mergeInjectionFlag = false;
+                if (envEntries.containsKey(name)) {
+                    if (mergeInjectionFlags.containsKey(name)) {
+                        mergeInjectionFlag =
+                            mergeInjectionFlags.get(name).booleanValue(); 
+                    } else {
+                        if (envEntries.get(
+                                name).getInjectionTargets().size() == 0) {
+                            mergeInjectionFlag = true;
+                        }
+                        mergeInjectionFlags.put(name,
+                                Boolean.valueOf(mergeInjectionFlag));
+                    }
+                    if (mergeInjectionFlag) {
+                        envEntries.get(name).getInjectionTargets().addAll(
+                                envEntry.getInjectionTargets());
+                    }
+                } else {
+                    // Not defined in main web.xml
+                    if (temp.getEnvEntries().containsKey(name)) {
+                        log.error(sm.getString(
+                                "webXml.mergeConflictEnvEntry",
+                                name,
+                                fragment.getName(),
+                                fragment.getURL()));
+                        return false;
+                    } else {
+                        temp.getEnvEntries().put(name, envEntry);
+                    }
+                }
+            }
+        }
+        envEntries.putAll(temp.getEnvEntries());
+        mergeInjectionFlags.clear();
+
+        for (WebXml fragment : fragments) {
+            for (String errorPageKey : fragment.getErrorPages().keySet()) {
+                if (!errorPages.containsKey(errorPageKey)) {
+                    // Not defined in main web.xml
+                    ErrorPage errorPage =
+                        fragment.getErrorPages().get(errorPageKey);
+                    if (temp.getErrorPages().containsKey(errorPageKey)) {
+                        if (!errorPage.getLocation().equals(
+                                temp.getErrorPages().get(
+                                        errorPageKey).getLocation())) {
+                            log.error(sm.getString(
+                                    "webXml.mergeConflictErrorPage",
+                                    errorPageKey,
+                                    fragment.getName(),
+                                    fragment.getURL()));
+                            return false;
+                        }
+                    } else {
+                        temp.addErrorPage(errorPage);
+                    }
+                }
+            }
+        }
+        errorPages.putAll(temp.getErrorPages());
 
         // TODO SERVLET3 - Merge remaining elements