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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org