Author: markt Date: Wed Feb 19 20:28:20 2014 New Revision: 1569903 URL: http://svn.apache.org/r1569903 Log: Update tests to check correct handling of all elements added between 2.2 and 2.3.
Modified: tomcat/tc7.0.x/trunk/ (props changed) tomcat/tc7.0.x/trunk/java/org/apache/catalina/deploy/WebXml.java tomcat/tc7.0.x/trunk/test/org/apache/catalina/deploy/TestWebXml.java Propchange: tomcat/tc7.0.x/trunk/ ------------------------------------------------------------------------------ Merged /tomcat/trunk:r1569735,1569755 Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/deploy/WebXml.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/deploy/WebXml.java?rev=1569903&r1=1569902&r2=1569903&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/deploy/WebXml.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/deploy/WebXml.java Wed Feb 19 20:28:20 2014 @@ -594,6 +594,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"); @@ -658,61 +661,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(); @@ -737,10 +750,15 @@ public class WebXml { appendElement(sb, INDENT4, "enabled", servletDef.getEnabled()); appendElement(sb, INDENT4, "async-supported", servletDef.getAsyncSupported()); - if (servletDef.getRunAs() != null) { - sb.append(" <run-as>\n"); - appendElement(sb, INDENT6, "role-name", servletDef.getRunAs()); - sb.append(" </run-as>\n"); + // servlet/run-as 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) { + if (servletDef.getRunAs() != null) { + sb.append(" <run-as>\n"); + appendElement(sb, INDENT6, "role-name", servletDef.getRunAs()); + sb.append(" </run-as>\n"); + } } for (SecurityRoleRef roleRef : servletDef.getSecurityRoleRefs()) { sb.append(" <security-role-ref>\n"); @@ -869,10 +887,71 @@ 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()); + // resource-ref/res-sharing-scope 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) { + 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", - constraint.getDisplayName()); + // security-constraint/display-name 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) { + appendElement(sb, INDENT4, "display-name", + constraint.getDisplayName()); + } for (SecurityCollection collection : constraint.findCollections()) { sb.append(" <web-resource-collection>\n"); appendElement(sb, INDENT6, "web-resource-name", @@ -974,28 +1053,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"); @@ -1053,52 +1137,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/tc7.0.x/trunk/test/org/apache/catalina/deploy/TestWebXml.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/deploy/TestWebXml.java?rev=1569903&r1=1569902&r2=1569903&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/catalina/deploy/TestWebXml.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/deploy/TestWebXml.java Wed Feb 19 20:28:20 2014 @@ -206,6 +206,67 @@ 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.tomcat.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); + + // Servlet/run-as was added in 2.3 so should be excluded in 2.2 + ServletDef servletDef = new ServletDef(); + servletDef.setServletName("Dummy"); + servletDef.setServletClass("org.apache.tomcat.DummyServlet"); + servletDef.setRunAs("dummy"); + webXmlDefaultFragment.addServlet(servletDef); + + webXmlDefaultFragment.addServletMapping("/dummy", "Dummy"); + + // resource-ref/res-sharing-scope was added in 2.3 so should be excluded + // in 2.2 + ContextResource contextResource = new ContextResource(); + contextResource.setName("dummy"); + contextResource.setType("dummy"); + contextResource.setAuth("Container"); + contextResource.setScope("Shareable"); + webXmlDefaultFragment.addResourceRef(contextResource); + + // security-constraint/display-name was added in 2.3 so should be + // excluded in 2.2 + SecurityConstraint sc = new SecurityConstraint(); + sc.setDisplayName("dummy"); + SecurityCollection collection = new SecurityCollection(); + collection.setName("dummy"); + collection.addPattern("/*"); + collection.addMethod("DELETE"); + sc.addCollection(collection); + webXmlDefaultFragment.addSecurityConstraint(sc); + return webXmlDefaultFragment; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org