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

Reply via email to