Author: markt Date: Sat Dec 7 20:43:46 2013 New Revision: 1548966 URL: http://svn.apache.org/r1548966 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55811 Do not parse web-fragment.xml files when an empty absolute-ordering element is present.
Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java 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=1548966&r1=1548965&r2=1548966&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Sat Dec 7 20:43:46 2013 @@ -1115,7 +1115,7 @@ public class ContextConfig implements Li // provided by the container. If any of the application JARs have a // web-fragment.xml it will be parsed at this point. web-fragment.xml // files are ignored for container provided JARs. - Map<String,WebXml> fragments = processJarsForWebFragments(); + Map<String,WebXml> fragments = processJarsForWebFragments(webXml); // Step 2. Order the fragments. Set<WebXml> orderedFragments = null; @@ -1840,15 +1840,23 @@ public class ContextConfig implements Li * * @return A map of JAR name to processed web fragment (if any) */ - protected Map<String,WebXml> processJarsForWebFragments() { + protected Map<String,WebXml> processJarsForWebFragments(WebXml application) { JarScanner jarScanner = context.getJarScanner(); boolean delegate = false; if (context instanceof StandardContext) { delegate = ((StandardContext) context).getDelegate(); } + boolean parseRequired = true; + Set<String> absoluteOrder = application.getAbsoluteOrdering(); + if (absoluteOrder != null && absoluteOrder.isEmpty() && + !context.getXmlValidation()) { + // Skip parsing when there is an empty absolute ordering and + // validation is not enabled + parseRequired = false; + } FragmentJarScannerCallback callback = - new FragmentJarScannerCallback(webXmlParser, delegate); + new FragmentJarScannerCallback(webXmlParser, delegate, parseRequired); jarScanner.scan(JarScanType.PLUGGABILITY, context.getServletContext(), callback); Modified: tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java?rev=1548966&r1=1548965&r2=1548966&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java (original) +++ tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java Sat Dec 7 20:43:46 2013 @@ -143,6 +143,13 @@ public class JspCServletContext implemen return webXml; } + // If an empty absolute ordering element is present, fragment processing + // may be skipped. + Set<String> absoluteOrdering = webXml.getAbsoluteOrdering(); + if (absoluteOrdering != null && absoluteOrdering.isEmpty()) { + return webXml; + } + Map<String, WebXml> fragments = scanForFragments(webXmlParser); Set<WebXml> orderedFragments = WebXml.orderWebFragments(webXml, fragments, this); @@ -158,7 +165,8 @@ public class JspCServletContext implemen // TODO - configure filter rules from Ant rather then system properties scanner.setJarScanFilter(new StandardJarScanFilter()); - FragmentJarScannerCallback callback = new FragmentJarScannerCallback(webXmlParser, false); + FragmentJarScannerCallback callback = + new FragmentJarScannerCallback(webXmlParser, false, true); scanner.scan(JarScanType.PLUGGABILITY, this, callback); if (!callback.isOk()) { throw new JasperException(Localizer.getMessage("jspc.error.invalidFragment")); Modified: tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java?rev=1548966&r1=1548965&r2=1548966&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java Sat Dec 7 20:43:46 2013 @@ -39,12 +39,15 @@ public class FragmentJarScannerCallback "META-INF/web-fragment.xml"; private final WebXmlParser webXmlParser; private final boolean delegate; + private final boolean parseRequired; private final Map<String,WebXml> fragments = new HashMap<>(); private boolean ok = true; - public FragmentJarScannerCallback(WebXmlParser webXmlParser, boolean delegate) { + public FragmentJarScannerCallback(WebXmlParser webXmlParser, boolean delegate, + boolean parseRequired) { this.webXmlParser = webXmlParser; this.delegate = delegate; + this.parseRequired = parseRequired; } @Override @@ -61,8 +64,10 @@ public class FragmentJarScannerCallback try { // Only web application JARs are checked for web-fragment.xml - // files - if (isWebapp) { + // files. + // web-fragment.xml files don't need to be parsed if they are never + // going to be used. + if (isWebapp && parseRequired) { jar = JarFactory.newInstance(url); is = jar.getInputStream(FRAGMENT_LOCATION); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org