You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by as...@apache.org on 2015/01/30 11:46:45 UTC

svn commit: r1655980 - in /sling/trunk/bundles/engine: ./ src/main/java/org/apache/sling/engine/ src/main/java/org/apache/sling/engine/impl/filter/ src/test/java/org/apache/sling/engine/impl/filter/

Author: asanso
Date: Fri Jan 30 10:46:45 2015
New Revision: 1655980

URL: http://svn.apache.org/r1655980
Log:
SLING-4294 - Servlet Filter Support adding sling.filter.pattern support

* applied patch with suggested changes

Modified:
    sling/trunk/bundles/engine/pom.xml
    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/filter/AbstractSlingFilterChain.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java
    sling/trunk/bundles/engine/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java

Modified: sling/trunk/bundles/engine/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/pom.xml?rev=1655980&r1=1655979&r2=1655980&view=diff
==============================================================================
--- sling/trunk/bundles/engine/pom.xml (original)
+++ sling/trunk/bundles/engine/pom.xml Fri Jan 30 10:46:45 2015
@@ -105,7 +105,7 @@
                 <configuration>
                     <instructions>
                         <Export-Package>
-                            org.apache.sling.engine;version=2.1;provide:=true,
+                            org.apache.sling.engine;version=2.2;provide:=true,
                             org.apache.sling.engine.servlets;version=2.0.6;provide:=true,
                             org.apache.sling.engine.jmx;version=1.0;provide:=true
                         </Export-Package>

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=1655980&r1=1655979&r2=1655980&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 Fri Jan 30 10:46:45 2015
@@ -154,6 +154,11 @@ public class EngineConstants {
      * @since 2.1, Sling Engine 2.2
      */
     public static final String SLING_FILTER_SCOPE = "sling.filter.scope";
+    
+    /**
+     *@since 2.2, Sling Engine 2.4
+     */
+    public static final String SLING_FILTER_PATTERN = "sling.filter.pattern";
 
     /**
      * Filter scope value identifying a component level filter.

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChain.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChain.java?rev=1655980&r1=1655979&r2=1655980&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChain.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/AbstractSlingFilterChain.java Fri Jan 30 10:46:45 2015
@@ -62,13 +62,15 @@ public abstract class AbstractSlingFilte
 
                 // continue filtering with the next filter
                 FilterHandle filter = this.filters[this.current];
-                trackFilter(slingRequest, filter);
-                filter.getFilter().doFilter(slingRequest, slingResponse, this);
-
+                
+                if (filter.select(slingRequest)) {
+                    trackFilter(slingRequest, filter);
+                    filter.getFilter().doFilter(slingRequest, slingResponse, this);
+                } else if (this.current == this.filters.length-1) {
+                    this.render(slingRequest, slingResponse);
+                }
             } else {
-
                 this.render(slingRequest, slingResponse);
-
             }
 
         } finally {

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java?rev=1655980&r1=1655979&r2=1655980&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/FilterHandle.java Fri Jan 30 10:46:45 2015
@@ -19,12 +19,17 @@
 package org.apache.sling.engine.impl.filter;
 
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.regex.Pattern;
 
 import javax.servlet.Filter;
 
+import org.apache.sling.api.SlingHttpServletRequest;
+
 public class FilterHandle implements Comparable<FilterHandle> {
 
     private final Filter filter;
+    
+    private final Pattern regex;
 
     private final Long filterId;
 
@@ -36,8 +41,14 @@ public class FilterHandle implements Com
 
     private AtomicLong time;
 
-    FilterHandle(Filter filter, Long filterId, int order, final String orderSource) {
+    FilterHandle(Filter filter, String pattern, Long filterId, int order, final String orderSource) {
         this.filter = filter;
+        if (pattern != null && pattern.length() > 0) {
+            this.regex = Pattern.compile(pattern);
+        } else {
+            this.regex = null;
+        }
+        
         this.filterId = filterId;
         this.order = order;
         this.orderSource = orderSource;
@@ -60,6 +71,20 @@ public class FilterHandle implements Com
     public String getOrderSource() {
         return orderSource;
     }
+    
+    boolean select(SlingHttpServletRequest slingHttpServletRequest) {
+        boolean select = true;        
+        if (regex != null) {
+            String uri = slingHttpServletRequest.getPathInfo();
+            // assume root if uri is null
+            if (uri == null)
+            {
+                uri = "/";
+            }
+            select = this.regex.matcher(uri).matches();
+        }        
+        return select;
+    }
 
     public long getCalls() {
         return calls.get();

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=1655980&r1=1655979&r2=1655980&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 Fri Jan 30 10:46:45 2015
@@ -214,6 +214,9 @@ public class ServletFilterManager extend
                 // register by scope
                 String[] scopes = OsgiUtil.toStringArray(
                         reference.getProperty(EngineConstants.SLING_FILTER_SCOPE), null);
+                
+                String pattern = OsgiUtil.toString(reference.getProperty(EngineConstants.SLING_FILTER_PATTERN), "");
+                
                 if ( scopes == null ) {
                     scopes = OsgiUtil.toStringArray(
                         reference.getProperty(EngineConstants.FILTER_SCOPE), null);
@@ -223,14 +226,14 @@ public class ServletFilterManager extend
                         scope = scope.toUpperCase();
                         try {
                             FilterChainType type = FilterChainType.valueOf(scope.toString());
-                            getFilterChain(type).addFilter(filter, serviceId,
+                            getFilterChain(type).addFilter(filter, pattern, serviceId,
                                 order, orderSource);
 
                             if (type == FilterChainType.COMPONENT) {
                                 getFilterChain(FilterChainType.INCLUDE).addFilter(
-                                    filter, serviceId, order, orderSource);
+                                    filter, pattern, serviceId, order, orderSource);
                                 getFilterChain(FilterChainType.FORWARD).addFilter(
-                                    filter, serviceId, order, orderSource);
+                                    filter, pattern, serviceId, order, orderSource);
                             }
 
                         } catch (IllegalArgumentException iae) {
@@ -241,7 +244,7 @@ public class ServletFilterManager extend
                     log.warn(String.format(
                         "A Filter (Service ID %s) has been registered without a filter.scope property.",
                         reference.getProperty(Constants.SERVICE_ID)));
-                    getFilterChain(FilterChainType.REQUEST).addFilter(filter,
+                    getFilterChain(FilterChainType.REQUEST).addFilter(filter, pattern,
                         serviceId, order, orderSource);
                 }
 

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java?rev=1655980&r1=1655979&r2=1655980&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelper.java Fri Jan 30 10:46:45 2015
@@ -42,12 +42,12 @@ public class SlingFilterChainHelper {
     SlingFilterChainHelper() {
     }
 
-    public synchronized Filter addFilter(final Filter filter,
+    public synchronized Filter addFilter(final Filter filter,  String pattern,
             final Long filterId, final int order, final String orderSource) {
         if (filterList == null) {
             filterList = new TreeSet<FilterHandle>();
         }
-        filterList.add(new FilterHandle(filter, filterId, order, orderSource));
+        filterList.add(new FilterHandle(filter, pattern, filterId, order, orderSource));
         filters = getFiltersInternal();
         return filter;
     }

Modified: sling/trunk/bundles/engine/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java?rev=1655980&r1=1655979&r2=1655980&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java (original)
+++ sling/trunk/bundles/engine/src/test/java/org/apache/sling/engine/impl/filter/SlingFilterChainHelperTest.java Fri Jan 30 10:46:45 2015
@@ -36,11 +36,11 @@ public class SlingFilterChainHelperTest
     @Test public void testOrdering() {
         final SlingFilterChainHelper chain = new SlingFilterChainHelper();
 
-        chain.addFilter(context.mock(Filter.class, "A"), 1L, 100, "1:100");
-        chain.addFilter(context.mock(Filter.class, "B"), 2L, 100, "2:100");
-        chain.addFilter(context.mock(Filter.class, "C"), 3L, -100, "3:-100");
-        chain.addFilter(context.mock(Filter.class, "D"), 4L, -1000, "4:-1000");
-        chain.addFilter(context.mock(Filter.class, "E"), 5L, 1000, "5:1000");
+        chain.addFilter(context.mock(Filter.class, "A"), null, 1L, 100, "1:100");
+        chain.addFilter(context.mock(Filter.class, "B"), null, 2L, 100, "2:100");
+        chain.addFilter(context.mock(Filter.class, "C"), null, 3L, -100, "3:-100");
+        chain.addFilter(context.mock(Filter.class, "D"), null, 4L, -1000, "4:-1000");
+        chain.addFilter(context.mock(Filter.class, "E"), null, 5L, 1000, "5:1000");
 
         final FilterHandle[] entries = chain.getFilters();
         assertEquals(5, entries.length);