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 2014/02/19 14:22:10 UTC

svn commit: r1569735 - in /tomcat/trunk: java/org/apache/tomcat/util/descriptor/web/WebXml.java test/org/apache/tomcat/util/descriptor/web/TestWebXml.java

Author: markt
Date: Wed Feb 19 13:22:10 2014
New Revision: 1569735

URL: http://svn.apache.org/r1569735
Log:
Update tests to check correct handling of all elements added between 2.2 and 2.3.

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/WebXml.java
    tomcat/trunk/test/org/apache/tomcat/util/descriptor/web/TestWebXml.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/WebXml.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/WebXml.java?rev=1569735&r1=1569734&r2=1569735&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/WebXml.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/WebXml.java Wed Feb 19 13:22:10 2014
@@ -633,6 +633,9 @@ public class WebXml {
         // TODO - Various, icon, description etc elements are skipped - mainly
         //        because they are ignored when web.xml is parsed - see above
 
+        // NOTE - Elements need to be written in the order defined in the 2.3
+        //        DTD else validation of the merged web.xml will fail
+
         // Declaration
         sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
 
@@ -701,61 +704,71 @@ public class WebXml {
         }
         sb.append('\n');
 
-        for (Map.Entry<String, FilterDef> entry : filters.entrySet()) {
-            FilterDef filterDef = entry.getValue();
-            sb.append("  <filter>\n");
-            appendElement(sb, INDENT4, "description",
-                    filterDef.getDescription());
-            appendElement(sb, INDENT4, "display-name",
-                    filterDef.getDisplayName());
-            appendElement(sb, INDENT4, "filter-name",
-                    filterDef.getFilterName());
-            appendElement(sb, INDENT4, "filter-class",
-                    filterDef.getFilterClass());
-            appendElement(sb, INDENT4, "async-supported",
-                    filterDef.getAsyncSupported());
-            for (Map.Entry<String, String> param :
-                    filterDef.getParameterMap().entrySet()) {
-                sb.append("    <init-param>\n");
-                appendElement(sb, INDENT6, "param-name", param.getKey());
-                appendElement(sb, INDENT6, "param-value", param.getValue());
-                sb.append("    </init-param>\n");
+        // Filters were introduced in Servlet 2.3
+        // Note versions are validated and start at 2.2 so this test takes that
+        // into account
+        if (getMajorVersion() > 2 || getMinorVersion() > 2) {
+            for (Map.Entry<String, FilterDef> entry : filters.entrySet()) {
+                FilterDef filterDef = entry.getValue();
+                sb.append("  <filter>\n");
+                appendElement(sb, INDENT4, "description",
+                        filterDef.getDescription());
+                appendElement(sb, INDENT4, "display-name",
+                        filterDef.getDisplayName());
+                appendElement(sb, INDENT4, "filter-name",
+                        filterDef.getFilterName());
+                appendElement(sb, INDENT4, "filter-class",
+                        filterDef.getFilterClass());
+                appendElement(sb, INDENT4, "async-supported",
+                        filterDef.getAsyncSupported());
+                for (Map.Entry<String, String> param :
+                        filterDef.getParameterMap().entrySet()) {
+                    sb.append("    <init-param>\n");
+                    appendElement(sb, INDENT6, "param-name", param.getKey());
+                    appendElement(sb, INDENT6, "param-value", param.getValue());
+                    sb.append("    </init-param>\n");
+                }
+                sb.append("  </filter>\n");
             }
-            sb.append("  </filter>\n");
-        }
-        sb.append('\n');
+            sb.append('\n');
 
-        for (FilterMap filterMap : filterMaps) {
-            sb.append("  <filter-mapping>\n");
-            appendElement(sb, INDENT4, "filter-name",
-                    filterMap.getFilterName());
-            if (filterMap.getMatchAllServletNames()) {
-                sb.append("    <servlet-name>*</servlet-name>\n");
-            } else {
-                for (String servletName : filterMap.getServletNames()) {
-                    appendElement(sb, INDENT4, "servlet-name", servletName);
+            for (FilterMap filterMap : filterMaps) {
+                sb.append("  <filter-mapping>\n");
+                appendElement(sb, INDENT4, "filter-name",
+                        filterMap.getFilterName());
+                if (filterMap.getMatchAllServletNames()) {
+                    sb.append("    <servlet-name>*</servlet-name>\n");
+                } else {
+                    for (String servletName : filterMap.getServletNames()) {
+                        appendElement(sb, INDENT4, "servlet-name", servletName);
+                    }
                 }
-            }
-            if (filterMap.getMatchAllUrlPatterns()) {
-                sb.append("    <url-pattern>*</url-pattern>\n");
-            } else {
-                for (String urlPattern : filterMap.getURLPatterns()) {
-                    appendElement(sb, INDENT4, "url-pattern", urlPattern);
+                if (filterMap.getMatchAllUrlPatterns()) {
+                    sb.append("    <url-pattern>*</url-pattern>\n");
+                } else {
+                    for (String urlPattern : filterMap.getURLPatterns()) {
+                        appendElement(sb, INDENT4, "url-pattern", urlPattern);
+                    }
                 }
+                for (String dispatcher : filterMap.getDispatcherNames()) {
+                    appendElement(sb, INDENT4, "dispatcher", dispatcher);
+                }
+                sb.append("  </filter-mapping>\n");
             }
-            for (String dispatcher : filterMap.getDispatcherNames()) {
-                appendElement(sb, INDENT4, "dispatcher", dispatcher);
-            }
-            sb.append("  </filter-mapping>\n");
+            sb.append('\n');
         }
-        sb.append('\n');
 
-        for (String listener : listeners) {
-            sb.append("  <listener>\n");
-            appendElement(sb, INDENT4, "listener-class", listener);
-            sb.append("  </listener>\n");
+        // Listeners were introduced in Servlet 2.3
+        // Note versions are validated and start at 2.2 so this test takes that
+        // into account
+        if (getMajorVersion() > 2 || getMinorVersion() > 2) {
+            for (String listener : listeners) {
+                sb.append("  <listener>\n");
+                appendElement(sb, INDENT4, "listener-class", listener);
+                sb.append("  </listener>\n");
+            }
+            sb.append('\n');
         }
-        sb.append('\n');
 
         for (Map.Entry<String, ServletDef> entry : servlets.entrySet()) {
             ServletDef servletDef = entry.getValue();
@@ -912,6 +925,57 @@ public class WebXml {
             sb.append("  </jsp-config>\n\n");
         }
 
+        // resource-env-ref was introduced in Servlet 2.3
+        // Note versions are validated and start at 2.2 so this test takes that
+        // into account
+        if (getMajorVersion() > 2 || getMinorVersion() > 2) {
+            for (ContextResourceEnvRef resourceEnvRef : resourceEnvRefs.values()) {
+                sb.append("  <resource-env-ref>\n");
+                appendElement(sb, INDENT4, "description",
+                        resourceEnvRef.getDescription());
+                appendElement(sb, INDENT4, "resource-env-ref-name",
+                        resourceEnvRef.getName());
+                appendElement(sb, INDENT4, "resource-env-ref-type",
+                        resourceEnvRef.getType());
+                // TODO mapped-name
+                for (InjectionTarget target :
+                        resourceEnvRef.getInjectionTargets()) {
+                    sb.append("    <injection-target>\n");
+                    appendElement(sb, INDENT6, "injection-target-class",
+                            target.getTargetClass());
+                    appendElement(sb, INDENT6, "injection-target-name",
+                            target.getTargetName());
+                    sb.append("    </injection-target>\n");
+                }
+                // TODO lookup-name
+                sb.append("  </resource-env-ref>\n");
+            }
+            sb.append('\n');
+        }
+
+        for (ContextResource resourceRef : resourceRefs.values()) {
+            sb.append("  <resource-ref>\n");
+            appendElement(sb, INDENT4, "description",
+                    resourceRef.getDescription());
+            appendElement(sb, INDENT4, "res-ref-name", resourceRef.getName());
+            appendElement(sb, INDENT4, "res-type", resourceRef.getType());
+            appendElement(sb, INDENT4, "res-auth", resourceRef.getAuth());
+            appendElement(sb, INDENT4, "res-sharing-scope",
+                    resourceRef.getScope());
+            // TODO mapped-name
+            for (InjectionTarget target : resourceRef.getInjectionTargets()) {
+                sb.append("    <injection-target>\n");
+                appendElement(sb, INDENT6, "injection-target-class",
+                        target.getTargetClass());
+                appendElement(sb, INDENT6, "injection-target-name",
+                        target.getTargetName());
+                sb.append("    </injection-target>\n");
+            }
+            // TODO lookup-name
+            sb.append("  </resource-ref>\n");
+        }
+        sb.append('\n');
+
         for (SecurityConstraint constraint : securityConstraints) {
             sb.append("  <security-constraint>\n");
             appendElement(sb, INDENT4, "display-name",
@@ -1017,28 +1081,33 @@ public class WebXml {
         }
         sb.append('\n');
 
-        for (ContextLocalEjb ejbLocalRef : ejbLocalRefs.values()) {
-            sb.append("  <ejb-local-ref>\n");
-            appendElement(sb, INDENT4, "description",
-                    ejbLocalRef.getDescription());
-            appendElement(sb, INDENT4, "ejb-ref-name", ejbLocalRef.getName());
-            appendElement(sb, INDENT4, "ejb-ref-type", ejbLocalRef.getType());
-            appendElement(sb, INDENT4, "local-home", ejbLocalRef.getHome());
-            appendElement(sb, INDENT4, "local", ejbLocalRef.getLocal());
-            appendElement(sb, INDENT4, "ejb-link", ejbLocalRef.getLink());
-            // TODO mapped-name
-            for (InjectionTarget target : ejbLocalRef.getInjectionTargets()) {
-                sb.append("    <injection-target>\n");
-                appendElement(sb, INDENT6, "injection-target-class",
-                        target.getTargetClass());
-                appendElement(sb, INDENT6, "injection-target-name",
-                        target.getTargetName());
-                sb.append("    </injection-target>\n");
+        // ejb-local-ref was introduced in Servlet 2.3
+        // Note versions are validated and start at 2.2 so this test takes that
+        // into account
+        if (getMajorVersion() > 2 || getMinorVersion() > 2) {
+            for (ContextLocalEjb ejbLocalRef : ejbLocalRefs.values()) {
+                sb.append("  <ejb-local-ref>\n");
+                appendElement(sb, INDENT4, "description",
+                        ejbLocalRef.getDescription());
+                appendElement(sb, INDENT4, "ejb-ref-name", ejbLocalRef.getName());
+                appendElement(sb, INDENT4, "ejb-ref-type", ejbLocalRef.getType());
+                appendElement(sb, INDENT4, "local-home", ejbLocalRef.getHome());
+                appendElement(sb, INDENT4, "local", ejbLocalRef.getLocal());
+                appendElement(sb, INDENT4, "ejb-link", ejbLocalRef.getLink());
+                // TODO mapped-name
+                for (InjectionTarget target : ejbLocalRef.getInjectionTargets()) {
+                    sb.append("    <injection-target>\n");
+                    appendElement(sb, INDENT6, "injection-target-class",
+                            target.getTargetClass());
+                    appendElement(sb, INDENT6, "injection-target-name",
+                            target.getTargetName());
+                    sb.append("    </injection-target>\n");
+                }
+                // TODO lookup-name
+                sb.append("  </ejb-local-ref>\n");
             }
-            // TODO lookup-name
-            sb.append("  </ejb-local-ref>\n");
+            sb.append('\n');
         }
-        sb.append('\n');
 
         for (ContextService serviceRef : serviceRefs.values()) {
             sb.append("  <service-ref>\n");
@@ -1096,52 +1165,6 @@ public class WebXml {
         }
         sb.append('\n');
 
-        for (ContextResource resourceRef : resourceRefs.values()) {
-            sb.append("  <resource-ref>\n");
-            appendElement(sb, INDENT4, "description",
-                    resourceRef.getDescription());
-            appendElement(sb, INDENT4, "res-ref-name", resourceRef.getName());
-            appendElement(sb, INDENT4, "res-type", resourceRef.getType());
-            appendElement(sb, INDENT4, "res-auth", resourceRef.getAuth());
-            appendElement(sb, INDENT4, "res-sharing-scope",
-                    resourceRef.getScope());
-            // TODO mapped-name
-            for (InjectionTarget target : resourceRef.getInjectionTargets()) {
-                sb.append("    <injection-target>\n");
-                appendElement(sb, INDENT6, "injection-target-class",
-                        target.getTargetClass());
-                appendElement(sb, INDENT6, "injection-target-name",
-                        target.getTargetName());
-                sb.append("    </injection-target>\n");
-            }
-            // TODO lookup-name
-            sb.append("  </resource-ref>\n");
-        }
-        sb.append('\n');
-
-        for (ContextResourceEnvRef resourceEnvRef : resourceEnvRefs.values()) {
-            sb.append("  <resource-env-ref>\n");
-            appendElement(sb, INDENT4, "description",
-                    resourceEnvRef.getDescription());
-            appendElement(sb, INDENT4, "resource-env-ref-name",
-                    resourceEnvRef.getName());
-            appendElement(sb, INDENT4, "resource-env-ref-type",
-                    resourceEnvRef.getType());
-            // TODO mapped-name
-            for (InjectionTarget target :
-                    resourceEnvRef.getInjectionTargets()) {
-                sb.append("    <injection-target>\n");
-                appendElement(sb, INDENT6, "injection-target-class",
-                        target.getTargetClass());
-                appendElement(sb, INDENT6, "injection-target-name",
-                        target.getTargetName());
-                sb.append("    </injection-target>\n");
-            }
-            // TODO lookup-name
-            sb.append("  </resource-env-ref>\n");
-        }
-        sb.append('\n');
-
         if (!postConstructMethods.isEmpty()) {
             for (Entry<String, String> entry : postConstructMethods
                     .entrySet()) {

Modified: tomcat/trunk/test/org/apache/tomcat/util/descriptor/web/TestWebXml.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/descriptor/web/TestWebXml.java?rev=1569735&r1=1569734&r2=1569735&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/descriptor/web/TestWebXml.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/util/descriptor/web/TestWebXml.java Wed Feb 19 13:22:10 2014
@@ -221,6 +221,38 @@ public class TestWebXml {
         // Assert that web.xml was parsed and is not empty. Default servlet is known to be there.
         Assert.assertNotNull(webXmlDefaultFragment.getServlets().get("default"));
 
+        // Manually add some version specific features to ensure that these do
+        // not cause problems for the merged web.xml
+
+        // Filters were added in 2.3 so should be excluded in 2.2
+        FilterDef filterDef = new FilterDef();
+        filterDef.setFilterClass("org.apache.tomcat.DummyFilter");
+        filterDef.setFilterName("Dummy");
+        webXmlDefaultFragment.addFilter(filterDef);
+
+        FilterMap filterMap = new FilterMap();
+        filterMap.setFilterName("Dummy");
+        filterMap.addURLPattern("/*");
+        webXmlDefaultFragment.addFilterMapping(filterMap);
+
+        // Listeners were added in 2.3 so should be excluded in 2.2
+        webXmlDefaultFragment.addListener("org.apache.tomcar.DummyListener");
+
+        // resource-env-ref was added in 2.3 so should be excluded in 2.2
+        ContextResourceEnvRef resourceEnvRef = new ContextResourceEnvRef();
+        resourceEnvRef.setName("dummy");
+        resourceEnvRef.setType("dummy");
+
+        webXmlDefaultFragment.addResourceEnvRef(resourceEnvRef);
+
+        // ejb-local-ref was added in 2.3 so should be excluded in 2.2
+        ContextLocalEjb ejbLocalRef = new ContextLocalEjb();
+        ejbLocalRef.setName("dummy");
+        ejbLocalRef.setType("Session");
+        ejbLocalRef.setLocal("dummy");
+        ejbLocalRef.setHome("dummy");
+        webXmlDefaultFragment.addEjbLocalRef(ejbLocalRef);
+
         return webXmlDefaultFragment;
     }
 



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