You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2011/01/18 14:22:35 UTC

svn commit: r1060359 - in /sling/trunk/bundles/engine/src/main: java/org/apache/sling/engine/ java/org/apache/sling/engine/impl/ java/org/apache/sling/engine/impl/filter/ resources/OSGI-INF/metatype/

Author: cziegeler
Date: Tue Jan 18 13:22:35 2011
New Revision: 1060359

URL: http://svn.apache.org/viewvc?rev=1060359&view=rev
Log:
SLING-1734 : Change semantics of filter service scope support

Modified:
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/EngineConstants.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java
    sling/trunk/bundles/engine/src/main/resources/OSGI-INF/metatype/metatype.properties

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/EngineConstants.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/EngineConstants.java?rev=1060359&r1=1060358&r2=1060359&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/EngineConstants.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/EngineConstants.java Tue Jan 18 13:22:35 2011
@@ -128,10 +128,34 @@ public class EngineConstants {
      * @see #FILTER_SCOPE_INCLUDE
      * @see #FILTER_SCOPE_REQUEST
      * @since 2.1, Sling Engine 2.2
+     * @deprecated Use {@link #SLING_FILTER_SCOPE} instead
      */
+    @Deprecated
     public static final String FILTER_SCOPE = "filter.scope";
 
     /**
+     * The name of the service registration property of a
+     * <code>java.servlet.Filter</code> service to be used as a filter by the
+     * {@link SlingRequestProcessor}.
+     * <p>
+     * The specification of the <code>sling.filter.scope</code> service registration
+     * property is required for a <code>javax.servlet.Filter</code> service to
+     * be used as a filter by the Sling Engine.
+     * <p>
+     * The <code>sling.filter.scope</code> registration property is expected to be a
+     * scalar String, an array of Strings or a Vector of Strings. Case of the
+     * value is ignored.
+     *
+     * @see #FILTER_SCOPE_COMPONENT
+     * @see #FILTER_SCOPE_ERROR
+     * @see #FILTER_SCOPE_FORWARD
+     * @see #FILTER_SCOPE_INCLUDE
+     * @see #FILTER_SCOPE_REQUEST
+     * @since 2.1, Sling Engine 2.2
+     */
+    public static final String SLING_FILTER_SCOPE = "sling.filter.scope";
+
+    /**
      * Filter scope value identifying a component level filter.
      * <p>
      * Component level filters are called once at the beginning of each request
@@ -140,7 +164,7 @@ public class EngineConstants {
      * by the <code>service.ranking</code> (or {@link #FILTER_ORDER}) property
      * and the service registration ID.
      *
-     * @see #FILTER_SCOPE
+     * @see #SLING_FILTER_SCOPE
      * @since 2.1, Sling Engine 2.2
      */
     public static final String FILTER_SCOPE_COMPONENT = "COMPONENT";

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java?rev=1060359&r1=1060358&r2=1060359&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java Tue Jan 18 13:22:35 2011
@@ -93,6 +93,11 @@ public class SlingMainServlet extends Ge
     @Property(boolValue=DEFAULT_ALLOW_TRACE)
     public static final String PROP_ALLOW_TRACE = "sling.trace.allow";
 
+    public static final boolean DEFAULT_FILTER_COMPAT_MODE = false;
+
+    @Property(boolValue=DEFAULT_FILTER_COMPAT_MODE)
+    public static final String PROP_FILTER_COMPAT_MODE = "sling.filter.compat.mode";
+
     @Property(intValue = RequestHistoryConsolePlugin.STORED_REQUESTS_COUNT)
     private static final String PROP_MAX_RECORD_REQUESTS = "sling.max.record.requests";
 
@@ -306,7 +311,8 @@ public class SlingMainServlet extends Ge
         // the HttpService as filter initialization may cause the servlet
         // context to be required (see SLING-42)
         filterManager = new ServletFilterManager(bundleContext,
-            slingServletContext);
+            slingServletContext,
+            OsgiUtil.toBoolean(componentConfig.get(PROP_FILTER_COMPAT_MODE), DEFAULT_FILTER_COMPAT_MODE));
         filterManager.open();
         requestProcessor.setFilterManager(filterManager);
 

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java?rev=1060359&r1=1060358&r2=1060359&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java Tue Jan 18 13:22:35 2011
@@ -99,8 +99,11 @@ public class ServletFilterManager extend
 
     private final SlingFilterChainHelper[] filterChains;
 
-    public ServletFilterManager(BundleContext context,
-            final SlingServletContext servletContext) {
+    private final boolean compatMode;
+
+    public ServletFilterManager(final BundleContext context,
+            final SlingServletContext servletContext,
+            final boolean compatMode) {
         super(context, FILTER_SERVICE_NAME, null);
         this.servletContext = servletContext;
         this.filterChains = new SlingFilterChainHelper[FilterChainType.values().length];
@@ -109,6 +112,7 @@ public class ServletFilterManager extend
         this.filterChains[FilterChainType.INCLUDE.ordinal()] = new SlingFilterChainHelper();
         this.filterChains[FilterChainType.FORWARD.ordinal()] = new SlingFilterChainHelper();
         this.filterChains[FilterChainType.COMPONENT.ordinal()] = new SlingFilterChainHelper();
+        this.compatMode = compatMode;
     }
 
     public SlingFilterChainHelper getFilterChain(final FilterChainType chain) {
@@ -146,13 +150,31 @@ public class ServletFilterManager extend
         super.removedService(reference, service);
     }
 
+    /**
+     * Check if the filter should be excluded.
+     */
+    private boolean excludeFilter(final ServiceReference reference) {
+        // if the service has a filter scope property, we include it
+        if ( reference.getProperty(EngineConstants.SLING_FILTER_SCOPE) != null
+             || reference.getProperty(EngineConstants.FILTER_SCOPE) != null ) {
+            return false;
+        }
+        // in compat mode we allow all filters not having the felix pattern prop!
+        if ( this.compatMode ) {
+            // Check if filter will be registered by Felix HttpService Whiteboard
+            if (reference.getProperty(FELIX_WHITEBOARD_PATTERN_PROPERTY) != null) {
+                return true;
+            }
+            return false;
+        }
+        return true;
+    }
+
     private void initFilter(final ServiceReference reference,
             final Filter filter) {
-        // Check if filter will be registered by Felix HttpService Whiteboard
-        if (reference.getProperty(FELIX_WHITEBOARD_PATTERN_PROPERTY) != null) {
+        if ( this.excludeFilter(reference) ) {
             return;
         }
-
         final String filterName = SlingFilterConfig.getName(reference);
         if (filterName == null) {
             log.error("initFilter: Missing name for filter {}", reference);
@@ -188,7 +210,11 @@ public class ServletFilterManager extend
 
                 // register by scope
                 String[] scopes = OsgiUtil.toStringArray(
-                    reference.getProperty(EngineConstants.FILTER_SCOPE), null);
+                        reference.getProperty(EngineConstants.SLING_FILTER_SCOPE), null);
+                if ( scopes == null ) {
+                    scopes = OsgiUtil.toStringArray(
+                        reference.getProperty(EngineConstants.FILTER_SCOPE), null);
+                }
                 if (scopes != null && scopes.length > 0) {
                     for (String scope : scopes) {
                         scope = scope.toUpperCase();

Modified: sling/trunk/bundles/engine/src/main/resources/OSGI-INF/metatype/metatype.properties
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/resources/OSGI-INF/metatype/metatype.properties?rev=1060359&r1=1060358&r2=1060359&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/resources/OSGI-INF/metatype/metatype.properties (original)
+++ sling/trunk/bundles/engine/src/main/resources/OSGI-INF/metatype/metatype.properties Tue Jan 18 13:22:35 2011
@@ -50,6 +50,10 @@ sling.max.record.requests.description = 
  internally recorded for display on the "Recent Requests" Web Console page. If \
  this value is less than or equal to zero, no requests are internally kept. The \
  default value is 20. 
+sling.filter.compat.mode.name = Filter Compat Mode
+sling.filter.compat.mode.description = This switch controls the handling of \
+ servlet filters. By default only filters with a scope property are registered. \
+ In compat mode, the scope property is not required.
 
 #
 # Request Loggger Filter