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

Reply via email to