You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2016/12/07 18:03:17 UTC

svn commit: r1773130 [1/2] - in /sling/trunk/contrib/extensions/contextaware-config: impl/src/main/java/org/apache/sling/caconfig/impl/ impl/src/main/java/org/apache/sling/caconfig/management/impl/ impl/src/main/java/org/apache/sling/caconfig/resource/...

Author: sseifert
Date: Wed Dec  7 18:03:16 2016
New Revision: 1773130

URL: http://svn.apache.org/viewvc?rev=1773130&view=rev
Log:
SLING-6373 Context-Aware Config: Allow alternative configuration bucket names

Added:
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceResolverConfig.java   (with props)
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceMixedTest.java   (with props)
Modified:
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResolverImpl.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolverImpl.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolvingStrategyMultiplexer.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/ConfigNameUtil.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistenceTest.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationTestUtils.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceTest.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolvingStrategyMultiplexerTest.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategyTest.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/util/ConfigNameUtilTest.java
    sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/resource/spi/ConfigurationResourceResolvingStrategy.java

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java Wed Dec  7 18:03:16 2016
@@ -18,8 +18,6 @@
  */
 package org.apache.sling.caconfig.impl;
 
-import static org.apache.sling.caconfig.impl.ConfigurationNameConstants.CONFIGS_BUCKET_NAME;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -49,6 +47,7 @@ class ConfigurationBuilderImpl implement
     private final ConfigurationPersistenceStrategy configurationPersistenceStrategy;
     private final ConfigurationInheritanceStrategy configurationInheritanceStrategy;
     private final ConfigurationOverrideManager configurationOverrideManager;
+    private final Collection<String> configBucketNames;
 
     private String configName;
 
@@ -57,13 +56,15 @@ class ConfigurationBuilderImpl implement
             final ConfigurationResourceResolvingStrategy configurationResourceResolvingStrategy,
             final ConfigurationPersistenceStrategy configurationPersistenceStrategy,
             final ConfigurationInheritanceStrategy configurationInheritanceStrategy,
-            final ConfigurationOverrideManager configurationOverrideManager) {
+            final ConfigurationOverrideManager configurationOverrideManager,
+            final Collection<String> configBucketNames) {
         this.contentResource = resource;
         this.configurationResolver = configurationResolver;
         this.configurationResourceResolvingStrategy = configurationResourceResolvingStrategy;
         this.configurationPersistenceStrategy = configurationPersistenceStrategy;
         this.configurationInheritanceStrategy = configurationInheritanceStrategy;
         this.configurationOverrideManager = configurationOverrideManager;
+        this.configBucketNames = configBucketNames;
     }
 
     @Override
@@ -103,7 +104,7 @@ class ConfigurationBuilderImpl implement
         if (this.contentResource != null) {
             validateConfigurationName(name);
             resourceInheritanceChain = this.configurationResourceResolvingStrategy
-                    .getResourceInheritanceChain(this.contentResource, CONFIGS_BUCKET_NAME, name);
+                    .getResourceInheritanceChain(this.contentResource, configBucketNames, name);
         }
         return convert(resourceInheritanceChain, clazz, converter, name, false);
     }
@@ -119,11 +120,14 @@ class ConfigurationBuilderImpl implement
         if (this.contentResource != null) {
            validateConfigurationName(name);
            final Collection<T> result = new ArrayList<>();
-           for (final Iterator<Resource> resourceInheritanceChain : this.configurationResourceResolvingStrategy
-                   .getResourceCollectionInheritanceChain(this.contentResource, CONFIGS_BUCKET_NAME, name)) {
-               final T obj = convert(resourceInheritanceChain, clazz, converter, name, true);
-               if (obj != null) {
-                   result.add(obj);
+           Collection<Iterator<Resource>> resourceInheritanceChains = this.configurationResourceResolvingStrategy
+                   .getResourceCollectionInheritanceChain(this.contentResource, configBucketNames, name);;
+           if (resourceInheritanceChains != null) {
+               for (final Iterator<Resource> resourceInheritanceChain : resourceInheritanceChains) {
+                   final T obj = convert(resourceInheritanceChain, clazz, converter, name, true);
+                   if (obj != null) {
+                       result.add(obj);
+                   }
                }
            }
            return result;

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResolverImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResolverImpl.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResolverImpl.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResolverImpl.java Wed Dec  7 18:03:16 2016
@@ -18,17 +18,29 @@
  */
 package org.apache.sling.caconfig.impl;
 
+import static org.apache.sling.caconfig.impl.ConfigurationNameConstants.CONFIGS_BUCKET_NAME;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.caconfig.ConfigurationBuilder;
 import org.apache.sling.caconfig.ConfigurationResolver;
 import org.apache.sling.caconfig.impl.override.ConfigurationOverrideManager;
 import org.apache.sling.caconfig.management.impl.ConfigurationPersistenceStrategyMultiplexer;
 import org.apache.sling.caconfig.resource.impl.ConfigurationResourceResolvingStrategyMultiplexer;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-@Component(service=ConfigurationResolver.class, immediate=true)
-public class ConfigurationResolverImpl implements ConfigurationResolver {
+@Component(service={ ConfigurationResolver.class, ConfigurationResourceResolverConfig.class }, immediate=true)
+@Designate(ocd=ConfigurationResolverImpl.Config.class)
+public class ConfigurationResolverImpl implements ConfigurationResolver, ConfigurationResourceResolverConfig {
 
     @Reference
     private ConfigurationResourceResolvingStrategyMultiplexer configurationResourceResolvingStrategy;
@@ -39,11 +51,41 @@ public class ConfigurationResolverImpl i
     @Reference
     private ConfigurationOverrideManager configurationOverrideManager;
     
+    @ObjectClassDefinition(name="Apache Sling Context-Aware Configuration Resolver",
+            description="Getting context-aware configurations for a given resource context.")
+    static @interface Config {
+    
+        @AttributeDefinition(name = "Config bucket names",
+                description = "Additional bucket resource names to '" + CONFIGS_BUCKET_NAME + "' to store configuration resources. "
+                + "The names are used in the order defined, always starting with " + CONFIGS_BUCKET_NAME + ". "
+                + "Once a bucket resource with a matching name is found, that bucket is used and the following names are skipped. "
+                + "For writeback via ConfigurationManager always " + CONFIGS_BUCKET_NAME + " is used.")
+        String[] configBucketNames();
+    
+    }
+    
+    private Collection<String> configBucketNames;
+    
+    @Activate
+    private void activate(Config config) {
+        configBucketNames = new ArrayList<>();
+        configBucketNames.add(ConfigurationNameConstants.CONFIGS_BUCKET_NAME);
+        if (!ArrayUtils.isEmpty(config.configBucketNames())) {
+            configBucketNames.addAll(Arrays.asList(config.configBucketNames()));
+        }
+    }
+    
     @Override
     public ConfigurationBuilder get(Resource resource) {
         return new ConfigurationBuilderImpl(resource, this,
                 configurationResourceResolvingStrategy, configurationPersistenceStrategy,
-                configurationInheritanceStrategy, configurationOverrideManager);
+                configurationInheritanceStrategy, configurationOverrideManager,
+                configBucketNames);
+    }
+
+    @Override
+    public Collection<String> configBucketNames() {
+        return configBucketNames;
     }
 
 }

Added: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceResolverConfig.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceResolverConfig.java?rev=1773130&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceResolverConfig.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceResolverConfig.java Wed Dec  7 18:03:16 2016
@@ -0,0 +1,36 @@
+/*
+ * 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.caconfig.impl;
+
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Internal service for accessing the ConfigurationResourceResolver configuration from other services.
+ */
+public interface ConfigurationResourceResolverConfig {
+
+    /**
+     * All bucket names starting with sling:configs and the alternative ones.
+     * @return Bucket names
+     */
+    @Nonnull Collection<String> configBucketNames();
+    
+}

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceResolverConfig.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceResolverConfig.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Wed Dec  7 18:03:16 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceResolverConfig.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java Wed Dec  7 18:03:16 2016
@@ -34,6 +34,7 @@ import org.apache.commons.collections.it
 import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.caconfig.impl.ConfigurationInheritanceStrategyMultiplexer;
+import org.apache.sling.caconfig.impl.ConfigurationResourceResolverConfig;
 import org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.impl.override.ConfigurationOverrideManager;
 import org.apache.sling.caconfig.management.ConfigurationCollectionData;
@@ -62,6 +63,8 @@ public class ConfigurationManagerImpl im
     private ConfigurationInheritanceStrategyMultiplexer configurationInheritanceStrategy;
     @Reference
     private ConfigurationOverrideManager configurationOverrideManager;
+    @Reference
+    private ConfigurationResourceResolverConfig configurationResourceResolverConfig;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -69,21 +72,29 @@ public class ConfigurationManagerImpl im
         ConfigNameUtil.ensureValidConfigName(configName);
         ConfigurationMetadata configMetadata = getConfigurationMetadata(configName);
         Resource configResource = null;
+        
         Iterator<Resource> configResourceInheritanceChain = configurationResourceResolvingStrategy
-                .getResourceInheritanceChain(resource, CONFIGS_BUCKET_NAME, configName);
+                .getResourceInheritanceChain(resource, configurationResourceResolverConfig.configBucketNames(), configName);;
+        
         if (configResourceInheritanceChain != null) {
             ResettableIterator resettableConfigResourceInheritanceChain = new ListIteratorWrapper(configResourceInheritanceChain);
             configResource = applyPersistenceAndInheritance(resource.getPath(), configName, resettableConfigResourceInheritanceChain);
             if (configResource != null) {
                 // get writeback resource for "reverse inheritance detection"
                 Resource writebackConfigResource = null;
-                String writebackConfigResourcePath = configurationResourceResolvingStrategy.getResourcePath(resource, CONFIGS_BUCKET_NAME, configName);
-                if (writebackConfigResourcePath != null) {
-                    writebackConfigResource = configResource.getResourceResolver().getResource(writebackConfigResourcePath);
-                    if (writebackConfigResource != null) {
-                        writebackConfigResource = configurationPersistenceStrategy.getResource(writebackConfigResource);
+                
+                String writebackConfigResourcePath = null;
+                for (String configBucketName : configurationResourceResolverConfig.configBucketNames()) {
+                    writebackConfigResourcePath = configurationResourceResolvingStrategy.getResourcePath(resource, configBucketName, configName);
+                    if (writebackConfigResourcePath != null) {
+                        writebackConfigResource = resource.getResourceResolver().getResource(writebackConfigResourcePath);
+                        if (writebackConfigResource != null) {
+                            writebackConfigResource = configurationPersistenceStrategy.getResource(writebackConfigResource);
+                            break;
+                        }
                     }
                 }
+                
                 resettableConfigResourceInheritanceChain.reset();
                 return new ConfigurationDataImpl(configMetadata, configResource, writebackConfigResource,
                         applyPersistence(resettableConfigResourceInheritanceChain),
@@ -103,12 +114,13 @@ public class ConfigurationManagerImpl im
     public ConfigurationCollectionData getConfigurationCollection(Resource resource, String configName) {
         ConfigNameUtil.ensureValidConfigName(configName);
         ConfigurationMetadata configMetadata = getConfigurationMetadata(configName);
-        String writebackConfigResourceCollectionParentPath = configurationResourceResolvingStrategy.getResourceCollectionParentPath(resource, CONFIGS_BUCKET_NAME, configName);
         List<ConfigurationData> configData = new ArrayList<>();
 
         // get configuration resource items
         Collection<Iterator<Resource>> configResourceInheritanceChains = configurationResourceResolvingStrategy
-                .getResourceCollectionInheritanceChain(resource, CONFIGS_BUCKET_NAME, configName);
+                    .getResourceCollectionInheritanceChain(resource, configurationResourceResolverConfig.configBucketNames(), configName);   
+
+        String writebackConfigResourceCollectionParentPath = null;
         if (configResourceInheritanceChains != null) {
             for (Iterator<Resource> configResourceInheritanceChain : configResourceInheritanceChains) {
                 ResettableIterator resettableConfigResourceInheritanceChain = new ListIteratorWrapper(configResourceInheritanceChain);
@@ -118,13 +130,19 @@ public class ConfigurationManagerImpl im
                 if (configResource != null) {
                     // get writeback resource for "reverse inheritance detection"
                     Resource writebackConfigResource = null;
-                    if (writebackConfigResourceCollectionParentPath != null) {
-                        writebackConfigResource = configResource.getResourceResolver().getResource(
-                                writebackConfigResourceCollectionParentPath + "/" + untransformedConfigResource.getName());
-                        if (writebackConfigResource != null) {
-                            writebackConfigResource = configurationPersistenceStrategy.getResource(writebackConfigResource);
+                    
+                    for (String configBucketName : configurationResourceResolverConfig.configBucketNames()) {
+                        writebackConfigResourceCollectionParentPath = configurationResourceResolvingStrategy.getResourceCollectionParentPath(resource, configBucketName, configName);
+                        if (writebackConfigResourceCollectionParentPath != null) {
+                            writebackConfigResource = configResource.getResourceResolver().getResource(
+                                    writebackConfigResourceCollectionParentPath + "/" + untransformedConfigResource.getName());
+                            if (writebackConfigResource != null) {
+                                writebackConfigResource = configurationPersistenceStrategy.getResource(writebackConfigResource);
+                                break;
+                            }
                         }
                     }
+                    
                     resettableConfigResourceInheritanceChain.reset();
                     configData.add(new ConfigurationDataImpl(configMetadata, configResource, writebackConfigResource,
                             applyPersistence(resettableConfigResourceInheritanceChain),
@@ -218,12 +236,20 @@ public class ConfigurationManagerImpl im
     @Override
     public void deleteConfiguration(Resource resource, String configName) {
         ConfigNameUtil.ensureValidConfigName(configName);
-        String configResourcePath = configurationResourceResolvingStrategy.getResourcePath(resource, CONFIGS_BUCKET_NAME, configName);
-        if (configResourcePath == null) {
-            throw new ConfigurationPersistenceException("Unable to delete configuration: Configuration resolving strategy returned no path.");
+        
+        // try to delete from all config bucket names
+        boolean foundAnyPath = false;
+        for (String configBucketName : configurationResourceResolverConfig.configBucketNames()) {
+            String configResourcePath = configurationResourceResolvingStrategy.getResourcePath(resource, configBucketName, configName);
+            if (configResourcePath != null) {
+                foundAnyPath = true;
+                if (!configurationPersistenceStrategy.deleteConfiguration(resource.getResourceResolver(), configResourcePath)) {
+                    throw new ConfigurationPersistenceException("Unable to delete configuration: No persistence strategy found.");
+                }
+            }
         }
-        if (!configurationPersistenceStrategy.deleteConfiguration(resource.getResourceResolver(), configResourcePath)) {
-            throw new ConfigurationPersistenceException("Unable to delete configuration: No persistence strategy found.");
+        if (!foundAnyPath) {
+            throw new ConfigurationPersistenceException("Unable to delete configuration: Configuration resolving strategy returned no path.");
         }
     }
     

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolverImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolverImpl.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolverImpl.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolverImpl.java Wed Dec  7 18:03:16 2016
@@ -20,6 +20,7 @@ package org.apache.sling.caconfig.resour
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
@@ -42,13 +43,13 @@ public class ConfigurationResourceResolv
     @Override
     public Resource getResource(Resource resource, String bucketName, String configName) {
         ConfigNameUtil.ensureValidConfigName(configName);
-        return configurationResourceResolvingStrategy.getResource(resource, bucketName, configName);
+        return configurationResourceResolvingStrategy.getResource(resource, Collections.singleton(bucketName), configName);
     }
 
     @Override
     public Collection<Resource> getResourceCollection(Resource resource, String bucketName, String configName) {
         ConfigNameUtil.ensureValidConfigName(configName);
-        return configurationResourceResolvingStrategy.getResourceCollection(resource, bucketName, configName);
+        return configurationResourceResolvingStrategy.getResourceCollection(resource, Collections.singleton(bucketName), configName);
     }
 
     @Override

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolvingStrategyMultiplexer.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolvingStrategyMultiplexer.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolvingStrategyMultiplexer.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolvingStrategyMultiplexer.java Wed Dec  7 18:03:16 2016
@@ -59,9 +59,9 @@ public class ConfigurationResourceResolv
      * Gets the configuration resource from the first implementation that has an answer.
      */
     @Override
-    public Resource getResource(Resource resource, String bucketName, String configName) {
+    public Resource getResource(Resource resource, Collection<String> bucketNames, String configName) {
         for (ConfigurationResourceResolvingStrategy item : items) {
-            Resource result = item.getResource(resource, bucketName, configName);
+            Resource result = item.getResource(resource, bucketNames, configName);
             if (result != null) {
                 return result;
             }
@@ -73,9 +73,9 @@ public class ConfigurationResourceResolv
      * Gets the configuration resource collection from the first implementation that has an answer.
      */
     @Override
-    public Collection<Resource> getResourceCollection(Resource resource, String bucketName, String configName) {
+    public Collection<Resource> getResourceCollection(Resource resource, Collection<String> bucketNames, String configName) {
         for (ConfigurationResourceResolvingStrategy item : items) {
-            Collection<Resource> result = item.getResourceCollection(resource, bucketName, configName);
+            Collection<Resource> result = item.getResourceCollection(resource, bucketNames, configName);
             if (result != null) {
                 return result;
             }
@@ -87,9 +87,9 @@ public class ConfigurationResourceResolv
      * Gets the configuration resource inheritance chain from the first implementation that has an answer.
      */
     @Override
-    public Iterator<Resource> getResourceInheritanceChain(Resource resource, String bucketName, String configName) {
+    public Iterator<Resource> getResourceInheritanceChain(Resource resource, Collection<String> bucketNames, String configName) {
         for (ConfigurationResourceResolvingStrategy item : items) {
-            Iterator<Resource> result = item.getResourceInheritanceChain(resource, bucketName, configName);
+            Iterator<Resource> result = item.getResourceInheritanceChain(resource, bucketNames, configName);
             if (result != null) {
                 return result;
             }
@@ -101,10 +101,10 @@ public class ConfigurationResourceResolv
      * Gets the configuration resource collection inheritance chains from the first implementation that has an answer.
      */
     @Override
-    public Collection<Iterator<Resource>> getResourceCollectionInheritanceChain(Resource resource, String bucketName,
+    public Collection<Iterator<Resource>> getResourceCollectionInheritanceChain(Resource resource, Collection<String> bucketNames,
             String configName) {
         for (ConfigurationResourceResolvingStrategy item : items) {
-            Collection<Iterator<Resource>> result = item.getResourceCollectionInheritanceChain(resource, bucketName, configName);
+            Collection<Iterator<Resource>> result = item.getResourceCollectionInheritanceChain(resource, bucketNames, configName);
             if (result != null) {
                 return result;
             }

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=1773130&r1=1773129&r2=1773130&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 Wed Dec  7 18:03:16 2016
@@ -22,6 +22,7 @@ import static org.apache.sling.caconfig.
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -114,10 +115,10 @@ public class DefaultConfigurationResourc
     }
 
     @SuppressWarnings("unchecked")
-    Iterator<String> getResolvePaths(final Resource contentResource, final String bucketName) {
+    Iterator<String> getResolvePaths(final Resource contentResource, final Collection<String> bucketNames) {
         return new IteratorChain(
             // add all config references found in resource hierarchy
-            findConfigRefs(contentResource, bucketName),
+            findConfigRefs(contentResource, bucketNames),
             // finally add the global fallbacks
             new ArrayIterator(this.config.fallbackPaths())
         );
@@ -129,8 +130,7 @@ public class DefaultConfigurationResourc
      * @param startResource Resource to start searching
      */
     @SuppressWarnings("unchecked")
-    private Iterator<String> findConfigRefs(final Resource startResource, final String bucketName) {
-        final String notAllowedPostfix = "/" + bucketName;
+    private Iterator<String> findConfigRefs(final Resource startResource, final Collection<String> bucketNames) {
 
         // collect all context path resources (but filter out those without config reference)
         final Iterator<ContextResource> contextResources = new FilterIterator(contextPathStrategy.findContextResources(startResource),
@@ -156,7 +156,7 @@ public class DefaultConfigurationResourc
                 while ( val == null && (useFromRelativePathsWith != null || contextResources.hasNext()) ) {
                     if ( useFromRelativePathsWith != null ) {
                         final ContextResource contextResource = relativePaths.remove(relativePaths.size() - 1);
-                        val = checkPath(contextResource, useFromRelativePathsWith + "/" + contextResource.getConfigRef(), notAllowedPostfix);
+                        val = checkPath(contextResource, useFromRelativePathsWith + "/" + contextResource.getConfigRef(), bucketNames);
 
                         if ( relativePaths.isEmpty() ) {
                             useFromRelativePathsWith = null;
@@ -167,7 +167,7 @@ public class DefaultConfigurationResourc
 
                         // if absolute path found we are (probably) done
                         if (val != null && val.startsWith("/")) {
-                            val = checkPath(contextResource, val, notAllowedPostfix);
+                            val = checkPath(contextResource, val, bucketNames);
                         }
 
                         if (val != null) {
@@ -215,15 +215,19 @@ public class DefaultConfigurationResourc
         return new PathEliminateDuplicatesIterator(new PathParentExpandIterator(config.configPath(), configPaths));
     }
 
-    private String checkPath(final ContextResource contextResource, String ref, final String notAllowedPostfix) {
+    private String checkPath(final ContextResource contextResource, String ref, final Collection<String> bucketNames) {
         // combine full path if relativeRef is present
         ref = ResourceUtil.normalize(ref);
 
-        if (ref != null && ref.endsWith(notAllowedPostfix) ) {
-            logger.warn("Ignoring reference to {} from {} - Probably misconfigured as it ends with '{}'",
-                    contextResource.getConfigRef(), contextResource.getResource().getPath(), notAllowedPostfix);
-            ref = null;
+        for (String bucketName : bucketNames) {
+            String notAllowedPostfix = "/" + bucketName;
+            if (ref != null && ref.endsWith(notAllowedPostfix)) {
+                logger.warn("Ignoring reference to {} from {} - Probably misconfigured as it ends with '{}'",
+                        contextResource.getConfigRef(), contextResource.getResource().getPath(), notAllowedPostfix);
+                ref = null;
+            }
         }
+        
         if (ref != null && !isAllowedConfigPath(ref)) {
             logger.warn("Ignoring reference to {} from {} - not in allowed paths.",
                     contextResource.getConfigRef(), contextResource.getResource().getPath());
@@ -255,8 +259,8 @@ public class DefaultConfigurationResourc
         return false;
     }
 
-    private boolean isEnabledAndParamsValid(final Resource contentResource, final String bucketName, final String configName) {
-        return config.enabled() && contentResource != null && ConfigNameUtil.isValid(bucketName) && ConfigNameUtil.isValid(configName);
+    private boolean isEnabledAndParamsValid(final Resource contentResource, final Collection<String> bucketNames, final String configName) {
+        return config.enabled() && contentResource != null && ConfigNameUtil.isValid(bucketNames) && ConfigNameUtil.isValid(configName);
     }
 
     private String buildResourcePath(String path, String name) {
@@ -264,8 +268,8 @@ public class DefaultConfigurationResourc
     }
 
     @Override
-    public Resource getResource(final Resource contentResource, final String bucketName, final String configName) {
-        Iterator<Resource> resources = getResourceInheritanceChain(contentResource, bucketName, configName);
+    public Resource getResource(final Resource contentResource, final Collection<String> bucketNames, final String configName) {
+        Iterator<Resource> resources = getResourceInheritanceChain(contentResource, bucketNames, configName);
         if (resources != null && resources.hasNext()) {
             return resources.next();
         }
@@ -273,32 +277,40 @@ public class DefaultConfigurationResourc
     }
 
     @SuppressWarnings("unchecked")
-    private Iterator<Resource> getResourceInheritanceChainInternal(final String bucketName, final String configName,
+    private Iterator<Resource> getResourceInheritanceChainInternal(final Collection<String> bucketNames, final String configName,
             final Iterator<String> paths, final ResourceResolver resourceResolver) {
-        final String name = bucketName + "/" + configName;
 
         // find all matching items among all configured paths
         Iterator<Resource> matchingResources = IteratorUtils.transformedIterator(paths, new Transformer() {
             @Override
             public Object transform(Object input) {
                 String path = (String)input;
-                return resourceResolver.getResource(buildResourcePath(path, name));
+                for (String bucketName : bucketNames) {
+                    final String name = bucketName + "/" + configName;
+                    Resource resource = resourceResolver.getResource(buildResourcePath(path, name));
+                    if (resource != null) {
+                        return resource;
+                    }
+                }
+                return null;
             }
         });
-        return IteratorUtils.filteredIterator(matchingResources, PredicateUtils.notNullPredicate());
+        Iterator<Resource> result = IteratorUtils.filteredIterator(matchingResources, PredicateUtils.notNullPredicate());
+        if (result.hasNext()) {
+            return result;
+        }
+        return null;
     }
 
     @Override
-    public Iterator<Resource> getResourceInheritanceChain(Resource contentResource, String bucketName, String configName) {
-        if (!isEnabledAndParamsValid(contentResource, bucketName, configName)) {
+    public Iterator<Resource> getResourceInheritanceChain(Resource contentResource, Collection<String> bucketNames, String configName) {
+        if (!isEnabledAndParamsValid(contentResource, bucketNames, configName)) {
             return null;
         }
         final ResourceResolver resourceResolver = contentResource.getResourceResolver();
-        final String name = bucketName + "/" + configName;
-        logger.debug("Searching {} for resource {}", name, contentResource.getPath());
 
-        Iterator<String> paths = getResolvePaths(contentResource, bucketName);
-        return getResourceInheritanceChainInternal(bucketName, configName, paths, resourceResolver);
+        Iterator<String> paths = getResolvePaths(contentResource, bucketNames);
+        return getResourceInheritanceChainInternal(bucketNames, configName, paths, resourceResolver);
     }
 
     private boolean include(final List<CollectionInheritanceDecider> deciders,
@@ -322,12 +334,8 @@ public class DefaultConfigurationResourc
         return result;
     }
 
-    private Collection<Resource> getResourceCollectionInternal(final String bucketName, final String configName,
+    private Collection<Resource> getResourceCollectionInternal(final Collection<String> bucketNames, final String configName,
             Iterator<String> paths, ResourceResolver resourceResolver) {
-        String name = bucketName + "/" + configName;
-        if (logger.isTraceEnabled()) {
-            logger.trace("- searching for list '{}'", name);
-        }
 
         final Map<String,Resource> result = new LinkedHashMap<>();
         final List<CollectionInheritanceDecider> deciders = this.collectionInheritanceDeciders;
@@ -337,9 +345,23 @@ public class DefaultConfigurationResourc
         boolean inherit = false;
         while (paths.hasNext()) {
             final String path = paths.next();
-            Resource item = resourceResolver.getResource(buildResourcePath(path, name));
-            if (item != null) {
+            
+            Resource item = null;
+            String bucketNameUsed = null;
+            for (String bucketName : bucketNames) {
+                String name = bucketName + "/" + configName;
+                if (logger.isTraceEnabled()) {
+                    logger.trace("- searching for list '{}'", name);
+                }
+                
+                item = resourceResolver.getResource(buildResourcePath(path, name));
+                if (item != null) {
+                    bucketNameUsed = bucketName;
+                    break;
+                }
+            }
 
+            if (item != null) {
                 if (logger.isTraceEnabled()) {
                     logger.trace("+ resolved config item at [{}]: {}", idx, item.getPath());
                 }
@@ -347,7 +369,7 @@ public class DefaultConfigurationResourc
                 for (Resource child : item.getChildren()) {
                     if (isValidResourceCollectionItem(child)
                             && !result.containsKey(child.getName())
-                            && include(deciders, bucketName, child, blockedItems)) {
+                            && include(deciders, bucketNameUsed, child, blockedItems)) {
                         result.put(child.getName(), child);
                    }
                 }
@@ -361,9 +383,10 @@ public class DefaultConfigurationResourc
             }
             else {
                 if (logger.isTraceEnabled()) {
-                    logger.trace("- no item '{}' under config '{}'", name, path);
+                    logger.trace("- no item '{}' under config '{}'", StringUtils.join(bucketNames, ","), path);
                 }
             }
+            
             idx++;
         }
 
@@ -375,26 +398,32 @@ public class DefaultConfigurationResourc
     }
 
     @Override
-    public Collection<Resource> getResourceCollection(final Resource contentResource, final String bucketName, final String configName) {
-        if (!isEnabledAndParamsValid(contentResource, bucketName, configName)) {
+    public Collection<Resource> getResourceCollection(final Resource contentResource, final Collection<String> bucketNames, final String configName) {
+        if (!isEnabledAndParamsValid(contentResource, bucketNames, configName)) {
+            return null;
+        }
+        Iterator<String> paths = getResolvePaths(contentResource, bucketNames);
+        Collection<Resource> result = getResourceCollectionInternal(bucketNames, configName, paths, contentResource.getResourceResolver());
+        if (!result.isEmpty()) {
+            return result;
+        }
+        else {
             return null;
         }
-        Iterator<String> paths = getResolvePaths(contentResource, bucketName);
-        return getResourceCollectionInternal(bucketName, configName, paths, contentResource.getResourceResolver());
     }
 
     @SuppressWarnings("unchecked")
     @Override
     public Collection<Iterator<Resource>> getResourceCollectionInheritanceChain(final Resource contentResource,
-            final String bucketName, final String configName) {
-        if (!isEnabledAndParamsValid(contentResource, bucketName, configName)) {
+            final Collection<String> bucketNames, final String configName) {
+        if (!isEnabledAndParamsValid(contentResource, bucketNames, configName)) {
             return null;
         }
         final ResourceResolver resourceResolver = contentResource.getResourceResolver();
-        final List<String> paths = IteratorUtils.toList(getResolvePaths(contentResource, bucketName));
+        final List<String> paths = IteratorUtils.toList(getResolvePaths(contentResource, bucketNames));
         
         // get resource collection with respect to collection inheritance
-        Collection<Resource> resourceCollection = getResourceCollectionInternal(bucketName, configName, paths.iterator(), resourceResolver);
+        Collection<Resource> resourceCollection = getResourceCollectionInternal(bucketNames, configName, paths.iterator(), resourceResolver);
         
         // get inheritance chain for each item found
         // yes, this resolves the closest item twice, but is the easiest solution to combine both logic aspects
@@ -402,10 +431,15 @@ public class DefaultConfigurationResourc
             @Override
             public Object transform(Object input) {
                 Resource item = (Resource)input;
-                return getResourceInheritanceChainInternal(bucketName, configName + "/" + item.getName(), paths.iterator(), resourceResolver);
+                return getResourceInheritanceChainInternal(bucketNames, configName + "/" + item.getName(), paths.iterator(), resourceResolver);
             }
         });
-        return IteratorUtils.toList(result);
+        if (result.hasNext()) {
+            return IteratorUtils.toList(result);
+        }
+        else {
+            return null;
+        }
     }
 
     private boolean isValidResourceCollectionItem(Resource resource) {
@@ -428,12 +462,12 @@ public class DefaultConfigurationResourc
 
     @Override
     public String getResourcePath(Resource contentResource, String bucketName, String configName) {
-        if (!isEnabledAndParamsValid(contentResource, bucketName, configName)) {
+        if (!isEnabledAndParamsValid(contentResource, Collections.singleton(bucketName), configName)) {
             return null;
         }
         String name = bucketName + "/" + configName;
 
-        Iterator<String> configPaths = this.findConfigRefs(contentResource, bucketName);
+        Iterator<String> configPaths = this.findConfigRefs(contentResource, Collections.singleton(bucketName));
         if (configPaths.hasNext()) {
             String configPath = buildResourcePath(configPaths.next(), name);
             logger.debug("Building configuration path {} for resource {}: {}", name, contentResource.getPath(), configPath);

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/ConfigNameUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/ConfigNameUtil.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/ConfigNameUtil.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/ConfigNameUtil.java Wed Dec  7 18:03:16 2016
@@ -18,6 +18,8 @@
  */
 package org.apache.sling.caconfig.resource.impl.util;
 
+import java.util.Collection;
+
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -42,6 +44,23 @@ public final class ConfigNameUtil {
     }
     
     /**
+     * Check if the config name is valid.
+     * @param configNames The names
+     * @return {@code true} if it is valid
+     */
+    public static boolean isValid(final Collection<String> configNames) {
+        if (configNames == null) {
+            return false;
+        }
+        for (String configName : configNames) {
+            if (!isValid(configName)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    /**
      * Ensure that the config name is valid.
      * @param configName The name
      * @throws IllegalArgumentException if the config name is not valid

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistenceTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistenceTest.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistenceTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistenceTest.java Wed Dec  7 18:03:16 2016
@@ -56,7 +56,9 @@ public class ConfigurationResolverCustom
 
     @Before
     public void setUp() {
-        underTest = ConfigurationTestUtils.registerConfigurationResolver(context);
+        // custom config with defines alternative bucket name "settings"
+        underTest = ConfigurationTestUtils.registerConfigurationResolver(context,
+                "configBucketNames", "settings");
 
         // custom strategy which redirects all config resources to a jcr:content subnode
         context.registerService(ConfigurationPersistenceStrategy.class,
@@ -94,7 +96,7 @@ public class ConfigurationResolverCustom
 
     @Test
     public void testConfig_Simple() {
-        context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.SimpleConfig/jcr:content",
+        context.build().resource("/conf/content/site1/settings/org.apache.sling.caconfig.example.SimpleConfig/jcr:content",
                 "stringParam", "configValue1",
                 "intParam", 111,
                 "boolParam", true);
@@ -108,7 +110,7 @@ public class ConfigurationResolverCustom
 
     @Test
     public void testConfig_SimpleWithName() {
-        context.build().resource("/conf/content/site1/sling:configs/sampleName/jcr:content",
+        context.build().resource("/conf/content/site1/settings/sampleName/jcr:content",
                 "stringParam", "configValue1.1",
                 "intParam", 1111,
                 "boolParam", true);
@@ -122,7 +124,7 @@ public class ConfigurationResolverCustom
 
     @Test
     public void testConfig_List() {
-        context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListConfig")
+        context.build().resource("/conf/content/site1/settings/org.apache.sling.caconfig.example.ListConfig")
             .siblingsMode()
             .resource("1/jcr:content", "stringParam", "configValue1.1")
             .resource("2/jcr:content", "stringParam", "configValue1.2")
@@ -139,7 +141,7 @@ public class ConfigurationResolverCustom
 
     @Test
     public void testConfig_Nested() {
-        context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.NestedConfig")
+        context.build().resource("/conf/content/site1/settings/org.apache.sling.caconfig.example.NestedConfig")
             .resource("jcr:content", "stringParam", "configValue3")
                 .siblingsMode()
                 .resource("subConfig/jcr:content", "stringParam", "configValue4", "intParam", 444, "boolParam", true)

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationTestUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationTestUtils.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationTestUtils.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationTestUtils.java Wed Dec  7 18:03:16 2016
@@ -36,14 +36,14 @@ public final class ConfigurationTestUtil
      * Register all services for {@link ConfigurationResolver}.
      * @param context Sling context
      */
-    public static ConfigurationResolver registerConfigurationResolver(SlingContext context) {
+    public static ConfigurationResolver registerConfigurationResolver(SlingContext context, Object... properties) {
         ConfigurationResourceTestUtils.registerConfigurationResourceResolver(context);        
         context.registerInjectActivateService(new DefaultConfigurationPersistenceStrategy());
         context.registerInjectActivateService(new ConfigurationPersistenceStrategyMultiplexer());
         context.registerInjectActivateService(new DefaultConfigurationInheritanceStrategy());
         context.registerInjectActivateService(new ConfigurationInheritanceStrategyMultiplexer());
         context.registerInjectActivateService(new ConfigurationOverrideManager());
-        return context.registerInjectActivateService(new ConfigurationResolverImpl());
+        return context.registerInjectActivateService(new ConfigurationResolverImpl(), properties);
     }
     
     /**
@@ -51,12 +51,12 @@ public final class ConfigurationTestUtil
      * without the default implementations of the multiplexed services.
      * @param context Sling context
      */
-    public static ConfigurationResolver registerConfigurationResolverWithoutDefaultImpl(SlingContext context) {
+    public static ConfigurationResolver registerConfigurationResolverWithoutDefaultImpl(SlingContext context, Object... properties) {
         ConfigurationResourceTestUtils.registerConfigurationResourceResolverWithoutDefaultImpl(context);
         context.registerInjectActivateService(new ConfigurationPersistenceStrategyMultiplexer());
         context.registerInjectActivateService(new ConfigurationInheritanceStrategyMultiplexer());
         context.registerInjectActivateService(new ConfigurationOverrideManager());
-        return context.registerInjectActivateService(new ConfigurationResolverImpl());
+        return context.registerInjectActivateService(new ConfigurationResolverImpl(), properties);
     }
     
 }

Added: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceMixedTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceMixedTest.java?rev=1773130&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceMixedTest.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceMixedTest.java Wed Dec  7 18:03:16 2016
@@ -0,0 +1,61 @@
+/*
+ * 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.caconfig.management.impl;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.caconfig.spi.ConfigurationPersistenceStrategy;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.osgi.framework.Constants;
+
+/**
+ * Test {@link ConfigurationManagerImpl} with custom persistence.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ConfigurationManagerImplCustomPersistenceMixedTest extends ConfigurationManagerImplTest {
+    
+    @Before
+    public void setUpCustomPersistence() {
+        // custom strategy which redirects all config resources to a jcr:content subnode
+        context.registerService(ConfigurationPersistenceStrategy.class,
+                new CustomConfigurationPersistenceStrategy(), Constants.SERVICE_RANKING, 2000);
+    }
+
+    @Override
+    protected String getConfigPropsPath(String path) {
+        return StringUtils.replace(path + "/jcr:content", "/sling:configs/", "/settings/");
+    }
+
+    @Override
+    protected String getConfigPropsPersistPath(String path) {
+        return path + "/jcr:content";
+    }
+
+    @Override
+    protected String[] getAlternativeBucketNames() {
+        return new String[] { "settings" };
+    }
+
+    @Override
+    protected String getConfigCollectionParentPath(String path) {
+        return StringUtils.replace(path, "/sling:configs/", "/settings/");
+    }
+    
+}

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceMixedTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceMixedTest.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Wed Dec  7 18:03:16 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceMixedTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceTest.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplCustomPersistenceTest.java Wed Dec  7 18:03:16 2016
@@ -18,18 +18,25 @@
  */
 package org.apache.sling.caconfig.management.impl;
 
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceStrategy;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.runner.RunWith;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.osgi.framework.Constants;
 
 /**
- * Test {@link ConfigurationManagerImpl} with custom persistence.
+ * Test {@link ConfigurationManagerImpl} with custom persistence with mixed bucked names (primary, alternative).
  */
+@Ignore  // TODO: does this test makes sense?
 @RunWith(MockitoJUnitRunner.class)
 public class ConfigurationManagerImplCustomPersistenceTest extends ConfigurationManagerImplTest {
     
+    private static AtomicInteger COUNTER = new AtomicInteger();
+    
     @Before
     public void setUpCustomPersistence() {
         // custom strategy which redirects all config resources to a jcr:content subnode
@@ -39,7 +46,35 @@ public class ConfigurationManagerImplCus
 
     @Override
     protected String getConfigPropsPath(String path) {
+        return StringUtils.replace(path + "/jcr:content", "/sling:configs/", "/" + getIteratingBucketName() + "/");
+    }
+
+    @Override
+    protected String getConfigPropsPersistPath(String path) {
         return path + "/jcr:content";
     }
 
+    @Override
+    protected String[] getAlternativeBucketNames() {
+        return new String[] { "settings" };
+    }
+
+    @Override
+    protected String getConfigCollectionParentPath(String path) {
+        return StringUtils.replace(path, "/sling:configs/", "/" + getIteratingBucketName() + "/");
+    }
+    
+    /**
+     * @return On or another bucket name changing each call.
+     */
+    private String getIteratingBucketName() {
+        int count = COUNTER.getAndIncrement();
+        if (count % 2 == 0) {
+            return "sling:configs";
+        }
+        else {
+            return "settings";
+        }
+    }
+    
 }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java Wed Dec  7 18:03:16 2016
@@ -83,7 +83,8 @@ public class ConfigurationManagerImplTes
     public void setUp() {
         context.registerService(ConfigurationMetadataProvider.class, configurationMetadataProvider);
         context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer());
-        ConfigurationTestUtils.registerConfigurationResolver(context);
+        ConfigurationTestUtils.registerConfigurationResolver(context,
+                "configBucketNames", getAlternativeBucketNames());
         underTest = context.registerInjectActivateService(new ConfigurationManagerImpl());
         
         contextResource = context.create().resource("/content/test",
@@ -104,7 +105,7 @@ public class ConfigurationManagerImplTes
                 "prop4", true);
         
         // test fixture with resource collection inheritance on level 2
-        context.create().resource("/conf/test/level2/sling:configs/" + CONFIG_COL_NAME,
+        context.create().resource(getConfigCollectionParentPath("/conf/test/level2/sling:configs/" + CONFIG_COL_NAME),
                 PROPERTY_CONFIG_COLLECTION_INHERIT, true);
         context.create().resource(getConfigPropsPath("/conf/test/level2/sling:configs/" + CONFIG_COL_NAME + "/1"),
                 "prop1", "value1_level2");
@@ -114,7 +115,7 @@ public class ConfigurationManagerImplTes
                 "prop4", false,
                 "prop5", "value5_level3",
                 PROPERTY_CONFIG_PROPERTY_INHERIT, true);
-        context.create().resource("/conf/test/level2/level3/sling:configs/" + CONFIG_COL_NAME,
+        context.create().resource(getConfigCollectionParentPath("/conf/test/level2/level3/sling:configs/" + CONFIG_COL_NAME),
                 PROPERTY_CONFIG_COLLECTION_INHERIT, true);
         context.create().resource(getConfigPropsPath("/conf/test/level2/level3/sling:configs/" + CONFIG_COL_NAME + "/1"),
                 "prop4", false,
@@ -199,6 +200,18 @@ public class ConfigurationManagerImplTes
         return path;
     }
     
+    protected String getConfigPropsPersistPath(String path) {
+        return path;
+    }
+    
+    protected String getConfigCollectionParentPath(String path) {
+        return path;
+    }
+    
+    protected String[] getAlternativeBucketNames() {
+        return new String[0];
+    }
+    
     @Test
     public void testGetConfiguration() {
         ConfigurationData configData = underTest.getConfiguration(contextResource, CONFIG_NAME);
@@ -506,7 +519,7 @@ public class ConfigurationManagerImplTes
                 new ConfigurationPersistData(ImmutableMap.<String, Object>of("prop1", "value1")));
         context.resourceResolver().commit();
 
-        String configPath = getConfigPropsPath("/conf/testNoConfig/sling:configs/" + CONFIG_NAME);
+        String configPath = getConfigPropsPersistPath("/conf/testNoConfig/sling:configs/" + CONFIG_NAME);
         ValueMap props = context.resourceResolver().getResource(configPath).getValueMap();
         assertEquals("value1", props.get("prop1"));
     }
@@ -520,11 +533,11 @@ public class ConfigurationManagerImplTes
         ));
         context.resourceResolver().commit();
 
-        String configPath0 = getConfigPropsPath("/conf/testNoConfig/sling:configs/" + CONFIG_COL_NAME + "/0");
+        String configPath0 = getConfigPropsPersistPath("/conf/testNoConfig/sling:configs/" + CONFIG_COL_NAME + "/0");
         ValueMap props0 = context.resourceResolver().getResource(configPath0).getValueMap();
         assertEquals("value1", props0.get("prop1"));
 
-        String configPath1 = getConfigPropsPath("/conf/testNoConfig/sling:configs/" + CONFIG_COL_NAME + "/1");
+        String configPath1 = getConfigPropsPersistPath("/conf/testNoConfig/sling:configs/" + CONFIG_COL_NAME + "/1");
         ValueMap props1 = context.resourceResolver().getResource(configPath1).getValueMap();
         assertEquals((Integer)5, props1.get("prop2"));
     }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolvingStrategyMultiplexerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolvingStrategyMultiplexerTest.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolvingStrategyMultiplexerTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/ConfigurationResourceResolvingStrategyMultiplexerTest.java Wed Dec  7 18:03:16 2016
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertThat;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 
 import org.apache.sling.api.resource.Resource;
@@ -48,6 +49,7 @@ import com.google.common.collect.Iterato
 public class ConfigurationResourceResolvingStrategyMultiplexerTest {
 
     private static final String BUCKET = "sling:test";
+    private static final Collection<String> BUCKETS = Collections.singleton(BUCKET);
     
     @Rule
     public SlingContext context = new SlingContext();
@@ -86,11 +88,11 @@ public class ConfigurationResourceResolv
     
     @Test
     public void testWithNoStrategies() {
-        assertNull(underTest.getResource(site1Page1, BUCKET, "test"));
-        assertNull(underTest.getResourceCollection(site1Page1, BUCKET, "feature"));
+        assertNull(underTest.getResource(site1Page1, BUCKETS, "test"));
+        assertNull(underTest.getResourceCollection(site1Page1, BUCKETS, "feature"));
 
-        assertNull(underTest.getResourceInheritanceChain(site1Page1, BUCKET, "test"));
-        assertNull(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKET, "feature"));
+        assertNull(underTest.getResourceInheritanceChain(site1Page1, BUCKETS, "test"));
+        assertNull(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKETS, "feature"));
 
         assertNull(underTest.getResourcePath(site1Page1, BUCKET, "test"));
         assertNull(underTest.getResourceCollectionParentPath(site1Page1, BUCKET, "feature"));
@@ -100,14 +102,14 @@ public class ConfigurationResourceResolv
     public void testWithDefaultStrategy() {
         context.registerInjectActivateService(new DefaultConfigurationResourceResolvingStrategy());
 
-        assertThat(underTest.getResource(site1Page1, BUCKET, "test"), ResourceMatchers.path("/conf/site1/sling:test/test"));
-        assertThat(underTest.getResourceCollection(site1Page1, BUCKET, "feature"), ResourceCollectionMatchers.paths( 
+        assertThat(underTest.getResource(site1Page1, BUCKETS, "test"), ResourceMatchers.path("/conf/site1/sling:test/test"));
+        assertThat(underTest.getResourceCollection(site1Page1, BUCKETS, "feature"), ResourceCollectionMatchers.paths( 
                 "/conf/site1/sling:test/feature/c",
                 "/apps/conf/sling:test/feature/a", 
                 "/libs/conf/sling:test/feature/b"));
 
-        assertThat(first(underTest.getResourceInheritanceChain(site1Page1, BUCKET, "test")), ResourceMatchers.path("/conf/site1/sling:test/test"));
-        assertThat(first(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKET, "feature")), ResourceCollectionMatchers.paths( 
+        assertThat(first(underTest.getResourceInheritanceChain(site1Page1, BUCKETS, "test")), ResourceMatchers.path("/conf/site1/sling:test/test"));
+        assertThat(first(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKETS, "feature")), ResourceCollectionMatchers.paths( 
                 "/conf/site1/sling:test/feature/c",
                 "/apps/conf/sling:test/feature/a", 
                 "/libs/conf/sling:test/feature/b"));
@@ -122,21 +124,21 @@ public class ConfigurationResourceResolv
         // strategy 1
         context.registerService(ConfigurationResourceResolvingStrategy.class, new ConfigurationResourceResolvingStrategy() {
             @Override
-            public Resource getResource(Resource resource, String bucketName, String configName) {
+            public Resource getResource(Resource resource, Collection<String> bucketNames, String configName) {
                 return context.resourceResolver().getResource("/conf/site1/sling:test/test");
             }
             @Override
-            public Collection<Resource> getResourceCollection(Resource resource, String bucketName, String configName) {
+            public Collection<Resource> getResourceCollection(Resource resource, Collection<String> bucketNames, String configName) {
                 return ImmutableList.copyOf(context.resourceResolver().getResource("/conf/site1/sling:test/feature").listChildren());
             }
             @Override
-            public Iterator<Resource> getResourceInheritanceChain(Resource resource, String bucketName, String configName) {
-                return Iterators.singletonIterator(getResource(resource, bucketName, configName));
+            public Iterator<Resource> getResourceInheritanceChain(Resource resource, Collection<String> bucketNames, String configName) {
+                return Iterators.singletonIterator(getResource(resource, bucketNames, configName));
             }
             @Override
             public Collection<Iterator<Resource>> getResourceCollectionInheritanceChain(Resource resource,
-                    String bucketName, String configName) {
-                return Collections2.transform(getResourceCollection(resource, bucketName, configName), new Function<Resource, Iterator<Resource>>() {
+                    Collection<String> bucketNames, String configName) {
+                return Collections2.transform(getResourceCollection(resource, bucketNames, configName), new Function<Resource, Iterator<Resource>>() {
                     @Override
                     public Iterator<Resource> apply(Resource input) {
                         return Iterators.singletonIterator(input);
@@ -156,21 +158,21 @@ public class ConfigurationResourceResolv
         // strategy 2
         context.registerService(ConfigurationResourceResolvingStrategy.class, new ConfigurationResourceResolvingStrategy() {
             @Override
-            public Resource getResource(Resource resource, String bucketName, String configName) {
+            public Resource getResource(Resource resource, Collection<String> bucketNames, String configName) {
                 return context.resourceResolver().getResource("/libs/conf/sling:test/test");
             }
             @Override
-            public Collection<Resource> getResourceCollection(Resource resource, String bucketName, String configName) {
+            public Collection<Resource> getResourceCollection(Resource resource, Collection<String> bucketNames, String configName) {
                 return ImmutableList.copyOf(context.resourceResolver().getResource("/libs/conf/sling:test/feature").listChildren());
             }
             @Override
-            public Iterator<Resource> getResourceInheritanceChain(Resource resource, String bucketName, String configName) {
-                return Iterators.singletonIterator(getResource(resource, bucketName, configName));
+            public Iterator<Resource> getResourceInheritanceChain(Resource resource, Collection<String> bucketNames, String configName) {
+                return Iterators.singletonIterator(getResource(resource, bucketNames, configName));
             }
             @Override
             public Collection<Iterator<Resource>> getResourceCollectionInheritanceChain(Resource resource,
-                    String bucketName, String configName) {
-                return Collections2.transform(getResourceCollection(resource, bucketName, configName), new Function<Resource, Iterator<Resource>>() {
+                    Collection<String> bucketNames, String configName) {
+                return Collections2.transform(getResourceCollection(resource, bucketNames, configName), new Function<Resource, Iterator<Resource>>() {
                     @Override
                     public Iterator<Resource> apply(Resource input) {
                         return Iterators.singletonIterator(input);
@@ -187,12 +189,12 @@ public class ConfigurationResourceResolv
             }
         }, Constants.SERVICE_RANKING, 1000);
         
-        assertThat(underTest.getResource(site1Page1, BUCKET, "test"), ResourceMatchers.path("/conf/site1/sling:test/test"));
-        assertThat(underTest.getResourceCollection(site1Page1, BUCKET, "feature"), ResourceCollectionMatchers.paths( 
+        assertThat(underTest.getResource(site1Page1, BUCKETS, "test"), ResourceMatchers.path("/conf/site1/sling:test/test"));
+        assertThat(underTest.getResourceCollection(site1Page1, BUCKETS, "feature"), ResourceCollectionMatchers.paths( 
                 "/conf/site1/sling:test/feature/c"));
         
-        assertThat(first(underTest.getResourceInheritanceChain(site1Page1, BUCKET, "test")), ResourceMatchers.path("/conf/site1/sling:test/test"));
-        assertThat(first(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKET, "feature")), ResourceCollectionMatchers.paths( 
+        assertThat(first(underTest.getResourceInheritanceChain(site1Page1, BUCKETS, "test")), ResourceMatchers.path("/conf/site1/sling:test/test"));
+        assertThat(first(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKETS, "feature")), ResourceCollectionMatchers.paths( 
                 "/conf/site1/sling:test/feature/c"));
         
         assertEquals("/conf/site1/sling:test/test", underTest.getResourcePath(site1Page1, BUCKET, "test"));
@@ -209,7 +211,7 @@ public class ConfigurationResourceResolv
     }
     
     private Collection<Resource> first(Collection<Iterator<Resource>> resources) {
-        return Collections2.transform(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKET, "feature"),
+        return Collections2.transform(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKETS, "feature"),
                 new Function<Iterator<Resource>, Resource>() {
                 @Override
                 public Resource apply(Iterator<Resource> input) {

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java?rev=1773130&r1=1773129&r2=1773130&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java Wed Dec  7 18:03:16 2016
@@ -24,6 +24,8 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
@@ -45,6 +47,7 @@ import com.google.common.collect.Immutab
 public class DefaultConfigurationResourceResolvingStrategyHierarchyTest {
     
     private static final String BUCKET = "sling:test";
+    private static final Collection<String> BUCKETS = Collections.singleton(BUCKET);
 
     @Rule
     public SlingContext context = new SlingContext();
@@ -85,23 +88,23 @@ public class DefaultConfigurationResourc
             .resource("/libs/conf/sling:test/cfgLibsGlobal")
             .resource("/libs/conf/sling:test/test");
 
-        assertEquals("/conf/brand1/tenant1/region1/site1/sling:test/cfgSite1", underTest.getResource(site1Page1, BUCKET, "cfgSite1").getPath());
-        assertEquals("/conf/brand1/tenant1/region1/sling:test/cfgRegion1", underTest.getResource(site1Page1, BUCKET, "cfgRegion1").getPath());
-        assertEquals("/conf/brand1/tenant1/sling:test/cfgTenant1", underTest.getResource(site1Page1, BUCKET, "cfgTenant1").getPath());
-        assertEquals("/conf/brand1/sling:test/cfgBrand1", underTest.getResource(site1Page1, BUCKET, "cfgBrand1").getPath());
-        assertEquals("/conf/global/sling:test/cfgGlobal", underTest.getResource(site1Page1, BUCKET, "cfgGlobal").getPath());
-        assertEquals("/apps/conf/sling:test/cfgAppsGlobal", underTest.getResource(site1Page1, BUCKET, "cfgAppsGlobal").getPath());
-        assertEquals("/libs/conf/sling:test/cfgLibsGlobal", underTest.getResource(site1Page1, BUCKET, "cfgLibsGlobal").getPath());
-        assertEquals("/conf/brand1/tenant1/sling:test/test", underTest.getResource(site1Page1, BUCKET, "test").getPath());
-
-        assertNull(underTest.getResource(site2Page1, BUCKET, "cfgSite1"));
-        assertEquals("/conf/brand1/tenant1/region1/sling:test/cfgRegion1", underTest.getResource(site2Page1, BUCKET, "cfgRegion1").getPath());
-        assertEquals("/conf/brand1/tenant1/sling:test/cfgTenant1", underTest.getResource(site2Page1, BUCKET, "cfgTenant1").getPath());
-        assertEquals("/conf/brand1/sling:test/cfgBrand1", underTest.getResource(site2Page1, BUCKET, "cfgBrand1").getPath());
-        assertEquals("/conf/global/sling:test/cfgGlobal", underTest.getResource(site2Page1, BUCKET, "cfgGlobal").getPath());
-        assertEquals("/apps/conf/sling:test/cfgAppsGlobal", underTest.getResource(site2Page1, BUCKET, "cfgAppsGlobal").getPath());
-        assertEquals("/libs/conf/sling:test/cfgLibsGlobal", underTest.getResource(site2Page1, BUCKET, "cfgLibsGlobal").getPath());
-        assertEquals("/conf/brand1/tenant1/sling:test/test", underTest.getResource(site2Page1, BUCKET, "test").getPath());
+        assertEquals("/conf/brand1/tenant1/region1/site1/sling:test/cfgSite1", underTest.getResource(site1Page1, BUCKETS, "cfgSite1").getPath());
+        assertEquals("/conf/brand1/tenant1/region1/sling:test/cfgRegion1", underTest.getResource(site1Page1, BUCKETS, "cfgRegion1").getPath());
+        assertEquals("/conf/brand1/tenant1/sling:test/cfgTenant1", underTest.getResource(site1Page1, BUCKETS, "cfgTenant1").getPath());
+        assertEquals("/conf/brand1/sling:test/cfgBrand1", underTest.getResource(site1Page1, BUCKETS, "cfgBrand1").getPath());
+        assertEquals("/conf/global/sling:test/cfgGlobal", underTest.getResource(site1Page1, BUCKETS, "cfgGlobal").getPath());
+        assertEquals("/apps/conf/sling:test/cfgAppsGlobal", underTest.getResource(site1Page1, BUCKETS, "cfgAppsGlobal").getPath());
+        assertEquals("/libs/conf/sling:test/cfgLibsGlobal", underTest.getResource(site1Page1, BUCKETS, "cfgLibsGlobal").getPath());
+        assertEquals("/conf/brand1/tenant1/sling:test/test", underTest.getResource(site1Page1, BUCKETS, "test").getPath());
+
+        assertNull(underTest.getResource(site2Page1, BUCKETS, "cfgSite1"));
+        assertEquals("/conf/brand1/tenant1/region1/sling:test/cfgRegion1", underTest.getResource(site2Page1, BUCKETS, "cfgRegion1").getPath());
+        assertEquals("/conf/brand1/tenant1/sling:test/cfgTenant1", underTest.getResource(site2Page1, BUCKETS, "cfgTenant1").getPath());
+        assertEquals("/conf/brand1/sling:test/cfgBrand1", underTest.getResource(site2Page1, BUCKETS, "cfgBrand1").getPath());
+        assertEquals("/conf/global/sling:test/cfgGlobal", underTest.getResource(site2Page1, BUCKETS, "cfgGlobal").getPath());
+        assertEquals("/apps/conf/sling:test/cfgAppsGlobal", underTest.getResource(site2Page1, BUCKETS, "cfgAppsGlobal").getPath());
+        assertEquals("/libs/conf/sling:test/cfgLibsGlobal", underTest.getResource(site2Page1, BUCKETS, "cfgLibsGlobal").getPath());
+        assertEquals("/conf/brand1/tenant1/sling:test/test", underTest.getResource(site2Page1, BUCKETS, "test").getPath());
     }
 
     @Test
@@ -113,14 +116,14 @@ public class DefaultConfigurationResourc
             .resource("/apps/conf/sling:test/test")
             .resource("/libs/conf/sling:test/test");
         
-        assertThat(underTest.getResourceInheritanceChain(site1Page1, BUCKET, "test"), ResourceIteratorMatchers.paths(
+        assertThat(underTest.getResourceInheritanceChain(site1Page1, BUCKETS, "test"), ResourceIteratorMatchers.paths(
                 "/conf/brand1/tenant1/region1/site1/sling:test/test",
                 "/conf/brand1/tenant1/sling:test/test",
                 "/conf/global/sling:test/test",
                 "/apps/conf/sling:test/test",
                 "/libs/conf/sling:test/test"));
 
-        assertThat(underTest.getResourceInheritanceChain(site2Page1, BUCKET, "test"), ResourceIteratorMatchers.paths(
+        assertThat(underTest.getResourceInheritanceChain(site2Page1, BUCKETS, "test"), ResourceIteratorMatchers.paths(
                 "/conf/brand1/tenant1/sling:test/test",
                 "/conf/global/sling:test/test",
                 "/apps/conf/sling:test/test",
@@ -139,7 +142,7 @@ public class DefaultConfigurationResourc
             .resource("/libs/conf/sling:test/cfgCol/libsGlobal1")
             .resource("/libs/conf/sling:test/cfgCol/libsGlobal2");
 
-        assertThat(underTest.getResourceCollection(site1Page1, BUCKET, "cfgCol"), ResourceCollectionMatchers.paths(
+        assertThat(underTest.getResourceCollection(site1Page1, BUCKETS, "cfgCol"), ResourceCollectionMatchers.paths(
                 "/conf/brand1/tenant1/region1/site1/sling:test/cfgCol/site1",
                 "/conf/brand1/tenant1/region1/sling:test/cfgCol/region1", 
                 "/conf/brand1/tenant1/sling:test/cfgCol/tenant1", 
@@ -149,7 +152,7 @@ public class DefaultConfigurationResourc
                 "/libs/conf/sling:test/cfgCol/libsGlobal1", 
                 "/libs/conf/sling:test/cfgCol/libsGlobal2"));
 
-        assertThat(underTest.getResourceCollection(site2Page1, BUCKET, "cfgCol"), ResourceCollectionMatchers.paths( 
+        assertThat(underTest.getResourceCollection(site2Page1, BUCKETS, "cfgCol"), ResourceCollectionMatchers.paths( 
                 "/conf/brand1/tenant1/region1/sling:test/cfgCol/region1", 
                 "/conf/brand1/tenant1/sling:test/cfgCol/tenant1", 
                 "/conf/brand1/sling:test/cfgCol/brand1", 
@@ -181,7 +184,7 @@ public class DefaultConfigurationResourc
                 .resource("item2")
                 .resource("item3");
         
-        List<Iterator<Resource>> resources = ImmutableList.copyOf(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKET, "cfgCol"));
+        List<Iterator<Resource>> resources = ImmutableList.copyOf(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKETS, "cfgCol"));
         assertEquals(4, resources.size());
         
         assertThat(resources.get(0), ResourceIteratorMatchers.paths(
@@ -213,7 +216,7 @@ public class DefaultConfigurationResourc
         
         Resource level1_2 = context.resourceResolver().getResource("/content/level1/level2");
 
-        assertThat(underTest.getResourceCollection(level1_2, BUCKET, "cfgCol"), ResourceCollectionMatchers.paths( 
+        assertThat(underTest.getResourceCollection(level1_2, BUCKETS, "cfgCol"), ResourceCollectionMatchers.paths( 
                 "/conf/b1/b2/sling:test/cfgCol/b1_b2", 
                 "/conf/b1/sling:test/cfgCol/b1", 
                 "/conf/a1/a2/sling:test/cfgCol/a1_a2",