Author: markt Date: Wed Jan 15 13:36:29 2014 New Revision: 1558379 URL: http://svn.apache.org/r1558379 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55855 Provide a context level option to exclude container SCIs.
Modified: tomcat/tc7.0.x/trunk/ (props changed) tomcat/tc7.0.x/trunk/java/org/apache/catalina/Context.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/FailedContext.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/WebappServiceLoader.java tomcat/tc7.0.x/trunk/test/org/apache/catalina/core/TesterContext.java tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestWebappServiceLoader.java tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml tomcat/tc7.0.x/trunk/webapps/docs/config/context.xml Propchange: tomcat/tc7.0.x/trunk/ ------------------------------------------------------------------------------ Merged /tomcat/trunk:r1558355 Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/Context.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/Context.java?rev=1558379&r1=1558378&r2=1558379&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/Context.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/Context.java Wed Jan 15 13:36:29 2014 @@ -752,9 +752,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/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1558379&r1=1558378&r2=1558379&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/StandardContext.java Wed Jan 15 13:36:29 2014 @@ -893,10 +893,24 @@ public class StandardContext extends Con private Map<String, String> preDestroyMethods = new HashMap<String, String>(); + 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/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=1558379&r1=1558378&r2=1558379&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java Wed Jan 15 13:36:29 2014 @@ -1539,7 +1539,8 @@ public class ContextConfig implements Li List<ServletContainerInitializer> detectedScis; try { WebappServiceLoader<ServletContainerInitializer> loader = - new WebappServiceLoader<ServletContainerInitializer>(servletContext); + new WebappServiceLoader<ServletContainerInitializer>( + servletContext, context.getContainerSciFilter()); detectedScis = loader.load(ServletContainerInitializer.class); } catch (IOException e) { log.error(sm.getString( Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/FailedContext.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/FailedContext.java?rev=1558379&r1=1558378&r2=1558379&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/FailedContext.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/FailedContext.java Wed Jan 15 13:36:29 2014 @@ -697,4 +697,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/tc7.0.x/trunk/java/org/apache/catalina/startup/WebappServiceLoader.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/WebappServiceLoader.java?rev=1558379&r1=1558378&r2=1558379&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/WebappServiceLoader.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/WebappServiceLoader.java Wed Jan 15 13:36:29 2014 @@ -26,8 +26,10 @@ import java.nio.charset.Charset; 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; @@ -56,14 +58,20 @@ public class WebappServiceLoader<T> { private static final Charset UTF8 = Charset.forName("UTF-8"); 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; + } } /** @@ -123,6 +131,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/tc7.0.x/trunk/test/org/apache/catalina/core/TesterContext.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/core/TesterContext.java?rev=1558379&r1=1558378&r2=1558379&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/catalina/core/TesterContext.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/core/TesterContext.java Wed Jan 15 13:36:29 2014 @@ -1213,4 +1213,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/tc7.0.x/trunk/test/org/apache/catalina/startup/TestWebappServiceLoader.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestWebappServiceLoader.java?rev=1558379&r1=1558378&r2=1558379&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestWebappServiceLoader.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/startup/TestWebappServiceLoader.java Wed Jan 15 13:36:29 2014 @@ -36,7 +36,8 @@ public class TestWebappServiceLoader ext tomcat.start(); WebappServiceLoader<ServletContainerInitializer> loader = - new WebappServiceLoader<ServletContainerInitializer>(ctxt.getServletContext()); + new WebappServiceLoader<ServletContainerInitializer>(ctxt.getServletContext(), null); + @SuppressWarnings("unused") Collection<ServletContainerInitializer> initializers = loader.load(ServletContainerInitializer.class); } } Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1558379&r1=1558378&r2=1558379&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Wed Jan 15 13:36:29 2014 @@ -63,6 +63,10 @@ the container may not be found. (markt/jboynes) </fix> <fix> + <bug>55855</bug>: Provide a per Context option (containerSciFilter) to + exclude container SCIs. (markt) + </fix> + <fix> <bug>55937</bug>: When deploying applications, treat a context path of <code>/ROOT</code> as equivalent to <code>/</code>. (markt) </fix> Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/context.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/context.xml?rev=1558379&r1=1558378&r2=1558379&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/config/context.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/config/context.xml Wed Jan 15 13:36:29 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