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 2014/01/15 14:36:29 UTC

svn commit: r1558379 - in /tomcat/tc7.0.x/trunk: ./ java/org/apache/catalina/ java/org/apache/catalina/core/ java/org/apache/catalina/startup/ test/org/apache/catalina/core/ test/org/apache/catalina/startup/ webapps/docs/ webapps/docs/config/

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org