Author: markt
Date: Fri Oct  8 21:37:19 2010
New Revision: 1006033

URL: http://svn.apache.org/viewvc?rev=1006033&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50059
Always make JAR resources available

Modified:
    tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
    tomcat/trunk/webapps/docs/changelog.xml

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=1006033&r1=1006032&r2=1006033&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Fri Oct  8 
21:37:19 2010
@@ -1214,7 +1214,7 @@ public class ContextConfig
             webXmlVersion = Double.parseDouble(webXml.getVersion());
         }
         
-        if (webXmlVersion >= 3 && !webXml.isMetadataComplete()) {
+        if (webXmlVersion >= 3) {
             // Ordering is important here
 
             // Step 1. Identify all the JARs packaged with the application
@@ -1222,67 +1222,78 @@ public class ContextConfig
             // point.
             Map<String,WebXml> fragments = processJarsForWebFragments();
 
-            // Step 2. Order the fragments.
-            Set<WebXml> orderedFragments =
-                WebXml.orderWebFragments(webXml, fragments);
-
-            // Step 3. Look for ServletContainerInitializer implementations
-            ok = processServletContainerInitializers(orderedFragments);
-
-            // Step 4. Process /WEB-INF/classes for annotations
-            // This will add any matching classes to the typeInitializerMap
-            if (ok) {
-                URL webinfClasses;
-                try {
-                    webinfClasses =
-                        
context.getServletContext().getResource("/WEB-INF/classes");
-                    processAnnotationsUrl(webinfClasses, webXml);
-                } catch (MalformedURLException e) {
-                    log.error(sm.getString("contextConfig.webinfClassesUrl"), 
e);
+            // Only need to process fragments and annotations if metadata is
+            // not complete
+            Set<WebXml> orderedFragments = null;
+            if  (!webXml.isMetadataComplete()) {
+                // Step 2. Order the fragments.
+                orderedFragments = WebXml.orderWebFragments(webXml, fragments);
+    
+                // Step 3. Look for ServletContainerInitializer implementations
+                ok = processServletContainerInitializers(orderedFragments);
+    
+                // Step 4. Process /WEB-INF/classes for annotations
+                // This will add any matching classes to the typeInitializerMap
+                if (ok) {
+                    URL webinfClasses;
+                    try {
+                        webinfClasses = 
context.getServletContext().getResource(
+                                "/WEB-INF/classes");
+                        processAnnotationsUrl(webinfClasses, webXml);
+                    } catch (MalformedURLException e) {
+                        log.error(sm.getString(
+                                "contextConfig.webinfClassesUrl"), e);
+                    }
                 }
-            }
-
-            // Step 5. Process JARs for annotations - only need to process 
those
-            // fragments we are going to use
-            // This will add any matching classes to the typeInitializerMap
-            if (ok) {
-                processAnnotations(orderedFragments);
-            }
-
-            // Step 6. Merge web-fragment.xml files into the main web.xml file.
-            if (ok) {
-                ok = webXml.merge(orderedFragments);
-            }
-
-            // Step 6.5 Convert explicitly mentioned jsps to servlets
-            if (!false) {
-                convertJsps(webXml);
-            }
-
-            // Step 7. Apply merged web.xml to Context
-            if (ok) {
-                webXml.configureContext(context);
-
-                // Step 7a. Make the merged web.xml available to other
-                // components, specifically Jasper, to save those components
-                // from having to re-generate it.
-                // TODO Use a ServletContainerInitializer for Jasper
-                String mergedWebXml = webXml.toXml();
-                context.getServletContext().setAttribute(
-                       org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML,
-                        mergedWebXml);
-                if (context.getLogEffectiveWebXml()) {
-                    log.info("web.xml:\n" + mergedWebXml);
+    
+                // Step 5. Process JARs for annotations - only need to process
+                // those fragments we are going to use
+                // This will add any matching classes to the typeInitializerMap
+                if (ok) {
+                    processAnnotations(orderedFragments);
+                }
+    
+                // Step 6. Merge web-fragment.xml files into the main web.xml
+                // file.
+                if (ok) {
+                    ok = webXml.merge(orderedFragments);
+                }
+    
+                // Step 6.5 Convert explicitly mentioned jsps to servlets
+                if (!false) {
+                    convertJsps(webXml);
+                }
+    
+                // Step 7. Apply merged web.xml to Context
+                if (ok) {
+                    webXml.configureContext(context);
+    
+                    // Step 7a. Make the merged web.xml available to other
+                    // components, specifically Jasper, to save those 
components
+                    // from having to re-generate it.
+                    // TODO Use a ServletContainerInitializer for Jasper
+                    String mergedWebXml = webXml.toXml();
+                    context.getServletContext().setAttribute(
+                           
org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML,
+                            mergedWebXml);
+                    if (context.getLogEffectiveWebXml()) {
+                        log.info("web.xml:\n" + mergedWebXml);
+                    }
                 }
+            } else {
+                ok = true;
             }
             
+            // Always need to look for static resources
             // Step 8. Look for static resources packaged in JARs
             if (ok) {
                 // Spec does not define an order.
                 // Use ordered JARs followed by remaining JARs
                 Set<WebXml> resourceJars = new LinkedHashSet<WebXml>();
-                for (WebXml fragment : orderedFragments) {
-                    resourceJars.add(fragment);
+                if (orderedFragments != null) {
+                    for (WebXml fragment : orderedFragments) {
+                        resourceJars.add(fragment);
+                    }
                 }
                 for (WebXml fragment : fragments.values()) {
                     if (!resourceJars.contains(fragment)) {
@@ -1292,17 +1303,22 @@ public class ContextConfig
                 processResourceJARs(resourceJars);
             }
             
-            // Step 9. Apply the ServletContainerInitializer config to the
-            // context
-            if (ok) {
-                for (Map.Entry<ServletContainerInitializer,Set<Class<?>>> 
entry :
-                        initializerClassMap.entrySet()) {
-                    if (entry.getValue().isEmpty()) {
-                        context.addServletContainerInitializer(entry.getKey(),
-                                null);
-                    } else {
-                        context.addServletContainerInitializer(entry.getKey(),
-                                entry.getValue());
+            // Only look for ServletContainerInitializer if metadata is not
+            // complete
+            if (!webXml.isMetadataComplete()) {
+                // Step 9. Apply the ServletContainerInitializer config to the
+                // context
+                if (ok) {
+                    for (Map.Entry<ServletContainerInitializer,
+                            Set<Class<?>>> entry : 
+                                initializerClassMap.entrySet()) {
+                        if (entry.getValue().isEmpty()) {
+                            context.addServletContainerInitializer(
+                                    entry.getKey(), null);
+                        } else {
+                            context.addServletContainerInitializer(
+                                    entry.getKey(), entry.getValue());
+                        }
                     }
                 }
             }

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1006033&r1=1006032&r2=1006033&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Oct  8 21:37:19 2010
@@ -103,6 +103,10 @@
         <bug>50017</bug>: Code clean-up. No functional change. Patch provided 
by
         sebb. (markt)
       </update>
+      <fix>
+        <bug>50059</bug>: JARs should always be searched for static resources
+        even if the web application is marked as meta-data complete. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



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

Reply via email to