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: [email protected]
For additional commands, e-mail: [email protected]