Author: sseifert
Date: Wed Oct  1 08:23:59 2014
New Revision: 1628637

URL: http://svn.apache.org/r1628637
Log:
SLING-3511 Support selectors for pipeline configuration (patch supplied by Dirk 
Rudolph)

Added:
    sling/trunk/contrib/extensions/rewriter/src/test/
    sling/trunk/contrib/extensions/rewriter/src/test/java/
    sling/trunk/contrib/extensions/rewriter/src/test/java/org/
    sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/
    sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/
    
sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/rewriter/
    
sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/rewriter/impl/
    
sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImplTest.java
   (with props)
Modified:
    sling/trunk/contrib/extensions/rewriter/pom.xml
    
sling/trunk/contrib/extensions/rewriter/src/main/java/org/apache/sling/rewriter/impl/FactoryCache.java
    
sling/trunk/contrib/extensions/rewriter/src/main/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImpl.java

Modified: sling/trunk/contrib/extensions/rewriter/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/rewriter/pom.xml?rev=1628637&r1=1628636&r2=1628637&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/rewriter/pom.xml (original)
+++ sling/trunk/contrib/extensions/rewriter/pom.xml Wed Oct  1 08:23:59 2014
@@ -142,5 +142,24 @@
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>
+
+        <!-- testing -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.commons.testing</artifactId>
+            <version>2.0.16</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>1.9.5</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

Modified: 
sling/trunk/contrib/extensions/rewriter/src/main/java/org/apache/sling/rewriter/impl/FactoryCache.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/rewriter/src/main/java/org/apache/sling/rewriter/impl/FactoryCache.java?rev=1628637&r1=1628636&r2=1628637&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/rewriter/src/main/java/org/apache/sling/rewriter/impl/FactoryCache.java
 (original)
+++ 
sling/trunk/contrib/extensions/rewriter/src/main/java/org/apache/sling/rewriter/impl/FactoryCache.java
 Wed Oct  1 08:23:59 2014
@@ -64,6 +64,9 @@ public class FactoryCache {
     /** The optional property for the content types the component should apply 
to */
     private static final String PROPERTY_CONTENT_TYPES = 
"pipeline.contentTypes";
 
+    /** The optional property for the selectors the component should apply to 
*/
+    private static final String PROPERTY_SELECTORS = "pipeline.selectors";
+
     /** The optional property for the resource types the component should 
apply to */
     private static final String PROPERTY_RESOURCE_TYPES = 
"pipeline.resourceTypes";
 
@@ -430,12 +433,14 @@ public class FactoryCache {
             final String[] extensions = 
OsgiUtil.toStringArray(ref.getProperty(PROPERTY_EXTENSIONS), null);
             final String[] contentTypes = 
OsgiUtil.toStringArray(ref.getProperty(PROPERTY_CONTENT_TYPES), null);
             final String[] resourceTypes = 
OsgiUtil.toStringArray(ref.getProperty(PROPERTY_RESOURCE_TYPES), null);
+            final String[] selectors = 
OsgiUtil.toStringArray(ref.getProperty(PROPERTY_SELECTORS), null);
             final boolean noCheckRequired = (paths == null || paths.length == 
0) &&
                                    (extensions == null || extensions.length == 
0) &&
                                    (contentTypes == null || 
contentTypes.length == 0) &&
-                                   (resourceTypes == null || 
resourceTypes.length == 0);
+                                   (resourceTypes == null || 
resourceTypes.length == 0) &&
+                                   (selectors == null || selectors.length == 
0);
             if ( !noCheckRequired ) {
-                this.configuration = new 
ProcessorConfigurationImpl(contentTypes, paths, extensions, resourceTypes);
+                this.configuration = new 
ProcessorConfigurationImpl(contentTypes, paths, extensions, resourceTypes, 
selectors);
             } else {
                 this.configuration = null;
             }

Modified: 
sling/trunk/contrib/extensions/rewriter/src/main/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/rewriter/src/main/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImpl.java?rev=1628637&r1=1628636&r2=1628637&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/rewriter/src/main/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImpl.java
 (original)
+++ 
sling/trunk/contrib/extensions/rewriter/src/main/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImpl.java
 Wed Oct  1 08:23:59 2014
@@ -18,7 +18,9 @@ package org.apache.sling.rewriter.impl;
 
 import java.io.PrintWriter;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
@@ -47,6 +49,8 @@ public class ProcessorConfigurationImpl 
 
     private static final String PROPERTY_RESOURCE_TYPES = "resourceTypes";
 
+    private static final String PROPERTY_SELECTORS = "selectors";
+
     private static final String PROPERTY_TRANFORMERS = "transformerTypes";
 
     private static final String PROPERTY_GENERATOR = "generatorType";
@@ -70,6 +74,9 @@ public class ProcessorConfigurationImpl 
     /** For which resource types should this processor be applied. */
     private final String[] resourceTypes;
 
+    /** For which selectors should this processor be applied. */
+    private final String[] selectors;
+
     /** The order of this processor */
     private final int order;
 
@@ -105,6 +112,7 @@ public class ProcessorConfigurationImpl 
                                       String[] paths,
                                       String[] extensions,
                                       String[] resourceTypes,
+                                      String[] selectors,
                                       int      order,
                                       ProcessingComponentConfiguration 
generatorConfig,
                                       ProcessingComponentConfiguration[] 
transformerConfigs,
@@ -112,6 +120,7 @@ public class ProcessorConfigurationImpl 
                                       boolean processErrorResponse) {
         this.contentTypes = contentTypes;
         this.resourceTypes = resourceTypes;
+        this.selectors = selectors;
         this.paths = paths;
         this.extensions = extensions;
         this.order = order;
@@ -132,8 +141,9 @@ public class ProcessorConfigurationImpl 
     public ProcessorConfigurationImpl(String[] contentTypes,
                                       String[] paths,
                                       String[] extensions,
-                                      String[] resourceTypes) {
-        this(contentTypes, paths, extensions, resourceTypes, 0, null, null, 
null, false);
+                                      String[] resourceTypes,
+                                      String[] selectors) {
+        this(contentTypes, paths, extensions, resourceTypes, selectors, 0, 
null, null, null, false);
     }
 
     /**
@@ -144,6 +154,7 @@ public class ProcessorConfigurationImpl 
         final ValueMap properties = ResourceUtil.getValueMap(resource);
         this.contentTypes = properties.get(PROPERTY_CONTENT_TYPES, 
String[].class);
         this.resourceTypes = properties.get(PROPERTY_RESOURCE_TYPES, 
String[].class);
+        this.selectors = properties.get(PROPERTY_SELECTORS, String[].class);
         this.paths = properties.get(PROPERTY_PATHS, String[].class);
         this.extensions = properties.get(PROPERTY_EXTENSIONS, String[].class);
 
@@ -185,6 +196,10 @@ public class ProcessorConfigurationImpl 
             pw.print("Resource Types : ");
             pw.println(Arrays.toString(this.resourceTypes));
         }
+        if ( this.selectors != null ) {
+            pw.print("Selectors : ");
+            pw.println(Arrays.toString(this.selectors));
+        }
         if ( this.paths != null ) {
             pw.print("Paths : ");
             pw.println(Arrays.toString(this.paths));
@@ -235,13 +250,18 @@ public class ProcessorConfigurationImpl 
         if ( this.contentTypes != null ) {
             sb.append("contentTypes=");
             sb.append(Arrays.toString(this.contentTypes));
-            sb.append(',');
+            sb.append(", ");
         }
         if ( this.resourceTypes != null ) {
             sb.append("resourceTypes=");
             sb.append(Arrays.toString(this.resourceTypes));
             sb.append(", ");
         }
+        if ( this.selectors != null ) {
+            sb.append("selectors=");
+            sb.append(Arrays.toString(this.selectors));
+            sb.append(", ");
+        }
         if ( this.paths != null ) {
             sb.append("paths=");
             sb.append(Arrays.toString(this.paths));
@@ -417,6 +437,31 @@ public class ProcessorConfigurationImpl 
                 return false;
             }
         }
+
+        // now check for selectors
+        if( this.selectors != null && this.selectors.length > 0 ) {
+            final String selectorString = 
processContext.getRequest().getRequestPathInfo().getSelectorString();
+            if ( selectorString == null || "".equals(selectorString )) {
+                // selectors required but not set
+                return false;
+            }
+
+            final Set<String> selectors = new 
HashSet<String>(Arrays.asList(selectorString.split("\\.")));
+            int index = 0;
+            boolean found = false;
+            while ( !found && index < this.selectors.length ) {
+                final String selector = this.selectors[index];
+                if( selectors.contains(selector) ) {
+                    found = true;
+                }
+                index++;
+            }
+
+            if( !found ) {
+                return false;
+            }
+        }
+
         return true;
     }
 

Added: 
sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImplTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImplTest.java?rev=1628637&view=auto
==============================================================================
--- 
sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImplTest.java
 (added)
+++ 
sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImplTest.java
 Wed Oct  1 08:23:59 2014
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations 
under
+ * the License.
+ */
+package org.apache.sling.rewriter.impl;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.commons.testing.sling.MockResourceResolver;
+import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest;
+import org.apache.sling.rewriter.ProcessingContext;
+import org.apache.sling.rewriter.ProcessorConfiguration;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author diru
+ */
+public class ProcessorConfigurationImplTest {
+
+    private MockSlingHttpServletRequest mockRequestWithSelector;
+    private MockSlingHttpServletRequest mockRequestWithoutSelector;
+
+    @Before
+    public void setup() {
+        this.mockRequestWithSelector = new 
MockSlingHttpServletRequest("/content/path", "sel1.sel2", "xml", null, null);
+        this.mockRequestWithoutSelector = new 
MockSlingHttpServletRequest("/content/path", null, "xml", null, null);
+        // mock the resource resolver and create also a mocked resource to 
prevent NPE in ResourceUtil.
+        final MockResourceResolver mockResourceResolver = new 
MockResourceResolver();
+        mockResourceResolver.setSearchPath("/libs");
+        this.mockRequestWithSelector.setResourceResolver(mockResourceResolver);
+        
this.mockRequestWithoutSelector.setResourceResolver(mockResourceResolver);
+    }
+
+    @Test
+    public void testMatchContentTypeMismatch() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(new String[] {"text/html",
+            "text/plain" }, null, null, null, null), true);
+    }
+
+    @Test
+    public void testMatchAtLeastOneContentType() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(new String[] {"text/html",
+                "text/xml" }, null, null, null, null));
+    }
+
+    @Test
+    public void testMatchAnyContentType() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(
+                new String[] {"text/html", "*" }, null, null, null, null));
+    }
+
+    @Test
+    public void testMatchExtensionMismatch() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(null, null, new String[] {
+            "html", "txt" }, null, null), true);
+    }
+
+    @Test
+    public void testMatchAtLeastOneExtension() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(null, null, new String[] {
+                "html", "xml" }, null, null));
+    }
+
+    @Test
+    public void testMatchResourceTypeMismatch() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(null, null, null, new String[] {
+            "a/b/c" }, null), true);
+    }
+
+    @Test
+    public void testMatchAtLeastOneResourceType() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(null, null, null, new String[] {
+                "a/b/c", MockSlingHttpServletRequest.RESOURCE_TYPE }, null));
+    }
+
+    @Test
+    public void testMatchPathMismatch() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(null, new String[] {"/apps",
+            "/var" }, null, null, null), true);
+    }
+
+    @Test
+    public void testMatchAtLeastOnePath() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(null, new String[] {"/libs",
+                "/content" }, null, null, null));
+    }
+
+    @Test
+    public void testMatchAnyPath() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(null, new String[] {"/libs",
+                "*" }, null, null, null));
+    }
+
+    @Test
+    public void testMatchSelectorRequired() {
+        this.doTestAgainstProcessingContextWithoutSelector(new 
ProcessorConfigurationImpl(null, null, null, null,
+                new String[] {"sel" }), true);
+    }
+
+    @Test
+    public void testMatchSelectorMismatch() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(null, null, null, null,
+            new String[] {"sel3" }), true);
+    }
+
+    @Test
+    public void testMatchAtLeastOneSelector() {
+        this.doTestAgainstProcessingContextWithSelector(new 
ProcessorConfigurationImpl(null, null, null, null,
+            new String[] {"sel1" }));
+    }
+
+    private void 
doTestAgainstProcessingContextWithSelector(ProcessorConfiguration 
configuration) {
+        this.doTestAgainstProcessingContextWithSelector(configuration, false);
+    }
+
+    private void 
doTestAgainstProcessingContextWithSelector(ProcessorConfiguration 
configuration, boolean negate) {
+        // setup processing context
+        ProcessingContext context = 
createProcessingContext(this.mockRequestWithSelector);
+        // test the given configuration
+        doTest(configuration, context, negate);
+    }
+
+    private void 
doTestAgainstProcessingContextWithoutSelector(ProcessorConfiguration 
configuration, boolean negate) {
+        // setup processing context
+        ProcessingContext context = 
createProcessingContext(this.mockRequestWithoutSelector);
+        // test the given configuration
+        doTest(configuration, context, negate);
+    }
+
+    private void doTest(ProcessorConfiguration configuration, 
ProcessingContext context, boolean negate) {
+        if (!negate) {
+            assertTrue(configuration.match(context));
+        } else {
+            assertFalse(configuration.match(context));
+        }
+    }
+
+    private ProcessingContext createProcessingContext(SlingHttpServletRequest 
request) {
+        final ProcessingContext context = mock(ProcessingContext.class);
+        when(context.getContentType()).thenReturn("text/xml");
+        when(context.getRequest()).thenReturn(request);
+
+        return context;
+    }
+}

Propchange: 
sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImplTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImplTest.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Wed Oct  1 08:23:59 2014
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: 
sling/trunk/contrib/extensions/rewriter/src/test/java/org/apache/sling/rewriter/impl/ProcessorConfigurationImplTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to