Author: markt Date: Wed Jan 15 12:23:23 2014 New Revision: 1558355 URL: http://svn.apache.org/r1558355 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55855 Provide a context level option to exclude container SCIs.
Modified: tomcat/trunk/java/org/apache/catalina/Context.java tomcat/trunk/java/org/apache/catalina/core/StandardContext.java tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java tomcat/trunk/java/org/apache/catalina/startup/WebappServiceLoader.java tomcat/trunk/test/org/apache/catalina/core/TesterContext.java tomcat/trunk/test/org/apache/catalina/startup/TestWebappServiceLoader.java tomcat/trunk/webapps/docs/config/context.xml Modified: tomcat/trunk/java/org/apache/catalina/Context.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Context.java?rev=1558355&r1=1558354&r2=1558355&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/Context.java (original) +++ tomcat/trunk/java/org/apache/catalina/Context.java Wed Jan 15 12:23:23 2014 @@ -694,9 +694,34 @@ public interface Context extends Contain */ public void setInstanceManager(InstanceManager instanceManager); - // --------------------------------------------------------- Public Methods + /** + * Sets the regular expression that specifies which container provided SCIs + * should be filtered out and not used for this context. Matching uses + * {@link java.util.regex.Matcher#find()} so the regular expression only has + * to match a sub-string of the fully qualified class name of the container + * provided SCI for it to be filtered out. + * + * @param containerSciFilter The regular expression against which the fully + * qualified class name of each container provided + * SCI should be checked + */ + public void setContainerSciFilter(String containerSciFilter); + + /** + * Obtains the regular expression that specifies which container provided + * SCIs should be filtered out and not used for this context. Matching uses + * {@link java.util.regex.Matcher#find()} so the regular expression only has + * to match a sub-string of the fully qualified class name of the container + * provided SCI for it to be filtered out. + * + * @return The regular expression against which the fully qualified class + * name of each container provided SCI will be checked + */ + public String getContainerSciFilter(); + // --------------------------------------------------------- Public Methods + /** * Add a new Listener class name to the set of Listeners * configured for this application. Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1558355&r1=1558354&r2=1558355&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Wed Jan 15 12:23:23 2014 @@ -805,10 +805,24 @@ public class StandardContext extends Con private Map<String, String> postConstructMethods = new HashMap<>(); private Map<String, String> preDestroyMethods = new HashMap<>(); + private String containerSciFilter; + // ----------------------------------------------------- Context Properties @Override + public void setContainerSciFilter(String containerSciFilter) { + this.containerSciFilter = containerSciFilter; + } + + + @Override + public String getContainerSciFilter() { + return containerSciFilter; + } + + + @Override public boolean getSendRedirectBody() { return sendRedirectBody; } 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=1558355&r1=1558354&r2=1558355&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Wed Jan 15 12:23:23 2014 @@ -1595,7 +1595,7 @@ public class ContextConfig implements Li List<ServletContainerInitializer> detectedScis; try { WebappServiceLoader<ServletContainerInitializer> loader = - new WebappServiceLoader<>(servletContext); + new WebappServiceLoader<>(servletContext, context.getContainerSciFilter()); detectedScis = loader.load(ServletContainerInitializer.class); } catch (IOException e) { log.error(sm.getString( Modified: tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java?rev=1558355&r1=1558354&r2=1558355&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/FailedContext.java Wed Jan 15 12:23:23 2014 @@ -724,4 +724,10 @@ public class FailedContext extends Lifec @Override public void setInstanceManager(InstanceManager instanceManager) { /* NO-OP */ } + + @Override + public void setContainerSciFilter(String containerSciFilter) { /* NO-OP */ } + + @Override + public String getContainerSciFilter() { return null; } } \ No newline at end of file Modified: tomcat/trunk/java/org/apache/catalina/startup/WebappServiceLoader.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/WebappServiceLoader.java?rev=1558355&r1=1558354&r2=1558355&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/startup/WebappServiceLoader.java (original) +++ tomcat/trunk/java/org/apache/catalina/startup/WebappServiceLoader.java Wed Jan 15 12:23:23 2014 @@ -26,8 +26,10 @@ import java.nio.charset.StandardCharsets import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; +import java.util.regex.Pattern; import javax.servlet.ServletContext; @@ -55,14 +57,20 @@ public class WebappServiceLoader<T> { private static final String SERVICES = "META-INF/services/"; private final ServletContext context; + private final Pattern containerSciFilterPattern; /** * Construct a loader to load services from a ServletContext. * * @param context the context to use */ - public WebappServiceLoader(ServletContext context) { + public WebappServiceLoader(ServletContext context, String containerSciFilter) { this.context = context; + if (containerSciFilter != null && containerSciFilter.length() > 0) { + containerSciFilterPattern = Pattern.compile(containerSciFilter); + } else { + containerSciFilterPattern = null; + } } /** @@ -122,6 +130,16 @@ public class WebappServiceLoader<T> { parseConfigFile(containerServicesFound, resources.nextElement()); } + // Filter the discovered container SCIs if required + if (containerSciFilterPattern != null) { + Iterator<String> iter = containerServicesFound.iterator(); + while (iter.hasNext()) { + if (containerSciFilterPattern.matcher(iter.next()).find()) { + iter.remove(); + } + } + } + // Add the application services after the container services to ensure // that the container services are loaded first containerServicesFound.addAll(applicationServicesFound); Modified: tomcat/trunk/test/org/apache/catalina/core/TesterContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TesterContext.java?rev=1558355&r1=1558354&r2=1558355&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/core/TesterContext.java (original) +++ tomcat/trunk/test/org/apache/catalina/core/TesterContext.java Wed Jan 15 12:23:23 2014 @@ -1189,4 +1189,10 @@ public class TesterContext implements Co public void setInstanceManager(InstanceManager instanceManager) { // NO-OP } + + @Override + public void setContainerSciFilter(String containerSciFilter) { /* NO-OP */ } + + @Override + public String getContainerSciFilter() { return null; } } Modified: tomcat/trunk/test/org/apache/catalina/startup/TestWebappServiceLoader.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/TestWebappServiceLoader.java?rev=1558355&r1=1558354&r2=1558355&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/startup/TestWebappServiceLoader.java (original) +++ tomcat/trunk/test/org/apache/catalina/startup/TestWebappServiceLoader.java Wed Jan 15 12:23:23 2014 @@ -57,7 +57,7 @@ public class TestWebappServiceLoader { @Test public void testNoInitializersFound() throws IOException { - loader = new WebappServiceLoader<>(context); + loader = new WebappServiceLoader<>(context, null); EasyMock.expect(context.getAttribute(ServletContext.ORDERED_LIBS)) .andReturn(null); EasyMock.expect(cl.getResources(CONFIG_FILE)) @@ -73,7 +73,7 @@ public class TestWebappServiceLoader { URL url = new URL("file://test"); loader = EasyMock.createMockBuilder(WebappServiceLoader.class) .addMockedMethod("parseConfigFile", LinkedHashSet.class, URL.class) - .withConstructor(context).createMock(control); + .withConstructor(context, "").createMock(control); EasyMock.expect(context.getAttribute(ServletContext.ORDERED_LIBS)) .andReturn(null); EasyMock.expect(cl.getResources(CONFIG_FILE)) @@ -93,7 +93,7 @@ public class TestWebappServiceLoader { URL sci2 = new URL("file://dir/" + CONFIG_FILE); loader = EasyMock.createMockBuilder(WebappServiceLoader.class) .addMockedMethod("parseConfigFile", LinkedHashSet.class, URL.class) - .withConstructor(context).createMock(control); + .withConstructor(context, "").createMock(control); List<String> jars = Arrays.asList("jar1.jar", "dir/"); EasyMock.expect(context.getAttribute(ServletContext.ORDERED_LIBS)) .andReturn(jars); @@ -114,7 +114,7 @@ public class TestWebappServiceLoader { @Test public void testParseConfigFile() throws IOException { LinkedHashSet<String> found = new LinkedHashSet<>(); - loader = new WebappServiceLoader<>(context); + loader = new WebappServiceLoader<>(context, null); loader.parseConfigFile(found, getClass().getResource("service-config.txt")); Assert.assertEquals(Collections.singleton("provider1"), found); } @@ -122,7 +122,7 @@ public class TestWebappServiceLoader { @Test public void testLoadServices() throws Exception { Class<?> sci = TesterServletContainerInitializer1.class; - loader = new WebappServiceLoader<>(context); + loader = new WebappServiceLoader<>(context, null); cl.loadClass(sci.getName()); EasyMock.expectLastCall() .andReturn(sci); @@ -139,7 +139,7 @@ public class TestWebappServiceLoader { @Test public void testServiceIsNotExpectedType() throws Exception { Class<?> sci = Object.class; - loader = new WebappServiceLoader<>(context); + loader = new WebappServiceLoader<>(context, null); cl.loadClass(sci.getName()); EasyMock.expectLastCall() .andReturn(sci); @@ -158,7 +158,7 @@ public class TestWebappServiceLoader { @Test public void testServiceCannotBeConstructed() throws Exception { Class<?> sci = Integer.class; - loader = new WebappServiceLoader<>(context); + loader = new WebappServiceLoader<>(context, null); cl.loadClass(sci.getName()); EasyMock.expectLastCall() .andReturn(sci); Modified: tomcat/trunk/webapps/docs/config/context.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/context.xml?rev=1558355&r1=1558354&r2=1558355&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/config/context.xml (original) +++ tomcat/trunk/webapps/docs/config/context.xml Wed Jan 15 12:23:23 2014 @@ -291,6 +291,15 @@ If not specified, the standard value (defined below) will be used.</p> </attribute> + <attribute name="containerSciFilter" required="false"> + <p>The regular expression that specifies which container provided SCIs + should be filtered out and not used for this context. Matching uses + <code>java.util.regex.Matcher.find()</code> so the regular expression + only has to match a sub-string of the fully qualified class name of the + container provided SCI for it to be filtered out. If not specified, + no filtering will be applied.</p> + </attribute> + <attribute name="cookies" required="false"> <p>Set to <code>true</code> if you want cookies to be used for session identifier communication if supported by the client (this --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org