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 2016/11/04 15:46:52 UTC

svn commit: r1768056 - in /sling/trunk/contrib/extensions/contextaware-config/impl: pom.xml src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java

Author: cziegeler
Date: Fri Nov  4 15:46:52 2016
New Revision: 1768056

URL: http://svn.apache.org/viewvc?rev=1768056&view=rev
Log:
SLING-6244 : Provide an SPI for influencing the collection inheritance

Modified:
    sling/trunk/contrib/extensions/contextaware-config/impl/pom.xml
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/pom.xml?rev=1768056&r1=1768055&r2=1768056&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/pom.xml (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/pom.xml Fri Nov  4 15:46:52 2016
@@ -85,7 +85,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.caconfig.spi</artifactId>
-            <version>1.0.0</version>
+            <version>1.0.1-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java?rev=1768056&r1=1768055&r2=1768056&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java Fri Nov  4 15:46:52 2016
@@ -25,11 +25,13 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
+import java.util.Set;
 
 import org.apache.commons.collections.iterators.ArrayIterator;
 import org.apache.commons.collections.iterators.IteratorChain;
@@ -42,12 +44,17 @@ import org.apache.sling.api.wrappers.Val
 import org.apache.sling.caconfig.resource.impl.ContextPathStrategyMultiplexer;
 import org.apache.sling.caconfig.resource.impl.util.PathEliminateDuplicatesIterator;
 import org.apache.sling.caconfig.resource.impl.util.PathParentExpandIterator;
+import org.apache.sling.caconfig.resource.spi.CollectionInheritanceDecider;
 import org.apache.sling.caconfig.resource.spi.ConfigurationResourceResolvingStrategy;
 import org.apache.sling.caconfig.resource.spi.ContextResource;
+import org.apache.sling.caconfig.resource.spi.InheritanceDecision;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
 import org.osgi.service.metatype.annotations.AttributeDefinition;
 import org.osgi.service.metatype.annotations.Designate;
 import org.osgi.service.metatype.annotations.ObjectClassDefinition;
@@ -92,6 +99,11 @@ public class DefaultConfigurationResourc
     @Reference
     private ContextPathStrategyMultiplexer contextPathStrategy;
 
+    @Reference(cardinality=ReferenceCardinality.OPTIONAL,
+               policy=ReferencePolicy.DYNAMIC,
+               policyOption=ReferencePolicyOption.GREEDY)
+    private volatile CollectionInheritanceDecider collectionInheritanceDecider;
+
     Config getConfiguration() {
         return this.config;
     }
@@ -320,6 +332,23 @@ public class DefaultConfigurationResourc
         }
     }
 
+    private boolean include(final CollectionInheritanceDecider decider,
+            final String bucketName,
+            final Resource resource,
+            final Set<String> blockedItems) {
+        boolean result = !blockedItems.contains(resource.getName());
+        if ( result && decider != null ) {
+            final InheritanceDecision decision = decider.decide(bucketName, resource);
+            if ( decision == InheritanceDecision.EXCLUDE ) {
+                result = false;
+            } else if ( decision == InheritanceDecision.BLOCK ) {
+                result = false;
+                blockedItems.add(resource.getName());
+            }
+        }
+        return result;
+    }
+
     @Override
     public Collection<Resource> getResourceCollection(final Resource contentResource, final String bucketName, final String configName) {
         if (!isEnabledAndParamsValid(contentResource, bucketName, configName)) {
@@ -333,6 +362,9 @@ public class DefaultConfigurationResourc
         final Map<String,Resource> result = new LinkedHashMap<>();
         final Map<String,Map<String,Object>> configValueMaps = new HashMap<>();
 
+        final CollectionInheritanceDecider decider = this.collectionInheritanceDecider;
+        final Set<String> blockedItems = new HashSet<>();
+
         int idx = 1;
         Iterator<String> paths = getResolvePaths(contentResource, bucketName);
         boolean inheritCollection = false;
@@ -349,7 +381,7 @@ public class DefaultConfigurationResourc
                 }
 
                 for (Resource child : item.getChildren()) {
-                    if (isValidResourceCollectionItem(child)) {
+                    if (isValidResourceCollectionItem(child) && include(decider, bucketName, child, blockedItems)) {
                         if ((!inherit || inheritCollection) && !result.containsKey(child.getName())) {
                             result.put(child.getName(), child);
                             configValueMaps.put(child.getName(), child.getValueMap());