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