You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/01/09 12:56:23 UTC

svn commit: r1430806 - in /tomcat/trunk: java/org/apache/catalina/deploy/WebXml.java java/org/apache/catalina/startup/ContextConfig.java test/org/apache/catalina/deploy/TestWebXmlOrdering.java

Author: markt
Date: Wed Jan  9 11:56:22 2013
New Revision: 1430806

URL: http://svn.apache.org/viewvc?rev=1430806&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54391
Provide a value for the javax.servlet.context.orderedLibs attribute 

Modified:
    tomcat/trunk/java/org/apache/catalina/deploy/WebXml.java
    tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
    tomcat/trunk/test/org/apache/catalina/deploy/TestWebXmlOrdering.java

Modified: tomcat/trunk/java/org/apache/catalina/deploy/WebXml.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/WebXml.java?rev=1430806&r1=1430805&r2=1430806&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/deploy/WebXml.java (original)
+++ tomcat/trunk/java/org/apache/catalina/deploy/WebXml.java Wed Jan  9 11:56:22 2013
@@ -32,6 +32,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 
 import javax.servlet.MultipartConfigElement;
+import javax.servlet.ServletContext;
 import javax.servlet.SessionCookieConfig;
 import javax.servlet.SessionTrackingMode;
 import javax.servlet.descriptor.JspPropertyGroupDescriptor;
@@ -566,6 +567,10 @@ public class WebXml {
     public void setURL(URL url) { this.uRL = url; }
     public URL getURL() { return uRL; }
 
+    // Name of jar file
+    private String jarName = null;
+    public void setJarName(String jarName) { this.jarName = jarName; }
+    public String getJarName() { return jarName; }
 
     @Override
     public String toString() {
@@ -2084,19 +2089,23 @@ public class WebXml {
      * the order that the fragments must be processed as per the rules in the
      * Servlet spec.
      *
-     * @param application   The application web.xml file
-     * @param fragments     The map of fragment names to web fragments
+     * @param application    The application web.xml file
+     * @param fragments      The map of fragment names to web fragments
+     * @param servletContext The servlet context the fragments are associated
+     *                       with
      * @return Ordered list of web-fragment.xml files to process
      */
     public static Set<WebXml> orderWebFragments(WebXml application,
-            Map<String,WebXml> fragments) {
+            Map<String,WebXml> fragments, ServletContext servletContext) {
 
         Set<WebXml> orderedFragments = new LinkedHashSet<>();
 
         boolean absoluteOrdering =
             (application.getAbsoluteOrdering() != null);
+        boolean orderingPresent = false;
 
         if (absoluteOrdering) {
+            orderingPresent = true;
             // Only those fragments listed should be processed
             Set<String> requestedOrder = application.getAbsoluteOrdering();
 
@@ -2127,6 +2136,7 @@ public class WebXml {
                 Iterator<String> before =
                         fragment.getBeforeOrdering().iterator();
                 while (before.hasNext()) {
+                    orderingPresent = true;
                     String beforeEntry = before.next();
                     if (!beforeEntry.equals(ORDER_OTHERS)) {
                         WebXml beforeFragment = fragments.get(beforeEntry);
@@ -2139,6 +2149,7 @@ public class WebXml {
                 }
                 Iterator<String> after = fragment.getAfterOrdering().iterator();
                 while (after.hasNext()) {
+                    orderingPresent = true;
                     String afterEntry = after.next();
                     if (!afterEntry.equals(ORDER_OTHERS)) {
                         WebXml afterFragment = fragments.get(afterEntry);
@@ -2198,6 +2209,20 @@ public class WebXml {
             orderFragments(orderedFragments, afterSet);
         }
 
+        // Avoid NPE when unit testing
+        if (servletContext != null) {
+            // Publish the ordered fragments
+            List<String> orderedJarFileNames = null;
+            if (orderingPresent) {
+                orderedJarFileNames = new ArrayList<>();
+                for (WebXml fragment: orderedFragments) {
+                    orderedJarFileNames.add(fragment.getJarName());
+                }
+            }
+            servletContext.setAttribute(ServletContext.ORDERED_LIBS,
+                    orderedJarFileNames);
+        }
+
         return orderedFragments;
     }
 

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=1430806&r1=1430805&r2=1430806&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Wed Jan  9 11:56:22 2013
@@ -1166,7 +1166,8 @@ public class ContextConfig implements Li
 
         // Step 2. Order the fragments.
         Set<WebXml> orderedFragments = null;
-        orderedFragments = WebXml.orderWebFragments(webXml, fragments);
+        orderedFragments =
+                WebXml.orderWebFragments(webXml, fragments, sContext);
 
         // Step 3. Look for ServletContainerInitializer implementations
         if (ok) {
@@ -2505,10 +2506,22 @@ public class ContextConfig implements Li
                 if (fragment.getName() == null) {
                     fragment.setName(fragment.getURL().toString());
                 }
+                fragment.setJarName(extractJarFileName(url));
                 fragments.put(fragment.getName(), fragment);
             }
         }
 
+        private String extractJarFileName(URL input) {
+            String url = input.toString();
+            if (url.endsWith("!/")) {
+                // Remove it
+                url = url.substring(0, url.length() - 2);
+            }
+
+            // File name will now be whatever is after the final /
+            return url.substring(url.lastIndexOf('/') + 1);
+        }
+
         @Override
         public void scan(File file) throws IOException {
 
@@ -2536,6 +2549,7 @@ public class ContextConfig implements Li
                 if (fragment.getName() == null) {
                     fragment.setName(fragment.getURL().toString());
                 }
+                fragment.setJarName(file.getName());
                 fragments.put(fragment.getName(), fragment);
             }
         }

Modified: tomcat/trunk/test/org/apache/catalina/deploy/TestWebXmlOrdering.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/deploy/TestWebXmlOrdering.java?rev=1430806&r1=1430805&r2=1430806&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/deploy/TestWebXmlOrdering.java (original)
+++ tomcat/trunk/test/org/apache/catalina/deploy/TestWebXmlOrdering.java Wed Jan  9 11:56:22 2013
@@ -84,7 +84,7 @@ public class TestWebXmlOrdering {
         app.addAbsoluteOrdering("e");
         app.addAbsoluteOrdering("d");
 
-        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments);
+        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments, null);
 
         Iterator<WebXml> iter = ordered.iterator();
         assertEquals(c,iter.next());
@@ -100,7 +100,7 @@ public class TestWebXmlOrdering {
         app.addAbsoluteOrdering("c");
         app.addAbsoluteOrdering("a");
 
-        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments);
+        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments, null);
 
         Iterator<WebXml> iter = ordered.iterator();
         assertEquals(c,iter.next());
@@ -120,7 +120,7 @@ public class TestWebXmlOrdering {
         others.add(e);
         others.add(f);
 
-        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments);
+        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments, null);
 
         Iterator<WebXml> iter = ordered.iterator();
         while (others.size() > 0) {
@@ -145,7 +145,7 @@ public class TestWebXmlOrdering {
         others.add(e);
         others.add(f);
 
-        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments);
+        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments, null);
 
         Iterator<WebXml> iter = ordered.iterator();
         assertEquals(b,iter.next());
@@ -163,7 +163,7 @@ public class TestWebXmlOrdering {
     public void testWebFragmentsAbsoluteWrongFragmentName() {
         app.addAbsoluteOrdering("a");
         app.addAbsoluteOrdering("z");
-        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments);
+        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments, null);
         assertEquals(1,ordered.size());
         assertEquals(fragments.get("a"),ordered.toArray()[0]);
     }
@@ -180,7 +180,7 @@ public class TestWebXmlOrdering {
         others.add(e);
         others.add(f);
 
-        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments);
+        Set<WebXml> ordered = WebXml.orderWebFragments(app, fragments, null);
 
         Iterator<WebXml> iter = ordered.iterator();
         assertEquals(b,iter.next());
@@ -238,7 +238,7 @@ public class TestWebXmlOrdering {
                             */
 
                             Set<WebXml> ordered =
-                                    WebXml.orderWebFragments(app, input);
+                                    WebXml.orderWebFragments(app, input, null);
                             populatePositions(ordered);
 
                             runner.validate(getOrder(ordered));
@@ -341,7 +341,7 @@ public class TestWebXmlOrdering {
         a.addBeforeOrdering("b");
         b.addBeforeOrdering("a");
 
-        WebXml.orderWebFragments(app, fragments);
+        WebXml.orderWebFragments(app, fragments, null);
     }
 
     @Test(expected=IllegalArgumentException.class)
@@ -351,7 +351,7 @@ public class TestWebXmlOrdering {
         c.addBeforeOrdering("a");
         c.addAfterOrdering("b");
 
-        WebXml.orderWebFragments(app, fragments);
+        WebXml.orderWebFragments(app, fragments, null);
     }
 
     private interface RelativeOrderingTestRunner {



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