Author: sseifert
Date: Fri Oct  7 07:57:53 2016
New Revision: 1763689

URL: http://svn.apache.org/viewvc?rev=1763689&view=rev
Log:
SLING-6059 Context-Aware Config: Make resource inheritance for configuration 
collections configurable

Modified:
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/ConfigurationResourceNameConstants.java
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImplTest.java
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolvingStrategyMultiplexerTest.java
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyTest.java

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/ConfigurationResourceNameConstants.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/ConfigurationResourceNameConstants.java?rev=1763689&r1=1763688&r2=1763689&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/ConfigurationResourceNameConstants.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/ConfigurationResourceNameConstants.java
 Fri Oct  7 07:57:53 2016
@@ -30,4 +30,10 @@ public final class ConfigurationResource
      */
     public static final String PROPERTY_CONFIG_REF = "sling:config-ref";
    
+    /**
+     * Boolean property that controls whether config resource collections 
should be merged on inheritance or not.
+     * Merging means merging the lists, not the list items (properties of the 
resources) itself.
+     */
+    public static final String PROPERTY_CONFIG_INHERIT = 
"sling:config-inherit";
+
 }

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java?rev=1763689&r1=1763688&r2=1763689&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java
 Fri Oct  7 07:57:53 2016
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.contextaware.config.resource.impl.def;
 
+import static 
org.apache.sling.contextaware.config.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_INHERIT;
 import static 
org.apache.sling.contextaware.config.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_REF;
 
 import java.util.ArrayList;
@@ -34,6 +35,7 @@ import org.apache.commons.collections.it
 import org.apache.commons.collections.iterators.FilterIterator;
 import org.apache.commons.collections.iterators.IteratorChain;
 import org.apache.commons.collections.iterators.TransformIterator;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
 import 
org.apache.sling.contextaware.config.resource.impl.ContextPathStrategyMultiplexer;
@@ -230,24 +232,59 @@ public class DefaultConfigurationResourc
 
         final Set<String> names = new HashSet<>();
         final List<Resource> result = new ArrayList<>();
+        final Set<String> nameCandidates = new HashSet<>();
+        final List<Resource> resultCandidates = new ArrayList<>();
+        
         int idx = 1;
         Iterator<String> paths = getResolvePaths(contentResource);
+        Boolean listMergingEnabled = null;
         while (paths.hasNext()) {
             final String path = paths.next();
             Resource item = 
contentResource.getResourceResolver().getResource(buildResourcePath(path, 
name));
             if (item != null) {
+                
+                // check inheritance mode on current level
+                listMergingEnabled = 
item.getValueMap().get(PROPERTY_CONFIG_INHERIT, listMergingEnabled);
+                
+                // in inheritance is enabled on this level and candidates 
where collected on previous levels add them now
+                if (listMergingEnabled == Boolean.TRUE && 
!resultCandidates.isEmpty()) {
+                    result.addAll(resultCandidates);
+                    names.addAll(nameCandidates);
+                    resultCandidates.clear();
+                    nameCandidates.clear();
+                }
+                
                 if (logger.isTraceEnabled()) {
                     logger.trace("+ resolved config item at [{}]: {}", idx, 
item.getPath());
                 }
 
-                for (Resource child : item.getChildren()) {
-                    if ( !child.getName().contains(":") && 
!names.contains(child.getName()) ) {
-                        result.add(child);
-                        names.add(child.getName());
+                // add resource items only if none found yet, or inheritance 
is enabled
+                if (result.isEmpty() || listMergingEnabled == Boolean.TRUE) {
+                    for (Resource child : item.getChildren()) {
+                        if (!names.contains(child.getName())) {
+                            result.add(child);
+                            names.add(child.getName());
+                        }
+                    }
+                }
+                // if resources are skipped due to inheritance restrictions 
collect them in candidate list
+                // they may be added later if inheritance is enabled on a 
parent level
+                else {
+                    for (Resource child : item.getChildren()) {
+                        if (isValidResourceCollectionItem(child)
+                                && !names.contains(child.getName()) && 
!nameCandidates.contains(child.getName())) {
+                            resultCandidates.add(child);
+                            nameCandidates.add(child.getName());
+                        }
                     }
                 }
 
-            } else {
+                // do not go further upwards in level is inheritance is broken 
here
+                if (listMergingEnabled == Boolean.FALSE) {
+                    break;
+                }
+            }
+            else {
                 if (logger.isTraceEnabled()) {
                     logger.trace("- no item '{}' under config '{}'", name, 
path);
                 }
@@ -261,6 +298,11 @@ public class DefaultConfigurationResourc
 
         return result;
     }
+    
+    private boolean isValidResourceCollectionItem(Resource resource) {
+        // do not include jcr:content nodes in resource collection list
+        return !StringUtils.equals(resource.getName(), "jcr:content");
+    }
 
     @Override
     public String getResourcePath(Resource contentResource, String bucketName, 
String configName) {

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImplTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImplTest.java?rev=1763689&r1=1763688&r2=1763689&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImplTest.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolverImplTest.java
 Fri Oct  7 07:57:53 2016
@@ -18,6 +18,8 @@
  */
 package org.apache.sling.contextaware.config.resource.impl;
 
+import static 
org.apache.sling.contextaware.config.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_INHERIT;
+import static 
org.apache.sling.contextaware.config.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_REF;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -49,8 +51,8 @@ public class ConfigurationResourceResolv
 
         // content resources
         context.build()
-            .resource("/content/site1", "sling:config-ref", "/conf/site1")
-            .resource("/content/site2", "sling:config-ref", "/conf/site2");
+            .resource("/content/site1", PROPERTY_CONFIG_REF, "/conf/site1")
+            .resource("/content/site2", PROPERTY_CONFIG_REF, "/conf/site2");
         site1Page1 = context.create().resource("/content/site1/page1");
         site2Page1 = context.create().resource("/content/site2/page1");
         
@@ -62,6 +64,7 @@ public class ConfigurationResourceResolv
             .resource("/conf/site2/sling:test/feature/d")
             .resource("/apps/conf/sling:test/feature/a")
             .resource("/libs/conf/sling:test/test")
+            .resource("/libs/conf/sling:test/feature", 
PROPERTY_CONFIG_INHERIT, true)
             .resource("/libs/conf/sling:test/feature/b");
     }
 

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolvingStrategyMultiplexerTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolvingStrategyMultiplexerTest.java?rev=1763689&r1=1763688&r2=1763689&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolvingStrategyMultiplexerTest.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/ConfigurationResourceResolvingStrategyMultiplexerTest.java
 Fri Oct  7 07:57:53 2016
@@ -18,6 +18,8 @@
  */
 package org.apache.sling.contextaware.config.resource.impl;
 
+import static 
org.apache.sling.contextaware.config.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_INHERIT;
+import static 
org.apache.sling.contextaware.config.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_REF;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
@@ -57,8 +59,8 @@ public class ConfigurationResourceResolv
 
         // content resources
         context.build()
-            .resource("/content/site1", "sling:config-ref", "/conf/site1")
-            .resource("/content/site2", "sling:config-ref", "/conf/site2");
+            .resource("/content/site1", PROPERTY_CONFIG_REF, "/conf/site1")
+            .resource("/content/site2", PROPERTY_CONFIG_REF, "/conf/site2");
         site1Page1 = context.create().resource("/content/site1/page1");
         
         // configuration
@@ -69,6 +71,7 @@ public class ConfigurationResourceResolv
             .resource("/conf/site2/sling:test/feature/d")
             .resource("/apps/conf/sling:test/feature/a")
             .resource("/libs/conf/sling:test/test")
+            .resource("/libs/conf/sling:test/feature", 
PROPERTY_CONFIG_INHERIT, true)
             .resource("/libs/conf/sling:test/feature/b");
     }
     
@@ -150,6 +153,5 @@ public class ConfigurationResourceResolv
         assertEquals("/conf/site1/sling:test/test", 
underTest.getResourcePath(site1Page1, BUCKET, "test"));
         assertEquals("/conf/site1/sling:test/feature", 
underTest.getResourceCollectionParentPath(site1Page1, BUCKET, "feature"));
     }
-    
-    
+
 }

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java?rev=1763689&r1=1763688&r2=1763689&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java
 Fri Oct  7 07:57:53 2016
@@ -18,6 +18,8 @@
  */
 package org.apache.sling.contextaware.config.resource.impl.def;
 
+import static 
org.apache.sling.contextaware.config.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_INHERIT;
+import static 
org.apache.sling.contextaware.config.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_REF;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
@@ -54,36 +56,30 @@ public class DefaultConfigurationResourc
 
         // content resources that form a deeper hierarchy
         context.build()
-            .resource("/content/tenant1", "sling:config-ref", "/conf/tenant1")
-            .resource("/content/tenant1/region1", "sling:config-ref", 
"/conf/tenant1/region1")
-            .resource("/content/tenant1/region1/site1", "sling:config-ref", 
"/conf/tenant1/region1/site1")
-            .resource("/content/tenant1/region1/site2", "sling:config-ref", 
"/conf/tenant1/region1/site2");
+            .resource("/content/tenant1", PROPERTY_CONFIG_REF, "/conf/tenant1")
+            .resource("/content/tenant1/region1", PROPERTY_CONFIG_REF, 
"/conf/tenant1/region1")
+            .resource("/content/tenant1/region1/site1", PROPERTY_CONFIG_REF, 
"/conf/tenant1/region1/site1")
+            .resource("/content/tenant1/region1/site2", PROPERTY_CONFIG_REF, 
"/conf/tenant1/region1/site2");
         site1Page1 = 
context.create().resource("/content/tenant1/region1/site1/page1");
         site2Page1 = 
context.create().resource("/content/tenant1/region1/site2/page1");
 
-        // configuration
+    }
+
+    @Test
+    public void testGetResource() {
+        // build config resources
         context.build()
             .resource("/conf/tenant1/region1/site1/sling:test/cfgSite1")
-            .resource("/conf/tenant1/region1/site1/sling:test/cfgCol/site1")
             .resource("/conf/tenant1/region1/sling:test/cfgRegion1")
-            .resource("/conf/tenant1/region1/sling:test/cfgCol/region1")
             .resource("/conf/tenant1/sling:test/cfgTenant1")
-            .resource("/conf/tenant1/sling:test/cfgCol/tenant1")
             .resource("/conf/tenant1/sling:test/test")
             .resource("/conf/global/sling:test/cfgGlobal")
-            .resource("/conf/global/sling:test/cfgCol/confGlobal")
             .resource("/conf/global/sling:test/test")
             .resource("/apps/conf/sling:test/cfgAppsGlobal")
-            .resource("/apps/conf/sling:test/cfgCol/appsGlobal")
             .resource("/apps/conf/sling:test/test")
             .resource("/libs/conf/sling:test/cfgLibsGlobal")
-            .resource("/libs/conf/sling:test/cfgCol/libsGlobal1")
-            .resource("/libs/conf/sling:test/cfgCol/libsGlobal2")
             .resource("/libs/conf/sling:test/test");
-    }
 
-    @Test
-    public void testGetResource() {
         assertEquals("/conf/tenant1/region1/site1/sling:test/cfgSite1", 
underTest.getResource(site1Page1, BUCKET, "cfgSite1").getPath());
         assertEquals("/conf/tenant1/region1/sling:test/cfgRegion1", 
underTest.getResource(site1Page1, BUCKET, "cfgRegion1").getPath());
         assertEquals("/conf/tenant1/sling:test/cfgTenant1", 
underTest.getResource(site1Page1, BUCKET, "cfgTenant1").getPath());
@@ -102,7 +98,18 @@ public class DefaultConfigurationResourc
     }
 
     @Test
-    public void testGetResourceCollection() {
+    public void testGetResourceCollectionWithInheritance() {
+        // build config resources
+        context.build()
+            .resource("/conf/tenant1/region1/site1/sling:test/cfgCol/site1")
+            .resource("/conf/tenant1/region1/sling:test/cfgCol/region1")
+            .resource("/conf/tenant1/sling:test/cfgCol/tenant1")
+            .resource("/conf/global/sling:test/cfgCol/confGlobal")
+            .resource("/apps/conf/sling:test/cfgCol/appsGlobal")
+            .resource("/libs/conf/sling:test/cfgCol", PROPERTY_CONFIG_INHERIT, 
true)
+            .resource("/libs/conf/sling:test/cfgCol/libsGlobal1")
+            .resource("/libs/conf/sling:test/cfgCol/libsGlobal2");
+
         assertThat(underTest.getResourceCollection(site1Page1, BUCKET, 
"cfgCol"), ResourceCollectionMatchers.paths(
                 "/conf/tenant1/region1/site1/sling:test/cfgCol/site1",
                 "/conf/tenant1/region1/sling:test/cfgCol/region1", 

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyTest.java?rev=1763689&r1=1763688&r2=1763689&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyTest.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyTest.java
 Fri Oct  7 07:57:53 2016
@@ -18,6 +18,8 @@
  */
 package org.apache.sling.contextaware.config.resource.impl.def;
 
+import static 
org.apache.sling.contextaware.config.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_INHERIT;
+import static 
org.apache.sling.contextaware.config.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_REF;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
@@ -49,34 +51,117 @@ public class DefaultConfigurationResourc
 
         // content resources
         context.build()
-            .resource("/content/site1", "sling:config-ref", "/conf/site1")
-            .resource("/content/site2", "sling:config-ref", "/conf/site2");
+            .resource("/content/site1", PROPERTY_CONFIG_REF, "/conf/site1")
+            .resource("/content/site2", PROPERTY_CONFIG_REF, "/conf/site2");
         site1Page1 = context.create().resource("/content/site1/page1");
         site2Page1 = context.create().resource("/content/site2/page1");
         
-        // configuration
+    }
+
+    @Test
+    public void testGetResource() {
+        ConfigurationResourceResolvingStrategy underTest = 
context.registerInjectActivateService(new 
DefaultConfigurationResourceResolvingStrategy());
+
+        // build config resources
         context.build()
             .resource("/conf/site1/sling:test/test")
+            .resource("/libs/conf/sling:test/test");
+
+        assertEquals("/conf/site1/sling:test/test", 
underTest.getResource(site1Page1, BUCKET, "test").getPath());
+        assertEquals("/libs/conf/sling:test/test", 
underTest.getResource(site2Page1, BUCKET, "test").getPath());
+    }
+
+    /**
+     * Default resource inheritance without customizing inheritance.
+     * => no resource list merging.
+     */
+    @Test
+    public void testGetResourceCollection_NoInheritProps() {
+        ConfigurationResourceResolvingStrategy underTest = 
context.registerInjectActivateService(new 
DefaultConfigurationResourceResolvingStrategy());
+
+        // build config resources
+        context.build()
             .resource("/conf/site1/sling:test/feature/c")
             .resource("/conf/site2/sling:test/feature/c")
             .resource("/conf/site2/sling:test/feature/d")
             .resource("/apps/conf/sling:test/feature/a")
-            .resource("/libs/conf/sling:test/test")
             .resource("/libs/conf/sling:test/feature/b");
+
+        assertThat(underTest.getResourceCollection(site1Page1, BUCKET, 
"feature"), ResourceCollectionMatchers.paths(
+                "/conf/site1/sling:test/feature/c"));
+
+        assertThat(underTest.getResourceCollection(site2Page1, BUCKET, 
"feature"), ResourceCollectionMatchers.paths( 
+                "/conf/site2/sling:test/feature/c",
+                "/conf/site2/sling:test/feature/d"));
     }
 
+    /**
+     * Default resource inheritance without customizing inheritance, but with 
now resources inner-most context.
+     * => inherit from next context level.
+     */
     @Test
-    public void testGetResource() {
+    public void testGetResourceCollection_NoInheritProps_InheritParent() {
         ConfigurationResourceResolvingStrategy underTest = 
context.registerInjectActivateService(new 
DefaultConfigurationResourceResolvingStrategy());
 
-        assertEquals("/conf/site1/sling:test/test", 
underTest.getResource(site1Page1, BUCKET, "test").getPath());
-        assertEquals("/libs/conf/sling:test/test", 
underTest.getResource(site2Page1, BUCKET, "test").getPath());
+        // build config resources
+        context.build()
+            .resource("/apps/conf/sling:test/feature/a")
+            .resource("/libs/conf/sling:test/feature/b");
+
+        assertThat(underTest.getResourceCollection(site1Page1, BUCKET, 
"feature"), ResourceCollectionMatchers.paths(
+                "/apps/conf/sling:test/feature/a"));
+
+        assertThat(underTest.getResourceCollection(site2Page1, BUCKET, 
"feature"), ResourceCollectionMatchers.paths( 
+                "/apps/conf/sling:test/feature/a"));
+    }
+
+    /**
+     * Resource inheritance with enabling list merging on inner-most context 
level.
+     * => merge resource lists from all levels
+     */
+    @Test
+    public void testGetResourceCollection_PropsChild() {
+        ConfigurationResourceResolvingStrategy underTest = 
context.registerInjectActivateService(new 
DefaultConfigurationResourceResolvingStrategy());
+
+        // build config resources
+        context.build()
+            .resource("/conf/site1/sling:test/feature", 
PROPERTY_CONFIG_INHERIT, true)
+            .resource("/conf/site1/sling:test/feature/c")
+            .resource("/conf/site2/sling:test/feature", 
PROPERTY_CONFIG_INHERIT, true)
+            .resource("/conf/site2/sling:test/feature/c")
+            .resource("/conf/site2/sling:test/feature/d")
+            .resource("/apps/conf/sling:test/feature/a")
+            .resource("/libs/conf/sling:test/feature/b");
+
+        assertThat(underTest.getResourceCollection(site1Page1, BUCKET, 
"feature"), ResourceCollectionMatchers.paths(
+                "/conf/site1/sling:test/feature/c",
+                "/apps/conf/sling:test/feature/a", 
+                "/libs/conf/sling:test/feature/b"));
+
+        assertThat(underTest.getResourceCollection(site2Page1, BUCKET, 
"feature"), ResourceCollectionMatchers.paths( 
+                "/conf/site2/sling:test/feature/c",
+                "/conf/site2/sling:test/feature/d",
+                "/apps/conf/sling:test/feature/a",
+                "/libs/conf/sling:test/feature/b"));
     }
 
+    /**
+     * Resource inheritance with enabling list merging on a parent context 
level.
+     * => merge resource lists from all levels
+     */
     @Test
-    public void testGetResourceCollection() {
+    public void testGetResourceCollection_PropsParent() {
         ConfigurationResourceResolvingStrategy underTest = 
context.registerInjectActivateService(new 
DefaultConfigurationResourceResolvingStrategy());
 
+        // build config resources
+        context.build()
+            .resource("/conf/site1/sling:test/feature/c")
+            .resource("/conf/site2/sling:test/feature/c")
+            .resource("/conf/site2/sling:test/feature/d")
+            .resource("/apps/conf/sling:test/feature/a")
+            .resource("/libs/conf/sling:test/feature", 
PROPERTY_CONFIG_INHERIT, true)
+            .resource("/libs/conf/sling:test/feature/b");
+
         assertThat(underTest.getResourceCollection(site1Page1, BUCKET, 
"feature"), ResourceCollectionMatchers.paths(
                 "/conf/site1/sling:test/feature/c",
                 "/apps/conf/sling:test/feature/a", 
@@ -89,6 +174,52 @@ public class DefaultConfigurationResourc
                 "/libs/conf/sling:test/feature/b"));
     }
 
+    /**
+     * Resource inheritance with enabling list merging on a parent context 
level, but disabling it on the inner-most level.
+     * => no resource list merging.
+     */
+    @Test
+    public void testGetResourceCollection_PropsParent_ChildCancel() {
+        ConfigurationResourceResolvingStrategy underTest = 
context.registerInjectActivateService(new 
DefaultConfigurationResourceResolvingStrategy());
+
+        // build config resources
+        context.build()
+            .resource("/conf/site1/sling:test/feature", 
PROPERTY_CONFIG_INHERIT, false)
+            .resource("/conf/site1/sling:test/feature/c")
+            .resource("/conf/site2/sling:test/feature/c")
+            .resource("/conf/site2/sling:test/feature/d")
+            .resource("/apps/conf/sling:test/feature/a")
+            .resource("/libs/conf/sling:test/feature", 
PROPERTY_CONFIG_INHERIT, true)
+            .resource("/libs/conf/sling:test/feature/b");
+
+        assertThat(underTest.getResourceCollection(site1Page1, BUCKET, 
"feature"), ResourceCollectionMatchers.paths(
+                "/conf/site1/sling:test/feature/c"));
+
+        assertThat(underTest.getResourceCollection(site2Page1, BUCKET, 
"feature"), ResourceCollectionMatchers.paths( 
+                "/conf/site2/sling:test/feature/c",
+                "/conf/site2/sling:test/feature/d",
+                "/apps/conf/sling:test/feature/a",
+                "/libs/conf/sling:test/feature/b"));
+    }
+
+    /**
+     * Ensure jcr:content nodes are not included in resource collection.
+     */
+    @Test
+    public void testGetResourceCollection_SkipJcrContent() {
+        ConfigurationResourceResolvingStrategy underTest = 
context.registerInjectActivateService(new 
DefaultConfigurationResourceResolvingStrategy());
+
+        // build config resources
+        context.build()
+            .resource("/conf/site1/sling:test/feature/a")
+            .resource("/conf/site1/sling:test/feature/b")
+            .resource("/conf/site2/sling:test/feature/jcr:content");
+
+        assertThat(underTest.getResourceCollection(site1Page1, BUCKET, 
"feature"), ResourceCollectionMatchers.paths(
+                "/conf/site1/sling:test/feature/a",
+                "/conf/site1/sling:test/feature/b"));
+    }
+
     @Test
     public void testGetResourcePath() throws Exception {
         ConfigurationResourceResolvingStrategy underTest = 
context.registerInjectActivateService(new 
DefaultConfigurationResourceResolvingStrategy());


Reply via email to