Author: sseifert
Date: Fri Oct  7 15:36:13 2016
New Revision: 1763789

URL: http://svn.apache.org/viewvc?rev=1763789&view=rev
Log:
SLING-6114 Support nested configurations in configured locations

Added:
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathEliminateDuplicatesIterator.java
   (with props)
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIterator.java
   (with props)
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourceEliminateDuplicatesIterator.java
   (with props)
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourcePathCollatingIterator.java
   (with props)
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/util/
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIteratorTest.java
   (with props)
Modified:
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/ContextPathStrategyMultiplexer.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/main/java/org/apache/sling/contextaware/config/resource/impl/def/WebConsolePlugin.java
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/def/DefaultConfigurationResourceResolvingStrategyHierarchyTest.java

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/ContextPathStrategyMultiplexer.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/ContextPathStrategyMultiplexer.java?rev=1763789&r1=1763788&r2=1763789&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/ContextPathStrategyMultiplexer.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/ContextPathStrategyMultiplexer.java
 Fri Oct  7 15:36:13 2016
@@ -20,19 +20,15 @@ package org.apache.sling.contextaware.co
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
-import org.apache.commons.collections.Predicate;
-import org.apache.commons.collections.iterators.CollatingIterator;
-import org.apache.commons.collections.iterators.FilterIterator;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.commons.osgi.Order;
 import org.apache.sling.commons.osgi.RankedServices;
+import 
org.apache.sling.contextaware.config.resource.impl.util.ResourceEliminateDuplicatesIterator;
+import 
org.apache.sling.contextaware.config.resource.impl.util.ResourcePathCollatingIterator;
 import org.apache.sling.contextaware.config.resource.spi.ContextPathStrategy;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
@@ -53,15 +49,6 @@ reference={
 })
 public class ContextPathStrategyMultiplexer implements ContextPathStrategy {
     
-    private static Comparator<Resource> PATH_LENGTH_COMPARATOR = new 
Comparator<Resource>() {
-        @Override
-        public int compare(Resource o1, Resource o2) {
-            Integer length1 = o1.getPath().length();
-            Integer length2 = o2.getPath().length();
-            return length2.compareTo(length1);
-        }
-    };
-    
     private RankedServices<ContextPathStrategy> items = new 
RankedServices<>(Order.DESCENDING);
         
     protected void bindContextPathStrategy(ContextPathStrategy 
contextPathStrategy, Map<String, Object> props) {
@@ -113,15 +100,9 @@ public class ContextPathStrategyMultiple
      */
     @SuppressWarnings("unchecked")
     private Iterator<Resource> mergeResults(List<Iterator<Resource>> 
allResults) {
-        return new FilterIterator(new 
CollatingIterator(PATH_LENGTH_COMPARATOR, allResults),
-                // eliminate duplicate resources reported by different 
implementations
-                new Predicate() {
-                    private Set<String> resourcePaths = new HashSet<>();
-                    @Override
-                    public boolean evaluate(Object object) {
-                        return resourcePaths.add(((Resource)object).getPath());
-                    }
-                });
+        return new ResourceEliminateDuplicatesIterator(
+                new ResourcePathCollatingIterator(allResults)
+        );
     }
     
 }

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=1763789&r1=1763788&r2=1763789&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 15:36:13 2016
@@ -39,6 +39,8 @@ import org.apache.commons.lang3.StringUt
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
 import 
org.apache.sling.contextaware.config.resource.impl.ContextPathStrategyMultiplexer;
+import 
org.apache.sling.contextaware.config.resource.impl.util.PathEliminateDuplicatesIterator;
+import 
org.apache.sling.contextaware.config.resource.impl.util.PathParentExpandIterator;
 import 
org.apache.sling.contextaware.config.resource.spi.ConfigurationResourceResolvingStrategy;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -62,9 +64,9 @@ public class DefaultConfigurationResourc
                 description = "Enable this configuration resourcer resolving 
strategy.")
         boolean enabled() default true;
 
-        @AttributeDefinition(name="Allowed paths",
-                             description = "Whitelist of paths where 
configurations can reside in.")
-        String[] allowedPaths() default {"/conf", "/apps/conf", "/libs/conf"};
+        @AttributeDefinition(name="Configurations path",
+                             description = "Paths where the configurations are 
stored in.")
+        String configPath() default "/conf";
 
         @AttributeDefinition(name="Fallback paths",
                 description = "Global fallback configurations, ordered from 
most specific (checked first) to least specific.")
@@ -122,14 +124,19 @@ public class DefaultConfigurationResourc
      */
     @SuppressWarnings("unchecked")
     private Iterator<String> findConfigRefs(final Resource startResource) {
+        // collect all context path resources
         Iterator<Resource> contextResources = 
contextPathStrategy.findContextResources(startResource);
+        
         // get config resource path for each context resource, filter out 
items where not reference could be resolved
-        return new FilterIterator(new TransformIterator(contextResources, new 
Transformer() {
+        Iterator<String> configPaths = new FilterIterator(new 
TransformIterator(contextResources, new Transformer() {
                 @Override
                 public Object transform(Object input) {
                     return getReference((Resource)input);
                 }
             }), PredicateUtils.notNullPredicate());
+        
+        // expand paths and eliminate duplicates
+        return new PathEliminateDuplicatesIterator(new 
PathParentExpandIterator(config.configPath(), configPaths));
     }
 
     private String getReference(final Resource resource) {
@@ -164,20 +171,15 @@ public class DefaultConfigurationResourc
     }
 
     private boolean isAllowedConfigPath(String path) {
-        for (String pattern : this.config.allowedPaths()) {
-            if (logger.isTraceEnabled()) {
-                logger.trace("- checking if '{}' starts with {}", path, 
pattern);
-            }
-            if (path.equals(pattern) || path.startsWith(pattern + "/")) {
-                return true;
-            }
+        if (logger.isTraceEnabled()) {
+            logger.trace("- checking if '{}' starts with {}", path, 
config.configPath());
         }
-        return false;
+        return path.startsWith(config.configPath() + "/");
     }
 
     private boolean isFallbackConfigPath(final String ref) {
-        for(final String name : this.config.fallbackPaths()) {
-            if ( name.equals(ref) ) {
+        for(final String path : this.config.fallbackPaths()) {
+            if (StringUtils.equals(ref, path) || StringUtils.startsWith(ref, 
path + "/")) {
                 return true;
             }
         }

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/WebConsolePlugin.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/WebConsolePlugin.java?rev=1763789&r1=1763788&r2=1763789&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/WebConsolePlugin.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/def/WebConsolePlugin.java
 Fri Oct  7 15:36:13 2016
@@ -92,9 +92,9 @@ public class WebConsolePlugin extends Ab
         final DefaultConfigurationResourceResolvingStrategy configResolverImpl 
= (DefaultConfigurationResourceResolvingStrategy)configResolver;
         tableStart(pw, "Configuration", 2);
         pw.println("<tr>");
-        pw.println("<td style='width:20%'>Allowed paths</td>");
+        pw.println("<td style='width:20%'>Configurations path</td>");
         pw.print("<td>");
-        
pw.print(xssAPI.encodeForHTML(Arrays.toString(configResolverImpl.getConfiguration().allowedPaths())));
+        
pw.print(xssAPI.encodeForHTML(configResolverImpl.getConfiguration().configPath()));
         pw.println("</td>");
         pw.println("</tr>");
         pw.println("<tr>");

Added: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathEliminateDuplicatesIterator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathEliminateDuplicatesIterator.java?rev=1763789&view=auto
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathEliminateDuplicatesIterator.java
 (added)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathEliminateDuplicatesIterator.java
 Fri Oct  7 15:36:13 2016
@@ -0,0 +1,45 @@
+/*
+ * 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.contextaware.config.resource.impl.util;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.FilterIterator;
+
+/**
+ * Iterator that eliminates duplicate paths.
+ */
+public class PathEliminateDuplicatesIterator extends FilterIterator {
+
+    public PathEliminateDuplicatesIterator(Iterator<String> iterator) {
+        super(iterator, new Predicate() {
+            private final Set<String> resourcePaths = new HashSet<>();
+            
+            @Override
+            public boolean evaluate(Object object) {
+                return resourcePaths.add((String)object);
+            }
+            
+        });
+    }
+    
+}

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

Propchange: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathEliminateDuplicatesIterator.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri Oct  7 15:36:13 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

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

Added: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIterator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIterator.java?rev=1763789&view=auto
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIterator.java
 (added)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIterator.java
 Fri Oct  7 15:36:13 2016
@@ -0,0 +1,70 @@
+/*
+ * 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.contextaware.config.resource.impl.util;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Queue;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.resource.ResourceUtil;
+
+/**
+ * Expands all paths from the iterator with their parent paths up to the given 
root paths.
+ * The expanded path are added directly after each given path.
+ * Duplicates are not eliminated.
+ */
+public class PathParentExpandIterator implements Iterator<String> {
+    
+    private final String rootPath;
+    private final Iterator<String> paths;
+    private final Queue<String> expandedPaths = new LinkedList<>();
+    
+    public PathParentExpandIterator(String rootPath, Iterator<String> paths) {
+        this.rootPath = rootPath;
+        this.paths = paths;
+    }
+
+    @Override
+    public boolean hasNext() {
+        return paths.hasNext() || !expandedPaths.isEmpty();
+    }
+
+    @Override
+    public String next() {
+        if (expandedPaths.isEmpty()) {
+            expandPaths(paths.next());
+        }
+        return expandedPaths.remove();
+    }
+    
+    private void expandPaths(String path) {
+        expandedPaths.add(path);
+        String parentPath = ResourceUtil.getParent(path);
+        if (parentPath != null && !StringUtils.equals(parentPath, rootPath)) {
+            expandPaths(parentPath);
+        }
+    }
+
+    @Override
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+
+}

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

Propchange: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIterator.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri Oct  7 15:36:13 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

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

Added: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourceEliminateDuplicatesIterator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourceEliminateDuplicatesIterator.java?rev=1763789&view=auto
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourceEliminateDuplicatesIterator.java
 (added)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourceEliminateDuplicatesIterator.java
 Fri Oct  7 15:36:13 2016
@@ -0,0 +1,46 @@
+/*
+ * 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.contextaware.config.resource.impl.util;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.FilterIterator;
+import org.apache.sling.api.resource.Resource;
+
+/**
+ * Iterator that eliminates duplicate resources (having same path).
+ */
+public class ResourceEliminateDuplicatesIterator extends FilterIterator {
+
+    public ResourceEliminateDuplicatesIterator(Iterator<Resource> iterator) {
+        super(iterator, new Predicate() {
+            private final Set<String> resourcePaths = new HashSet<>();
+            
+            @Override
+            public boolean evaluate(Object object) {
+                return resourcePaths.add(((Resource)object).getPath());
+            }
+            
+        });
+    }
+    
+}

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

Propchange: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourceEliminateDuplicatesIterator.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri Oct  7 15:36:13 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

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

Added: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourcePathCollatingIterator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourcePathCollatingIterator.java?rev=1763789&view=auto
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourcePathCollatingIterator.java
 (added)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourcePathCollatingIterator.java
 Fri Oct  7 15:36:13 2016
@@ -0,0 +1,48 @@
+/*
+ * 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.contextaware.config.resource.impl.util;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.collections.iterators.CollatingIterator;
+import org.apache.sling.api.resource.Resource;
+
+/**
+ * Expected a list of iterators containing paths, where each path is a direct 
or indirect parent of the previous one
+ * (= sorted by path hierarchy starting with the deepest path).
+ * Result is a new iterator with all resources combined from all iterators in 
the same order, duplicates not eliminated. 
+ */
+public class ResourcePathCollatingIterator extends CollatingIterator {
+
+    private static Comparator<Resource> PATH_LENGTH_COMPARATOR = new 
Comparator<Resource>() {
+        @Override
+        public int compare(Resource o1, Resource o2) {
+            Integer length1 = o1.getPath().length();
+            Integer length2 = o2.getPath().length();
+            return length2.compareTo(length1);
+        }
+    };
+
+    public ResourcePathCollatingIterator(List<Iterator<Resource>> iterator) {
+        super(PATH_LENGTH_COMPARATOR, iterator);
+    }
+    
+}

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

Propchange: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/contextaware/config/resource/impl/util/ResourcePathCollatingIterator.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri Oct  7 15:36:13 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

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

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=1763789&r1=1763788&r2=1763789&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 15:36:13 2016
@@ -56,10 +56,10 @@ public class DefaultConfigurationResourc
 
         // content resources that form a deeper hierarchy
         context.build()
-            .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");
+            .resource("/content/tenant1", PROPERTY_CONFIG_REF, 
"/conf/brand1/tenant1")
+            .resource("/content/tenant1/region1", PROPERTY_CONFIG_REF, 
"/conf/brand1/tenant1/region1")
+            .resource("/content/tenant1/region1/site1", PROPERTY_CONFIG_REF, 
"/conf/brand1/tenant1/region1/site1")
+            .resource("/content/tenant1/region1/site2", PROPERTY_CONFIG_REF, 
"/conf/brand1/tenant1/region1/site2");
         site1Page1 = 
context.create().resource("/content/tenant1/region1/site1/page1");
         site2Page1 = 
context.create().resource("/content/tenant1/region1/site2/page1");
 
@@ -69,10 +69,11 @@ public class DefaultConfigurationResourc
     public void testGetResource() {
         // build config resources
         context.build()
-            .resource("/conf/tenant1/region1/site1/sling:test/cfgSite1")
-            .resource("/conf/tenant1/region1/sling:test/cfgRegion1")
-            .resource("/conf/tenant1/sling:test/cfgTenant1")
-            .resource("/conf/tenant1/sling:test/test")
+            .resource("/conf/brand1/tenant1/region1/site1/sling:test/cfgSite1")
+            .resource("/conf/brand1/tenant1/region1/sling:test/cfgRegion1")
+            .resource("/conf/brand1/tenant1/sling:test/cfgTenant1")
+            .resource("/conf/brand1/tenant1/sling:test/test")
+            .resource("/conf/brand1/sling:test/cfgBrand1")
             .resource("/conf/global/sling:test/cfgGlobal")
             .resource("/conf/global/sling:test/test")
             .resource("/apps/conf/sling:test/cfgAppsGlobal")
@@ -80,30 +81,33 @@ public class DefaultConfigurationResourc
             .resource("/libs/conf/sling:test/cfgLibsGlobal")
             .resource("/libs/conf/sling:test/test");
 
-        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());
+        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/tenant1/sling:test/test", 
underTest.getResource(site1Page1, BUCKET, "test").getPath());
+        assertEquals("/conf/brand1/tenant1/sling:test/test", 
underTest.getResource(site1Page1, BUCKET, "test").getPath());
 
         assertNull(underTest.getResource(site2Page1, BUCKET, "cfgSite1"));
-        assertEquals("/conf/tenant1/region1/sling:test/cfgRegion1", 
underTest.getResource(site2Page1, BUCKET, "cfgRegion1").getPath());
-        assertEquals("/conf/tenant1/sling:test/cfgTenant1", 
underTest.getResource(site2Page1, BUCKET, "cfgTenant1").getPath());
+        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/tenant1/sling:test/test", 
underTest.getResource(site2Page1, BUCKET, "test").getPath());
+        assertEquals("/conf/brand1/tenant1/sling:test/test", 
underTest.getResource(site2Page1, BUCKET, "test").getPath());
     }
 
     @Test
     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/brand1/tenant1/region1/site1/sling:test/cfgCol/site1")
+            .resource("/conf/brand1/tenant1/region1/sling:test/cfgCol/region1")
+            .resource("/conf/brand1/tenant1/sling:test/cfgCol/tenant1")
+            .resource("/conf/brand1/sling:test/cfgCol/brand1")
             .resource("/conf/global/sling:test/cfgCol/confGlobal")
             .resource("/apps/conf/sling:test/cfgCol/appsGlobal")
             .resource("/libs/conf/sling:test/cfgCol", PROPERTY_CONFIG_INHERIT, 
true)
@@ -111,21 +115,50 @@ public class DefaultConfigurationResourc
             .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", 
-                "/conf/tenant1/sling:test/cfgCol/tenant1", 
+                "/conf/brand1/tenant1/region1/site1/sling:test/cfgCol/site1",
+                "/conf/brand1/tenant1/region1/sling:test/cfgCol/region1", 
+                "/conf/brand1/tenant1/sling:test/cfgCol/tenant1", 
+                "/conf/brand1/sling:test/cfgCol/brand1", 
                 "/conf/global/sling:test/cfgCol/confGlobal", 
                 "/apps/conf/sling:test/cfgCol/appsGlobal", 
                 "/libs/conf/sling:test/cfgCol/libsGlobal1", 
                 "/libs/conf/sling:test/cfgCol/libsGlobal2"));
 
         assertThat(underTest.getResourceCollection(site2Page1, BUCKET, 
"cfgCol"), ResourceCollectionMatchers.paths( 
-                "/conf/tenant1/region1/sling:test/cfgCol/region1", 
-                "/conf/tenant1/sling:test/cfgCol/tenant1", 
+                "/conf/brand1/tenant1/region1/sling:test/cfgCol/region1", 
+                "/conf/brand1/tenant1/sling:test/cfgCol/tenant1", 
+                "/conf/brand1/sling:test/cfgCol/brand1", 
                 "/conf/global/sling:test/cfgCol/confGlobal", 
                 "/apps/conf/sling:test/cfgCol/appsGlobal", 
                 "/libs/conf/sling:test/cfgCol/libsGlobal1", 
                 "/libs/conf/sling:test/cfgCol/libsGlobal2"));
     }
 
+    @Test
+    public void 
testGetResourceCollectionContentConfigRefInheritanceAndConfigResourceInheritance()
 {
+        
+        context.build()
+            .resource("/content/level1", PROPERTY_CONFIG_REF, "/conf/a1/a2")
+            .resource("/content/level1/level2", PROPERTY_CONFIG_REF, 
"/conf/b1/b2")
+            .resource("/conf/a1/sling:test/cfgCol/a1")
+            .resource("/conf/a1/a2/sling:test/cfgCol/a1_a2")
+            .resource("/conf/b1/sling:test/cfgCol/b1")
+            .resource("/conf/b1/b2/sling:test/cfgCol/b1_b2")
+            .resource("/conf/global/sling:test/cfgCol/confGlobal")
+            .resource("/libs/conf/sling:test/cfgCol", PROPERTY_CONFIG_INHERIT, 
true)
+            .resource("/apps/conf/sling:test/cfgCol/appsGlobal")
+            .resource("/libs/conf/sling:test/cfgCol/libsGlobal");
+        
+        Resource level1_2 = 
context.resourceResolver().getResource("/content/level1/level2");
+
+        assertThat(underTest.getResourceCollection(level1_2, BUCKET, 
"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", 
+                "/conf/a1/sling:test/cfgCol/a1", 
+                "/conf/global/sling:test/cfgCol/confGlobal", 
+                "/apps/conf/sling:test/cfgCol/appsGlobal", 
+                "/libs/conf/sling:test/cfgCol/libsGlobal"));
+    }
+    
 }

Added: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIteratorTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIteratorTest.java?rev=1763789&view=auto
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIteratorTest.java
 (added)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIteratorTest.java
 Fri Oct  7 15:36:13 2016
@@ -0,0 +1,50 @@
+/*
+ * 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.contextaware.config.resource.impl.util;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableList;
+
+public class PathParentExpandIteratorTest {
+
+    @Test
+    public void testExpansion() {
+        List<String> paths = ImmutableList.of(
+                "/conf/a/b/c", 
+                "/conf/a/b",
+                "/conf/x/y/z");
+        
+        List<String> result = ImmutableList.copyOf(new 
PathParentExpandIterator("/conf", paths.iterator()));
+        assertEquals(ImmutableList.of(
+                "/conf/a/b/c",
+                "/conf/a/b",
+                "/conf/a",
+                "/conf/a/b",
+                "/conf/a",
+                "/conf/x/y/z",
+                "/conf/x/y",
+                "/conf/x"), result);
+    }
+
+}

Propchange: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIteratorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIteratorTest.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri Oct  7 15:36:13 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/contextaware/config/resource/impl/util/PathParentExpandIteratorTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



Reply via email to