Author: markt Date: Tue Jul 4 19:14:08 2017 New Revision: 1800807 URL: http://svn.apache.org/viewvc?rev=1800807&view=rev Log: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=52924 Add support for a Tomcat specific deployment descriptor. This allows apps to ship with Tomcat specific configuration (e.g for JSP or Default Servlet) without breaking when the app is deployed on other containers.
Modified: tomcat/trunk/conf/context.xml tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties tomcat/trunk/webapps/docs/changelog.xml tomcat/trunk/webapps/docs/config/context.xml tomcat/trunk/webapps/docs/default-servlet.xml tomcat/trunk/webapps/docs/jasper-howto.xml tomcat/trunk/webapps/docs/security-howto.xml Modified: tomcat/trunk/conf/context.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/conf/context.xml?rev=1800807&r1=1800806&r2=1800807&view=diff ============================================================================== --- tomcat/trunk/conf/context.xml (original) +++ tomcat/trunk/conf/context.xml Tue Jul 4 19:14:08 2017 @@ -21,6 +21,7 @@ <!-- Default set of monitored resources. If one of these changes, the --> <!-- web application will be reloaded. --> <WatchedResource>WEB-INF/web.xml</WatchedResource> + <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource> <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=1800807&r1=1800806&r2=1800807&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Tue Jul 4 19:14:08 2017 @@ -1107,6 +1107,9 @@ public class ContextConfig implements Li Set<WebXml> defaults = new HashSet<>(); defaults.add(getDefaultWebXmlFragment(webXmlParser)); + Set<WebXml> tomcatWebXml = new HashSet<>(); + tomcatWebXml.add(getTomcatWebXmlFragment(webXmlParser)); + WebXml webXml = createWebXml(); // Parse context level web.xml @@ -1175,7 +1178,11 @@ public class ContextConfig implements Li ok = webXml.merge(orderedFragments); } - // Step 7. Apply global defaults + // Step 7a + // merge tomcat-web.xml + webXml.merge(tomcatWebXml); + + // Step 7b. Apply global defaults // Have to merge defaults before JSP conversion since defaults // provide JSP servlet definition. webXml.merge(defaults); @@ -1190,6 +1197,7 @@ public class ContextConfig implements Li configureContext(webXml); } } else { + webXml.merge(tomcatWebXml); webXml.merge(defaults); convertJsps(webXml); configureContext(webXml); @@ -1452,6 +1460,35 @@ public class ContextConfig implements Li } + private WebXml getTomcatWebXmlFragment(WebXmlParser webXmlParser) { + + WebXml webXmlTomcatFragment = createWebXml(); + webXmlTomcatFragment.setOverridable(true); + + // Set to distributable else every app will be prevented from being + // distributable when the Tomcat fragment is merged with the main + // web.xml + webXmlTomcatFragment.setDistributable(true); + // When merging, the default welcome files are only used if the app has + // not defined any welcomes files. + webXmlTomcatFragment.setAlwaysAddWelcomeFiles(false); + + WebResource resource = context.getResources().getResource("/WEB-INF/tomcat-web.xml"); + if (resource.isFile()) { + try { + InputSource source = new InputSource(resource.getURL().toURI().toString()); + source.setByteStream(resource.getInputStream()); + if (!webXmlParser.parseWebXml(source, webXmlTomcatFragment, false)) { + ok = false; + } + } catch (URISyntaxException e) { + log.error(sm.getString("contextConfig.tomcatWebXmlError"), e); + } + } + return webXmlTomcatFragment; + } + + private WebXml getDefaultWebXmlFragment(WebXmlParser webXmlParser) { // Host should never be null 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=1800807&r1=1800806&r2=1800807&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties Tue Jul 4 19:14:08 2017 @@ -67,6 +67,7 @@ contextConfig.sci.info=Unable to process contextConfig.servletContainerInitializerFail=Failed to detect ServletContainerInitializers for context with name [{0}] contextConfig.start=ContextConfig: Processing START contextConfig.stop=ContextConfig: Processing STOP +contextConfig.tomcatWebXmlError=Error processing /WEB-INF/tomcat-web.xml contextConfig.unavailable=Marking this application unavailable due to previous error(s) contextConfig.unknownUrlProtocol=The URL protocol [{0}] was not recognised during annotation processing. URL [{1}] was ignored. contextConfig.urlPatternValue=Both the urlPatterns and value attributes were set for the [{0}] annotation on class [{1}] Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1800807&r1=1800806&r2=1800807&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Tue Jul 4 19:14:08 2017 @@ -45,6 +45,18 @@ issues do not "pop up" wrt. others). --> <section name="Tomcat 9.0.0.M24 (markt)" rtext="in development"> + <subsection name="Catalina"> + <changelog> + <add> + <bug>52924</bug>: Add support for a Tomcat specific deployment + descriptor, <code>/WEB-INF/tomcat-web.xml</code>. This descriptor has an + identical format to <code>/WEB-INF/web.xml</code>. The Tomcat descriptor + takes precedence over any settings in <code>conf/web.xml</code> but does + not take precedence over any settings in <code>/WEB-INF/web.xml</code>. + (markt) + </add> + </changelog> + </subsection> <subsection name="Other"> <changelog> <add> Modified: tomcat/trunk/webapps/docs/config/context.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/context.xml?rev=1800807&r1=1800806&r2=1800807&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/config/context.xml (original) +++ tomcat/trunk/webapps/docs/config/context.xml Tue Jul 4 19:14:08 2017 @@ -618,23 +618,23 @@ <attribute name="xmlBlockExternal" required="false"> <p>If the value of this flag is <code>true</code>, the parsing of - <code>web.xml</code>, <code>web-fragment.xml</code>, <code>*.tld</code>, - <code>*.jspx</code>, <code>*.tagx</code> and <code>tagPlugins.xml</code> - files for this web application will not permit external entities to be - loaded. If not specified, the default value of <code>true</code> will - be used.</p> + <code>web.xml</code>, <code>web-fragment.xml</code>, + <code>tomcat-web.xml</code>, <code>*.tld</code>, <code>*.jspx</code>, + <code>*.tagx</code> and <code>tagPlugins.xml</code> files for this web + application will not permit external entities to be loaded. If not + specified, the default value of <code>true</code> will be used.</p> </attribute> <attribute name="xmlNamespaceAware" required="false"> <p>If the value of this flag is <code>true</code>, the parsing of - <code>web.xml</code> and <code>web-fragment.xml</code> files for this - web application will be namespace-aware. Note that <code>*.tld</code>, - <code>*.jspx</code> and <code>*.tagx</code> files are always parsed - using a namespace-aware parser and that the <code>tagPlugins.xml</code> - file (if any) is never parsed using a namespace-aware parser. Note also - that if you turn this flag on, you should probably also turn - <code>xmlValidation</code> on. If the - <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> + <code>web.xml</code>, <code>web-fragment.xml</code> and + <code>tomcat-web.xml</code> files for this web application will be + namespace-aware. Note that <code>*.tld</code>, <code>*.jspx</code> and + <code>*.tagx</code> files are always parsed using a namespace-aware + parser and that the <code>tagPlugins.xml</code> file (if any) is never + parsed using a namespace-aware parser. Note also that if you turn this + flag on, you should probably also turn <code>xmlValidation</code> on. If + the <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> <a href="systemprops.html">system property</a> is set to <code>true</code>, the default value of this attribute will be <code>true</code>, else the default value will be <code>false</code>. @@ -644,8 +644,9 @@ <attribute name="xmlValidation" required="false"> <p>If the value of this flag is <code>true</code>, the parsing of - <code>web.xml</code> and <code>web-fragment.xml</code> files for this - web application will use a validating parser. If the + <code>web.xml</code>, <code>web-fragment.xml</code> and + <code>tomcat-web.xml</code> files for this web application will use a + validating parser. If the <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> <a href="systemprops.html">system property</a> is set to <code>true</code>, the default value of this attribute will be @@ -924,6 +925,10 @@ extension to the corresponding JSP servlet), and other standard features that apply to all web applications.</li> <li>The web application properties listed in the + <code>/WEB-INF/tomcat-web.xml</code> resource for this web application + will be processed (if this resource exists), taking precedence over the + defaults.</li> + <li>The web application properties listed in the <code>/WEB-INF/web.xml</code> resource for this web application will be processed (if this resource exists).</li> <li>If your web application has specified security constraints that might Modified: tomcat/trunk/webapps/docs/default-servlet.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/default-servlet.xml?rev=1800807&r1=1800806&r2=1800807&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/default-servlet.xml (original) +++ tomcat/trunk/webapps/docs/default-servlet.xml Tue Jul 4 19:14:08 2017 @@ -68,8 +68,19 @@ By default here is it's declaration: <url-pattern>/</url-pattern> </servlet-mapping>]]></source> -So by default, the default servlet is loaded at webapp startup and -directory listings are disabled and debugging is turned off. +<p>So by default, the default servlet is loaded at webapp startup and directory +listings are disabled and debugging is turned off.</p> + +<p>If you need to change the DefaultServlet settings for an application you can +override the default configuration by re-defining the DefaultServlet in +<code>/WEB-INF/web.xml</code>. However, this will cause problems if you attempt +to deploy the application on another container as the DefaultServlet class will +not be recognised. You can work-around this problem by using the Tomact specific +<code>/WEB-INF/tomcat-web.xml</code> deployment descriptor. The format is +identical to <code>/WEB-INF/web.xml</code>. It will override any default +settings but not those in <code>/WEB-INF/web.xml</code>. Since it is Tomcat +specific, it will only be processed when the application is deployed on +Tomcat.</p> </section> <section anchor="change" name="What can I change?"> Modified: tomcat/trunk/webapps/docs/jasper-howto.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/jasper-howto.xml?rev=1800807&r1=1800806&r2=1800807&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/jasper-howto.xml (original) +++ tomcat/trunk/webapps/docs/jasper-howto.xml Tue Jul 4 19:14:08 2017 @@ -223,6 +223,17 @@ for even large JSP pages.</p> of the new compiler by configuring the compiler attribute as explained above. </p> +<p>If you need to change the JSP Servlet settings for an application you can +override the default configuration by re-defining the JSP Servlet in +<code>/WEB-INF/web.xml</code>. However, this may cause problems if you attempt +to deploy the application on another container as the JSP Servlet class may +not be recognised. You can work-around this problem by using the Tomact specific +<code>/WEB-INF/tomcat-web.xml</code> deployment descriptor. The format is +identical to <code>/WEB-INF/web.xml</code>. It will override any default +settings but not those in <code>/WEB-INF/web.xml</code>. Since it is Tomcat +specific, it will only be processed when the application is deployed on +Tomcat.</p> + </section> <section name="Known issues"> Modified: tomcat/trunk/webapps/docs/security-howto.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/security-howto.xml?rev=1800807&r1=1800806&r2=1800807&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/security-howto.xml (original) +++ tomcat/trunk/webapps/docs/security-howto.xml Tue Jul 4 19:14:08 2017 @@ -483,9 +483,9 @@ </section> <section name="web.xml"> - <p>This applies to the default <code>conf/web.xml</code> file and - <code>WEB-INF/web.xml</code> files in web applications if they define - the components mentioned here.</p> + <p>This applies to the default <code>conf/web.xml</code> file, the + <code>/WEB-INF/tomcat-web.xml</code> and the <code>/WEB-INF/web.xml</code> + files in web applications if they define the components mentioned here.</p> <p>The <a href="default-servlet.html">DefaultServlet</a> is configured with <strong>readonly</strong> set to --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org