Author: sseifert
Date: Thu Nov 17 18:03:45 2016
New Revision: 1770253

URL: http://svn.apache.org/viewvc?rev=1770253&view=rev
Log:
SLING-6137 Context-Aware Config: Configuration Manager - Support resource 
collection and property inheritance

Modified:
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationData.java
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ValueInfo.java
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.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/management/impl/ValueInfoImpl.java
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/package-info.java
    
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImplTest.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/management/impl/ValueInfoImplTest.java

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationData.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationData.java?rev=1770253&r1=1770252&r2=1770253&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationData.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationData.java
 Thu Nov 17 18:03:45 2016
@@ -31,15 +31,25 @@ import org.osgi.annotation.versioning.Pr
  */
 @ProviderType
 public interface ConfigurationData {
+    
+    /**
+     * Path of the configuration resource. The resource may not exist, in this 
case
+     * inherited or default values may be returned.
+     * If the configuration data is saved, this path is used.
+     * @return Configuration resource path or null if it cannot be determined
+     */
+    @CheckForNull String getResourcePath();
 
     /**
-     * List of property names defined in configuration metadata or values are 
defined for.
+     * List of effective property names defined in configuration metadata or 
values are defined for.
      * @return Property names
      */
     @Nonnull Set<String> getPropertyNames();
 
     /**
      * Configuration values stored for the given context path. No inherited 
values. No default values.
+     * The properties of the resource identified by {@link #getResourcePath()} 
are returned.
+     * If this resources does not exist, the map is empty.
      * @return Values
      */
     @Nonnull ValueMap getValues();

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ValueInfo.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ValueInfo.java?rev=1770253&r1=1770252&r2=1770253&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ValueInfo.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ValueInfo.java
 Thu Nov 17 18:03:45 2016
@@ -19,6 +19,7 @@
 package org.apache.sling.caconfig.management;
 
 import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
 
 import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
 import org.osgi.annotation.versioning.ProviderType;
@@ -31,6 +32,12 @@ import org.osgi.annotation.versioning.Pr
 public interface ValueInfo<T> {
 
     /**
+     * Property name.
+     * @return Property name.
+     */
+    @Nonnull String getName();
+    
+    /**
      * Property metadata.
      * @return Property metadata. Null if no metadata exists.
      */
@@ -62,8 +69,7 @@ public interface ValueInfo<T> {
     /**
      * @return true if the value is not defined for the current context path 
but inherited from upper levels.
      */
-    // for future use
-    //boolean isInherited();
+    boolean isInherited();
     
     /**
      * @return true if the value is overridden by an configuration override 
provider.

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.java?rev=1770253&r1=1770252&r2=1770253&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.java
 Thu Nov 17 18:03:45 2016
@@ -20,10 +20,14 @@ package org.apache.sling.caconfig.manage
 
 import java.util.HashMap;
 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.IteratorUtils;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.api.wrappers.ValueMapDecorator;
 import org.apache.sling.caconfig.management.ConfigurationData;
@@ -33,22 +37,32 @@ import org.apache.sling.caconfig.spi.met
 
 final class ConfigurationDataImpl implements ConfigurationData {
     
-    private final ValueMap properties;
-    private final String configSourcePath;
     private final ConfigurationMetadata configMetadata;
+    private final Resource resolvedConfigurationResource;
+    private final Resource writebackConfigurationResource;
+    private final List<Resource> configurationResourceInheritanceChain;
     
-    public ConfigurationDataImpl(Resource configResource, 
ConfigurationMetadata configMetadata) {
-        this(configResource.getValueMap(), configResource.getPath(), 
configMetadata);
+    @SuppressWarnings("unchecked")
+    public ConfigurationDataImpl(ConfigurationMetadata configMetadata,
+            Resource resolvedConfigurationResource, Resource 
writebackConfigurationResource,
+            Iterator<Resource> configurationResourceInheritanceChain) {
+        this.configMetadata = configMetadata;
+        this.resolvedConfigurationResource = resolvedConfigurationResource;
+        this.writebackConfigurationResource = writebackConfigurationResource;
+        this.configurationResourceInheritanceChain = 
configurationResourceInheritanceChain != null
+                ? IteratorUtils.toList(configurationResourceInheritanceChain) 
: null;
     }
 
     public ConfigurationDataImpl(ConfigurationMetadata configMetadata) {
-        this(ValueMap.EMPTY, null, configMetadata);
+        this(configMetadata, null, null, null);
     }
 
-    private ConfigurationDataImpl(ValueMap propertes, String configSourcePath, 
ConfigurationMetadata configMetadata) {
-        this.properties = propertes;
-        this.configSourcePath = configSourcePath;
-        this.configMetadata = configMetadata;
+    @Override
+    public String getResourcePath() {
+        if (writebackConfigurationResource != null) {
+            return writebackConfigurationResource.getPath();
+        }
+        return null;
     }
 
     @Override
@@ -57,13 +71,18 @@ final class ConfigurationDataImpl implem
         if (configMetadata != null) {
             
propertyNames.addAll(configMetadata.getPropertyMetadata().keySet());
         }
-        propertyNames.addAll(properties.keySet());
+        if (resolvedConfigurationResource != null) {
+            
propertyNames.addAll(ResourceUtil.getValueMap(resolvedConfigurationResource).keySet());
+        }
         return propertyNames;
     }
 
     @Override
     public ValueMap getValues() {
-        return properties;
+        if (writebackConfigurationResource != null) {
+            return ResourceUtil.getValueMap(writebackConfigurationResource);
+        }
+        return ValueMap.EMPTY;
     }
 
     @Override
@@ -76,7 +95,9 @@ final class ConfigurationDataImpl implem
                 }
             }
         }
-        props.putAll(properties);
+        if (resolvedConfigurationResource != null) {
+            
props.putAll(ResourceUtil.getValueMap(resolvedConfigurationResource));
+        }
         return new ValueMapDecorator(props);
     }
 
@@ -85,13 +106,18 @@ final class ConfigurationDataImpl implem
     public ValueInfo<?> getValueInfo(String propertyName) {
         PropertyMetadata propertyMetadata = configMetadata != null ? 
configMetadata.getPropertyMetadata().get(propertyName) : null;
         Object value;
+        ValueMap properties = 
ResourceUtil.getValueMap(resolvedConfigurationResource);
         if (propertyMetadata != null) {
             value = properties.get(propertyName, propertyMetadata.getType());
         }
         else {
             value = properties.get(propertyName);
         }
-        return new ValueInfoImpl(value, configSourcePath, propertyMetadata);
+        return new ValueInfoImpl(propertyName, value,
+                propertyMetadata,
+                resolvedConfigurationResource,
+                writebackConfigurationResource,
+                configurationResourceInheritanceChain);
     }
 
 }

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=1770253&r1=1770252&r2=1770253&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
 Thu Nov 17 18:03:45 2016
@@ -22,14 +22,19 @@ import static org.apache.sling.caconfig.
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.collections.IteratorUtils;
+import org.apache.commons.collections.ResettableIterator;
+import org.apache.commons.collections.Transformer;
+import org.apache.commons.collections.iterators.ListIteratorWrapper;
 import org.apache.sling.api.resource.Resource;
+import 
org.apache.sling.caconfig.impl.ConfigurationInheritanceStrategyMultiplexer;
 import 
org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.management.ConfigurationData;
 import org.apache.sling.caconfig.management.ConfigurationManager;
-import org.apache.sling.caconfig.resource.ConfigurationResourceResolver;
 import 
org.apache.sling.caconfig.resource.impl.ConfigurationResourceResolvingStrategyMultiplexer;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceException;
 import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
@@ -40,20 +45,35 @@ import org.osgi.service.component.annota
 public class ConfigurationManagerImpl implements ConfigurationManager {
     
     @Reference
-    private ConfigurationResourceResolver configurationResourceResolver;
-    @Reference
     private ConfigurationResourceResolvingStrategyMultiplexer 
configurationResourceResolvingStrategy;
     @Reference
     private ConfigurationMetadataProviderMultiplexer 
configurationMetadataProvider;
     @Reference
     private ConfigurationPersistenceStrategyMultiplexer 
configurationPersistenceStrategy;
+    @Reference
+    private ConfigurationInheritanceStrategyMultiplexer 
configurationInheritanceStrategy;
 
+    @SuppressWarnings("unchecked")
     @Override
     public ConfigurationData get(Resource resource, String configName) {
         ConfigurationMetadata configMetadata = 
configurationMetadataProvider.getConfigurationMetadata(configName);
-        Resource configResource = 
configurationResourceResolver.getResource(resource, CONFIGS_PARENT_NAME, 
configName);
+        Iterator<Resource> configResourceInheritanceChain = 
configurationResourceResolvingStrategy
+                .getResourceInheritanceChain(resource, CONFIGS_PARENT_NAME, 
configName);
+        ResettableIterator resettableConfigResourceInheritanceChain = new 
ListIteratorWrapper(configResourceInheritanceChain);
+        Resource configResource = 
applyPersistenceAndInheritance(resettableConfigResourceInheritanceChain);
         if (configResource != null) {
-            return new 
ConfigurationDataImpl(configurationPersistenceStrategy.getResource(configResource),
 configMetadata);
+            // get writeback resource for "reverse inheritance detection"
+            Resource writebackConfigResource = null;
+            String writebackConfigResourcePath = 
configurationResourceResolvingStrategy.getResourcePath(resource, 
CONFIGS_PARENT_NAME, configName);
+            if (writebackConfigResourcePath != null) {
+                writebackConfigResource = 
configResource.getResourceResolver().getResource(writebackConfigResourcePath);
+                if (writebackConfigResource != null) {
+                    writebackConfigResource = 
configurationPersistenceStrategy.getResource(writebackConfigResource);
+                }
+            }
+            resettableConfigResourceInheritanceChain.reset();
+            return new ConfigurationDataImpl(configMetadata, configResource, 
writebackConfigResource,
+                    
applyPersistence(resettableConfigResourceInheritanceChain));
         }
         if (configMetadata != null) {
             // if no config resource found but config metadata exist return 
empty config data with default values
@@ -62,16 +82,63 @@ public class ConfigurationManagerImpl im
         return null;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public Collection<ConfigurationData> getCollection(Resource resource, 
String configName) {
         ConfigurationMetadata configMetadata = 
configurationMetadataProvider.getConfigurationMetadata(configName);
-        Collection<Resource> configResources = 
configurationResourceResolver.getResourceCollection(resource, 
CONFIGS_PARENT_NAME, configName);
+        String writebackConfigResourceCollectionParentPath = 
configurationResourceResolvingStrategy.getResourceCollectionParentPath(resource,
 CONFIGS_PARENT_NAME, configName);
         List<ConfigurationData> configData = new ArrayList<>();
-        for (Resource configResource : configResources) {
-            configData.add(new 
ConfigurationDataImpl(configurationPersistenceStrategy.getResource(configResource),
 configMetadata));
+
+        Collection<Iterator<Resource>> configResourceInheritanceChains = 
configurationResourceResolvingStrategy
+                .getResourceCollectionInheritanceChain(resource, 
CONFIGS_PARENT_NAME, configName);
+        for (Iterator<Resource> configResourceInheritanceChain : 
configResourceInheritanceChains) {
+            ResettableIterator resettableConfigResourceInheritanceChain = new 
ListIteratorWrapper(configResourceInheritanceChain);
+            Resource configResource = 
applyPersistenceAndInheritance(resettableConfigResourceInheritanceChain);
+            if (configResource != null) {
+                // get writeback resource for "reverse inheritance detection"
+                Resource writebackConfigResource = null;
+                if (writebackConfigResourceCollectionParentPath != null) {
+                    resettableConfigResourceInheritanceChain.reset();
+                    Resource untransformedConfigResource = 
(Resource)resettableConfigResourceInheritanceChain.next();
+                    writebackConfigResource = 
configResource.getResourceResolver().getResource(
+                            writebackConfigResourceCollectionParentPath + "/" 
+ untransformedConfigResource.getName());
+                    if (writebackConfigResource != null) {
+                        writebackConfigResource = 
configurationPersistenceStrategy.getResource(writebackConfigResource);
+                    }
+                }
+                resettableConfigResourceInheritanceChain.reset();
+                configData.add(new ConfigurationDataImpl(configMetadata, 
configResource, writebackConfigResource,
+                        
applyPersistence(resettableConfigResourceInheritanceChain)));
+            }
         }
         return configData;
     }
+    
+    @SuppressWarnings("unchecked")
+    private Iterator<Resource> applyPersistence(Iterator<Resource> 
configResourceInheritanceChain) {
+        if (configResourceInheritanceChain == null) {
+            return null;
+        }
+        return 
IteratorUtils.transformedIterator(configResourceInheritanceChain,
+                new Transformer() {
+                    @Override
+                    public Object transform(Object input) {
+                        return 
configurationPersistenceStrategy.getResource((Resource)input);
+                    }
+                });
+    }
+
+    private Resource applyPersistenceAndInheritance(Iterator<Resource> 
configResourceInheritanceChain) {
+        if (configResourceInheritanceChain == null) {
+            return null;
+        }
+        
+        // apply configuration persistence transformation
+        Iterator<Resource> transformedConfigResources = 
applyPersistence(configResourceInheritanceChain);
+        
+        // apply resource inheritance
+        return 
configurationInheritanceStrategy.getResource(transformedConfigResources);
+    }
 
     @Override
     public void persist(Resource resource, String configName, 
Map<String,Object> values) {

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ValueInfoImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ValueInfoImpl.java?rev=1770253&r1=1770252&r2=1770253&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ValueInfoImpl.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ValueInfoImpl.java
 Thu Nov 17 18:03:45 2016
@@ -18,24 +18,42 @@
  */
 package org.apache.sling.caconfig.management.impl;
 
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.resource.Resource;
 import org.apache.sling.caconfig.management.ValueInfo;
 import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
 
 final class ValueInfoImpl<T> implements ValueInfo<T> {
     
+    private final String name;
     private final T value;
     private final T defaultValue;
-    private final String configSourcePath;
     private final PropertyMetadata<T> propertyMetadata;
+    private final Resource resolvedConfigurationResource;
+    private final Resource writebackConfigurationResource;
+    private final List<Resource> configurationResourceInheritanceChain;
     
-    public ValueInfoImpl(T value, String configSourcePath, PropertyMetadata<T> 
propertyMetadata) {
+    public ValueInfoImpl(String name, T value, PropertyMetadata<T> 
propertyMetadata,
+            Resource resolvedConfigurationResource, Resource 
writebackConfigurationResource,
+            List<Resource> configurationResourceInheritanceChain) {
+        this.name = name;
         this.value = value;
         this.defaultValue = propertyMetadata != null ? 
propertyMetadata.getDefaultValue() : null;
-        this.configSourcePath = configSourcePath;
         this.propertyMetadata = propertyMetadata;
+        this.resolvedConfigurationResource = resolvedConfigurationResource;
+        this.writebackConfigurationResource = writebackConfigurationResource;
+        this.configurationResourceInheritanceChain = 
configurationResourceInheritanceChain;
     }
-
+    
+    @Override
+    public String getName() {
+        return name;
+    }
+ 
     @Override
     public PropertyMetadata<T> getPropertyMetadata() {
         return propertyMetadata;
@@ -53,7 +71,13 @@ final class ValueInfoImpl<T> implements
 
     @Override
     public String getConfigSourcePath() {
-        return configSourcePath;
+        if (value != null && resolvedConfigurationResource != null) {
+            Resource resource = getResourceFromInheritanceChain();
+            if (resource != null) {
+                return resource.getPath();
+            }
+        }
+        return null;
     }
 
     @Override
@@ -61,4 +85,47 @@ final class ValueInfoImpl<T> implements
         return value == null && defaultValue != null;
     }
 
+    @Override
+    public boolean isInherited() {
+        if (isDefault() || value == null) {
+            return false;
+        }
+        else if (resolvedConfigurationResource == null) {
+            return false;
+        }
+        else if (writebackConfigurationResource == null) {
+            return true;
+        }
+        else if (!StringUtils.equals(resolvedConfigurationResource.getPath(), 
writebackConfigurationResource.getPath())) {
+            return true;
+        }
+        else {
+            Resource inheritanceSource = getResourceFromInheritanceChain();
+            if (inheritanceSource != null) {
+                return 
!StringUtils.equals(resolvedConfigurationResource.getPath(), 
inheritanceSource.getPath());
+            }
+            else {
+                return false;
+            }
+        }
+    }
+    
+    private Resource getResourceFromInheritanceChain() {
+        if (configurationResourceInheritanceChain == null) {
+            return null;
+        }
+        return 
getResourceFromInheritanceChain(configurationResourceInheritanceChain.iterator());
+    }
+
+    private Resource getResourceFromInheritanceChain(Iterator<Resource> 
inheritanceChain) {
+        if (!inheritanceChain.hasNext()) {
+            return null;
+        }
+        Resource resource = inheritanceChain.next();
+        Object valueFromResource = resource.getValueMap().get(name, 
value.getClass());
+        if (valueFromResource != null) {
+            return resource;
+        }
+        return getResourceFromInheritanceChain(inheritanceChain);
+    }
 }

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/package-info.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/package-info.java?rev=1770253&r1=1770252&r2=1770253&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/package-info.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/package-info.java
 Thu Nov 17 18:03:45 2016
@@ -21,5 +21,5 @@
  * This API is only indented for advanced use cases like writing a 
configuration editor,
  * not for "normal" applications just reading configuration.
  */
[email protected]("1.0.0")
[email protected]("1.1.0")
 package org.apache.sling.caconfig.management;

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImplTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImplTest.java?rev=1770253&r1=1770252&r2=1770253&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImplTest.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImplTest.java
 Thu Nov 17 18:03:45 2016
@@ -44,7 +44,6 @@ public class ConfigurationDataImplTest {
     private Resource configResource;
     private ConfigurationMetadata configMetadata;
     
-    
     @Before
     public void setUp() {
         configResource = context.create().resource("/conf/test",
@@ -59,8 +58,9 @@ public class ConfigurationDataImplTest {
 
     @Test
     public void testWithResourceMetadata() {
-        ConfigurationData underTest = new 
ConfigurationDataImpl(configResource, configMetadata);
+        ConfigurationData underTest = new 
ConfigurationDataImpl(configMetadata, configResource, configResource, null);
         
+        assertEquals(configResource.getPath(), underTest.getResourcePath());
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3", "prop4"), 
underTest.getPropertyNames());
         
         ValueMap values = underTest.getValues();
@@ -93,7 +93,7 @@ public class ConfigurationDataImplTest {
 
     @Test
     public void testWithResourceOnly() {
-        ConfigurationData underTest = new 
ConfigurationDataImpl(configResource, null);
+        ConfigurationData underTest = new ConfigurationDataImpl(null, 
configResource, configResource, null);
         
         assertEquals(ImmutableSet.of("prop1", "prop4"), 
underTest.getPropertyNames());
         

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=1770253&r1=1770252&r2=1770253&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
 Thu Nov 17 18:03:45 2016
@@ -19,11 +19,14 @@
 package org.apache.sling.caconfig.management.impl;
 
 import static 
org.apache.sling.caconfig.impl.ConfigurationNameConstants.CONFIGS_PARENT_NAME;
+import static 
org.apache.sling.caconfig.impl.def.ConfigurationDefNameConstants.PROPERTY_CONFIG_PROPERTY_INHERIT;
+import static 
org.apache.sling.caconfig.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_COLLECTION_INHERIT;
+import static 
org.apache.sling.caconfig.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_REF;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.when;
 
 import java.util.List;
@@ -31,13 +34,10 @@ import java.util.Map;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
-import 
org.apache.sling.caconfig.impl.def.DefaultConfigurationPersistenceStrategy;
+import org.apache.sling.caconfig.impl.ConfigurationTestUtils;
 import 
org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.management.ConfigurationData;
 import org.apache.sling.caconfig.management.ConfigurationManager;
-import org.apache.sling.caconfig.resource.ConfigurationResourceResolver;
-import 
org.apache.sling.caconfig.resource.impl.ConfigurationResourceResolvingStrategyMultiplexer;
-import 
org.apache.sling.caconfig.resource.spi.ConfigurationResourceResolvingStrategy;
 import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
 import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
 import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
@@ -60,55 +60,74 @@ public class ConfigurationManagerImplTes
     public SlingContext context = new SlingContext();
 
     @Mock
-    private ConfigurationResourceResolver configurationResourceResolver;
-    @Mock
-    private ConfigurationResourceResolvingStrategy 
configurationResourceResolvingStrategy;
-    @Mock
     private ConfigurationMetadataProvider configurationMetadataProvider;
     
     private ConfigurationManager underTest;
     
     private Resource contextResource;
-    protected Resource configResource;
-    protected Resource configResourceItem1;
-    protected Resource configResourceItem2;
+    private Resource contextResourceLevel2;
+    private Resource contextResourceLevel3;
+    private Resource contextResourceNoConfig;
     private ConfigurationMetadata configMetadata;
     
-    private static final String CONFIG_NAME = "testConfigName";
-    
+    private static final String CONFIG_NAME = "testConfig";
+    private static final String CONFIG_COL_NAME = "testConfigCol";
+   
     @Before
     public void setUp() {
-        context.registerService(ConfigurationResourceResolver.class, 
configurationResourceResolver);
-        context.registerService(ConfigurationResourceResolvingStrategy.class, 
configurationResourceResolvingStrategy);
         context.registerService(ConfigurationMetadataProvider.class, 
configurationMetadataProvider);
-        context.registerInjectActivateService(new 
ConfigurationResourceResolvingStrategyMultiplexer());
         context.registerInjectActivateService(new 
ConfigurationMetadataProviderMultiplexer());
-        context.registerInjectActivateService(new 
DefaultConfigurationPersistenceStrategy());
-        context.registerInjectActivateService(new 
ConfigurationPersistenceStrategyMultiplexer());
+        ConfigurationTestUtils.registerConfigurationResolver(context);
         underTest = context.registerInjectActivateService(new 
ConfigurationManagerImpl());
         
-        contextResource = context.create().resource("/content/test");
+        contextResource = context.create().resource("/content/test",
+                PROPERTY_CONFIG_REF, "/conf/test");
+        contextResourceLevel2 = 
context.create().resource("/content/test/level2",
+                PROPERTY_CONFIG_REF, "/conf/test/level2");
+        contextResourceLevel3 = 
context.create().resource("/content/test/level2/level3",
+                PROPERTY_CONFIG_REF, "/conf/test/level2/level3");
+        contextResourceNoConfig = 
context.create().resource("/content/testNoConfig",
+                PROPERTY_CONFIG_REF, "/conf/testNoConfig");
         
-        context.create().resource(getConfigPropertiesPath("/conf/test"),
+        context.create().resource(getConfigPropertiesPath("/conf/test/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_NAME),
                 "prop1", "value1",
                 "prop4", true);
-        context.create().resource(getConfigPropertiesPath("/conf/item/1"),
+        context.create().resource(getConfigPropertiesPath("/conf/test/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME + "/1"),
                 "prop1", "value1");
-        context.create().resource(getConfigPropertiesPath("/conf/item/2"),
+        context.create().resource(getConfigPropertiesPath("/conf/test/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME + "/2"),
                 "prop4", true);
-
-        configResource = context.resourceResolver().getResource("/conf/test");
-        configResourceItem1 = 
context.resourceResolver().getResource("/conf/item/1");
-        configResourceItem2 = 
context.resourceResolver().getResource("/conf/item/2");
         
+        // test fixture with resource collection inheritance on level 2
+        context.create().resource("/conf/test/level2/" + CONFIGS_PARENT_NAME + 
"/" + CONFIG_COL_NAME,
+                PROPERTY_CONFIG_COLLECTION_INHERIT, true);
+        context.create().resource(getConfigPropertiesPath("/conf/test/level2/" 
+ CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME + "/1"),
+                "prop1", "value1_level2");
+        
+        // test fixture with property inheritance and resource collection 
inheritance on level 3
+        
context.create().resource(getConfigPropertiesPath("/conf/test/level2/level3/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_NAME),
+                "prop4", false,
+                "prop5", "value5_level3",
+                PROPERTY_CONFIG_PROPERTY_INHERIT, true);
+        context.create().resource("/conf/test/level2/level3/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME,
+                PROPERTY_CONFIG_COLLECTION_INHERIT, true);
+        
context.create().resource(getConfigPropertiesPath("/conf/test/level2/level3/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME + "/1"),
+                "prop4", false,
+                "prop5", "value5_level3",
+                PROPERTY_CONFIG_PROPERTY_INHERIT, true);
+
         configMetadata = new ConfigurationMetadata(CONFIG_NAME);
         
configMetadata.setPropertyMetadata(ImmutableMap.<String,PropertyMetadata<?>>of(
                 "prop1", new PropertyMetadata<>("prop1", "defValue"),
                 "prop2", new PropertyMetadata<>("prop2", String.class),
                 "prop3", new PropertyMetadata<>("prop3", 5)));
+        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(configMetadata);
 
-        
when(configurationResourceResolver.getResourceCollection(any(Resource.class), 
anyString(), anyString()))
-                .thenReturn(ImmutableList.<Resource>of());
+        configMetadata = new ConfigurationMetadata(CONFIG_COL_NAME);
+        
configMetadata.setPropertyMetadata(ImmutableMap.<String,PropertyMetadata<?>>of(
+                "prop1", new PropertyMetadata<>("prop1", "defValue"),
+                "prop2", new PropertyMetadata<>("prop2", String.class),
+                "prop3", new PropertyMetadata<>("prop3", 5)));
+        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_COL_NAME)).thenReturn(configMetadata);
     }
     
     protected String getConfigPropertiesPath(String path) {
@@ -117,32 +136,82 @@ public class ConfigurationManagerImplTes
     
     @Test
     public void testGet() {
-        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(configMetadata);
-        when(configurationResourceResolver.getResource(contextResource, 
CONFIGS_PARENT_NAME, CONFIG_NAME)).thenReturn(configResource);
-
         ConfigurationData configData = underTest.get(contextResource, 
CONFIG_NAME);
         assertNotNull(configData);
 
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3", "prop4"), 
configData.getPropertyNames());
         assertEquals("value1", configData.getValues().get("prop1", 
String.class));
         assertEquals((Integer)5, configData.getEffectiveValues().get("prop3", 
0));
+
+        assertFalse(configData.getValueInfo("prop1").isInherited());
+        assertFalse(configData.getValueInfo("prop3").isInherited());
     }
 
     @Test
-    public void testGet_NoConfigResource() {
-        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(configMetadata);
+    public void testGet_WithResourceInheritance() {
+        ConfigurationData configData = underTest.get(contextResourceLevel2, 
CONFIG_NAME);
+        assertNotNull(configData);
 
-        ConfigurationData configData = underTest.get(contextResource, 
CONFIG_NAME);
+        assertEquals(ImmutableSet.of("prop1", "prop2", "prop3", "prop4"), 
configData.getPropertyNames());
+        assertNull(configData.getValues().get("prop1", String.class));
+        assertEquals("value1", configData.getEffectiveValues().get("prop1", 
String.class));
+        assertEquals((Integer)5, configData.getEffectiveValues().get("prop3", 
0));
+
+        String configPath = getConfigPropertiesPath("/conf/test/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_NAME);
+        assertEquals(configPath, 
configData.getValueInfo("prop1").getConfigSourcePath());
+        assertTrue(configData.getValueInfo("prop1").isInherited());
+        assertFalse(configData.getValueInfo("prop3").isInherited());
+        assertNull(configData.getValueInfo("prop3").getConfigSourcePath());
+    }
+
+    @Test
+    public void testGet_WithPropertyInheritance() {
+        ConfigurationData configData = underTest.get(contextResourceLevel3, 
CONFIG_NAME);
+        assertNotNull(configData);
+
+        
assertTrue(configData.getPropertyNames().containsAll(ImmutableSet.of("prop1", 
"prop2", "prop3", "prop4", "prop5")));
+        assertNull(configData.getValues().get("prop1", String.class));
+        assertNull(configData.getValues().get("prop2", String.class));
+        assertNull(configData.getValues().get("prop3", Integer.class));
+        assertFalse(configData.getValues().get("prop4", Boolean.class));
+        assertEquals("value5_level3", configData.getValues().get("prop5", 
String.class));
+        
+        assertEquals("value1", configData.getEffectiveValues().get("prop1", 
String.class));
+        assertNull(configData.getEffectiveValues().get("prop2", String.class));
+        assertEquals((Integer)5, configData.getEffectiveValues().get("prop3", 
0));
+        assertFalse(configData.getEffectiveValues().get("prop4", 
Boolean.class));
+        assertEquals("value5_level3", 
configData.getEffectiveValues().get("prop5", String.class));
+
+        String configPath = getConfigPropertiesPath("/conf/test/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_NAME);
+        String configPathLevel3 = 
getConfigPropertiesPath("/conf/test/level2/level3/" + CONFIGS_PARENT_NAME + "/" 
+ CONFIG_NAME);
+        assertTrue(configData.getValueInfo("prop1").isInherited());
+        assertEquals(configPath, 
configData.getValueInfo("prop1").getConfigSourcePath());
+        assertFalse(configData.getValueInfo("prop2").isInherited());
+        assertNull(configData.getValueInfo("prop2").getConfigSourcePath());
+        assertFalse(configData.getValueInfo("prop3").isInherited());
+        assertNull(configData.getValueInfo("prop3").getConfigSourcePath());
+        assertFalse(configData.getValueInfo("prop4").isInherited());
+        assertEquals(configPathLevel3, 
configData.getValueInfo("prop4").getConfigSourcePath());
+        assertFalse(configData.getValueInfo("prop5").isInherited());
+        assertEquals(configPathLevel3, 
configData.getValueInfo("prop5").getConfigSourcePath());
+    }
+
+    @Test
+    public void testGet_NoConfigResource() {
+        ConfigurationData configData = underTest.get(contextResourceNoConfig, 
CONFIG_NAME);
         assertNotNull(configData);
 
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3"), 
configData.getPropertyNames());
         assertNull(configData.getValues().get("prop1", String.class));
         assertEquals((Integer)5, configData.getEffectiveValues().get("prop3", 
0));
+
+        assertFalse(configData.getValueInfo("prop1").isInherited());
+        assertFalse(configData.getValueInfo("prop3").isInherited());
     }
 
     @Test
     public void testGet_NoConfigMetadata() {
-        when(configurationResourceResolver.getResource(contextResource, 
CONFIGS_PARENT_NAME, CONFIG_NAME)).thenReturn(configResource);
+        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(null);
 
         ConfigurationData configData = underTest.get(contextResource, 
CONFIG_NAME);
         assertNotNull(configData);
@@ -150,48 +219,127 @@ public class ConfigurationManagerImplTes
         assertEquals(ImmutableSet.of("prop1", "prop4"), 
configData.getPropertyNames());
         assertEquals("value1", configData.getValues().get("prop1", 
String.class));
         assertEquals((Integer)0, configData.getEffectiveValues().get("prop3", 
0));
+
+        assertFalse(configData.getValueInfo("prop1").isInherited());
+        assertFalse(configData.getValueInfo("prop3").isInherited());
     }
 
     @Test
     public void testGet_NoConfigResource_NoConfigMetadata() {
-        ConfigurationData configData = underTest.get(contextResource, 
CONFIG_NAME);
+        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(null);
+
+        ConfigurationData configData = underTest.get(contextResourceNoConfig, 
CONFIG_NAME);
         assertNull(configData);
     }
 
     @Test
     public void testGetCollection() {
-        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(configMetadata);
-        
when(configurationResourceResolver.getResourceCollection(contextResource, 
CONFIGS_PARENT_NAME, CONFIG_NAME))
-            .thenReturn(ImmutableList.of(configResourceItem1, 
configResourceItem2));
+        List<ConfigurationData> configDatas = 
ImmutableList.copyOf(underTest.getCollection(contextResource, CONFIG_COL_NAME));
+        assertEquals(2, configDatas.size());
+
+        ConfigurationData configData1 = configDatas.get(0);
+        assertEquals(ImmutableSet.of("prop1", "prop2", "prop3"), 
configData1.getPropertyNames());
+        assertEquals("value1", configData1.getValues().get("prop1", 
String.class));
+        assertEquals((Integer)5, configData1.getEffectiveValues().get("prop3", 
0));
+
+        assertFalse(configData1.getValueInfo("prop1").isInherited());
+        assertFalse(configData1.getValueInfo("prop3").isInherited());
         
-        List<ConfigurationData> configDatas = 
ImmutableList.copyOf(underTest.getCollection(contextResource, CONFIG_NAME));
+        ConfigurationData configData2 = configDatas.get(1);
+        assertEquals(ImmutableSet.of("prop1", "prop2", "prop3", "prop4"), 
configData2.getPropertyNames());
+        assertNull(configData2.getValues().get("prop1", String.class));
+        assertEquals((Integer)5, configData2.getEffectiveValues().get("prop3", 
0));
+
+        assertFalse(configData2.getValueInfo("prop1").isInherited());
+        assertFalse(configData2.getValueInfo("prop3").isInherited());
+    }
+
+    @Test
+    public void testGetCollection_WithResourceCollectionInheritance() {
+        List<ConfigurationData> configDatas = 
ImmutableList.copyOf(underTest.getCollection(contextResourceLevel2, 
CONFIG_COL_NAME));
         assertEquals(2, configDatas.size());
         
         ConfigurationData configData1 = configDatas.get(0);
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3"), 
configData1.getPropertyNames());
-        assertEquals("value1", configData1.getValues().get("prop1", 
String.class));
+        assertEquals("value1_level2", configData1.getValues().get("prop1", 
String.class));
+        assertEquals("value1_level2", 
configData1.getEffectiveValues().get("prop1", String.class));
         assertEquals((Integer)5, configData1.getEffectiveValues().get("prop3", 
0));
 
+        String configPath1 = getConfigPropertiesPath("/conf/test/level2/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME + "/1");
+        assertFalse(configData1.getValueInfo("prop1").isInherited());
+        assertEquals(configPath1, 
configData1.getValueInfo("prop1").getConfigSourcePath());
+        assertFalse(configData1.getValueInfo("prop3").isInherited());
+        assertNull(configData1.getValueInfo("prop3").getConfigSourcePath());
+        
         ConfigurationData configData2 = configDatas.get(1);
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3", "prop4"), 
configData2.getPropertyNames());
         assertNull(configData2.getValues().get("prop1", String.class));
         assertEquals((Integer)5, configData2.getEffectiveValues().get("prop3", 
0));
+
+        String configPath2 = getConfigPropertiesPath("/conf/test/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME + "/2");
+        assertTrue(configData2.getValueInfo("prop4").isInherited());
+        assertEquals(configPath2, 
configData2.getValueInfo("prop4").getConfigSourcePath());
+        assertFalse(configData2.getValueInfo("prop3").isInherited());
+        assertNull(configData2.getValueInfo("prop3").getConfigSourcePath());
     }
 
     @Test
-    public void testGetCollection_NoConfigResources() {
-        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(configMetadata);
+    public void 
testGetCollection_WithResourceCollectionAndPropertyInheritance() {
+        List<ConfigurationData> configDatas = 
ImmutableList.copyOf(underTest.getCollection(contextResourceLevel3, 
CONFIG_COL_NAME));
+        assertEquals(2, configDatas.size());
+        
+        ConfigurationData configData1 = configDatas.get(0);
+        
assertTrue(configData1.getPropertyNames().containsAll(ImmutableSet.of("prop1", 
"prop2", "prop3", "prop4", "prop5")));
+
+        
assertTrue(configData1.getPropertyNames().containsAll(ImmutableSet.of("prop1", 
"prop2", "prop3", "prop4", "prop5")));
+        assertNull(configData1.getValues().get("prop1", String.class));
+        assertNull(configData1.getValues().get("prop2", String.class));
+        assertNull(configData1.getValues().get("prop3", Integer.class));
+        assertFalse(configData1.getValues().get("prop4", Boolean.class));
+        assertEquals("value5_level3", configData1.getValues().get("prop5", 
String.class));
         
-        List<ConfigurationData> configDatas = 
ImmutableList.copyOf(underTest.getCollection(contextResource, CONFIG_NAME));
+        assertEquals("value1_level2", 
configData1.getEffectiveValues().get("prop1", String.class));
+        assertNull(configData1.getEffectiveValues().get("prop2", 
String.class));
+        assertEquals((Integer)5, configData1.getEffectiveValues().get("prop3", 
0));
+        assertFalse(configData1.getEffectiveValues().get("prop4", 
Boolean.class));
+        assertEquals("value5_level3", 
configData1.getEffectiveValues().get("prop5", String.class));
+
+        String configPathLevel2 = getConfigPropertiesPath("/conf/test/level2/" 
+ CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME + "/1");
+        String configPathLevel3 = 
getConfigPropertiesPath("/conf/test/level2/level3/" + CONFIGS_PARENT_NAME + "/" 
+ CONFIG_COL_NAME + "/1");
+        assertTrue(configData1.getValueInfo("prop1").isInherited());
+        assertEquals(configPathLevel2, 
configData1.getValueInfo("prop1").getConfigSourcePath());
+        assertFalse(configData1.getValueInfo("prop2").isInherited());
+        assertNull(configData1.getValueInfo("prop2").getConfigSourcePath());
+        assertFalse(configData1.getValueInfo("prop3").isInherited());
+        assertNull(configData1.getValueInfo("prop3").getConfigSourcePath());
+        assertFalse(configData1.getValueInfo("prop4").isInherited());
+        assertEquals(configPathLevel3, 
configData1.getValueInfo("prop4").getConfigSourcePath());
+        assertFalse(configData1.getValueInfo("prop5").isInherited());
+        assertEquals(configPathLevel3, 
configData1.getValueInfo("prop5").getConfigSourcePath());
+                
+        ConfigurationData configData2 = configDatas.get(1);
+        assertEquals(ImmutableSet.of("prop1", "prop2", "prop3", "prop4"), 
configData2.getPropertyNames());
+        assertNull(configData2.getValues().get("prop1", String.class));
+        assertEquals((Integer)5, configData2.getEffectiveValues().get("prop3", 
0));
+
+        String configPath2 = getConfigPropertiesPath("/conf/test/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME + "/2");
+        assertTrue(configData2.getValueInfo("prop4").isInherited());
+        assertEquals(configPath2, 
configData2.getValueInfo("prop4").getConfigSourcePath());
+        assertFalse(configData2.getValueInfo("prop3").isInherited());
+        assertNull(configData2.getValueInfo("prop3").getConfigSourcePath());
+    }
+
+    @Test
+    public void testGetCollection_NoConfigResources() {
+        List<ConfigurationData> configDatas = 
ImmutableList.copyOf(underTest.getCollection(contextResourceNoConfig, 
CONFIG_COL_NAME));
         assertEquals(0, configDatas.size());
     }
 
     @Test
     public void testGetCollection_NoConfigMetadata() {
-        
when(configurationResourceResolver.getResourceCollection(contextResource, 
CONFIGS_PARENT_NAME, CONFIG_NAME))
-            .thenReturn(ImmutableList.of(configResourceItem1, 
configResourceItem2));
+        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_COL_NAME)).thenReturn(null);
         
-        List<ConfigurationData> configDatas = 
ImmutableList.copyOf(underTest.getCollection(contextResource, CONFIG_NAME));
+        List<ConfigurationData> configDatas = 
ImmutableList.copyOf(underTest.getCollection(contextResource, CONFIG_COL_NAME));
         assertEquals(2, configDatas.size());
         
         ConfigurationData configData1 = configDatas.get(0);
@@ -199,60 +347,66 @@ public class ConfigurationManagerImplTes
         assertEquals("value1", configData1.getValues().get("prop1", 
String.class));
         assertEquals((Integer)0, configData1.getEffectiveValues().get("prop3", 
0));
 
+        assertFalse(configData1.getValueInfo("prop1").isInherited());
+        assertFalse(configData1.getValueInfo("prop3").isInherited());
+
         ConfigurationData configData2 = configDatas.get(1);
         assertEquals(ImmutableSet.of("prop4"), configData2.getPropertyNames());
         assertNull(configData2.getValues().get("prop1", String.class));
         assertEquals((Integer)0, configData2.getEffectiveValues().get("prop3", 
0));
+
+        assertFalse(configData2.getValueInfo("prop1").isInherited());
+        assertFalse(configData2.getValueInfo("prop3").isInherited());
     }
 
     @Test
     public void testGetCollection_NoConfigResources_NoConfigMetadata() {
-        List<ConfigurationData> configDatas = 
ImmutableList.copyOf(underTest.getCollection(contextResource, CONFIG_NAME));
+        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_COL_NAME)).thenReturn(null);
+
+        List<ConfigurationData> configDatas = 
ImmutableList.copyOf(underTest.getCollection(contextResourceNoConfig, 
CONFIG_COL_NAME));
         assertEquals(0, configDatas.size());
     }
 
     @Test
     public void testPersist() throws Exception {
-        
when(configurationResourceResolvingStrategy.getResourcePath(contextResource, 
CONFIGS_PARENT_NAME, CONFIG_NAME))
-            .thenReturn("/conf/new");
-        
-        underTest.persist(contextResource, CONFIG_NAME,
+        underTest.persist(contextResourceNoConfig, CONFIG_NAME,
                 ImmutableMap.<String, Object>of("prop1", "value1"));
         context.resourceResolver().commit();
 
-        ValueMap props = 
context.resourceResolver().getResource(getConfigPropertiesPath("/conf/new")).getValueMap();
+        String configPath = getConfigPropertiesPath("/conf/testNoConfig/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_NAME);
+        ValueMap props = 
context.resourceResolver().getResource(configPath).getValueMap();
         assertEquals("value1", props.get("prop1"));
     }
 
     @Test
     public void testPersistCollection() throws Exception {
-        
when(configurationResourceResolvingStrategy.getResourceCollectionParentPath(contextResource,
 CONFIGS_PARENT_NAME, CONFIG_NAME))
-            .thenReturn("/conf/newcol");
-
-        underTest.persistCollection(contextResource, CONFIG_NAME, 
ImmutableList.<Map<String,Object>>of(
+        underTest.persistCollection(contextResourceNoConfig, CONFIG_COL_NAME, 
ImmutableList.<Map<String,Object>>of(
                 ImmutableMap.<String, Object>of("prop1", "value1"),
                 ImmutableMap.<String, Object>of("prop2", 5)
         ));
         context.resourceResolver().commit();
 
-        ValueMap props0 = 
context.resourceResolver().getResource(getConfigPropertiesPath("/conf/newcol/0")).getValueMap();
+        String configPath0 = getConfigPropertiesPath("/conf/testNoConfig/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME + "/0");
+        ValueMap props0 = 
context.resourceResolver().getResource(configPath0).getValueMap();
         assertEquals("value1", props0.get("prop1"));
-        ValueMap props1 = 
context.resourceResolver().getResource(getConfigPropertiesPath("/conf/newcol/1")).getValueMap();
+
+        String configPath1 = getConfigPropertiesPath("/conf/testNoConfig/" + 
CONFIGS_PARENT_NAME + "/" + CONFIG_COL_NAME + "/1");
+        ValueMap props1 = 
context.resourceResolver().getResource(configPath1).getValueMap();
         assertEquals((Integer)5, props1.get("prop2"));
     }
 
     @Test
     public void testNewCollectionItem() {
-        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(configMetadata);
-        
-        ConfigurationData newItem = underTest.newCollectionItem(CONFIG_NAME);
+        ConfigurationData newItem = 
underTest.newCollectionItem(CONFIG_COL_NAME);
         assertNotNull(newItem);
         assertEquals((Integer)5, newItem.getEffectiveValues().get("prop3", 0));
     }
 
     @Test
     public void testNewCollectionItem_NoConfigMetadata() {
-        ConfigurationData newItem = underTest.newCollectionItem(CONFIG_NAME);
+        
when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_COL_NAME)).thenReturn(null);
+
+        ConfigurationData newItem = 
underTest.newCollectionItem(CONFIG_COL_NAME);
         assertNull(newItem);
     }
 

Modified: 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ValueInfoImplTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ValueInfoImplTest.java?rev=1770253&r1=1770252&r2=1770253&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ValueInfoImplTest.java
 (original)
+++ 
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ValueInfoImplTest.java
 Thu Nov 17 18:03:45 2016
@@ -40,35 +40,41 @@ public class ValueInfoImplTest {
     
     @Test
     public void testValueMetadata() {
-        ValueInfo<String> underTest = new ValueInfoImpl<>("value", 
"/conf/test", propertyMetadata);
+        ValueInfo<String> underTest = new ValueInfoImpl<>("name1", "value", 
propertyMetadata, null, null, null);
         
+        assertEquals("name1", underTest.getName());
         assertSame(propertyMetadata, underTest.getPropertyMetadata());
         assertEquals("value", underTest.getValue());
         assertEquals("value", underTest.getEffectiveValue());
-        assertEquals("/conf/test", underTest.getConfigSourcePath());
+        assertNull(underTest.getConfigSourcePath());
         assertFalse(underTest.isDefault());
+        assertFalse(underTest.isInherited());
     }
 
     @Test
     public void testNoValueMetadata() {
-        ValueInfo<String> underTest = new ValueInfoImpl<>(null, "/conf/test", 
propertyMetadata);
+        ValueInfo<String> underTest = new ValueInfoImpl<>("name1", null, 
propertyMetadata, null, null, null);
         
+        assertEquals("name1", underTest.getName());
         assertSame(propertyMetadata, underTest.getPropertyMetadata());
         assertNull(underTest.getValue());
         assertEquals("defValue", underTest.getEffectiveValue());
-        assertEquals("/conf/test", underTest.getConfigSourcePath());
+        assertNull(underTest.getConfigSourcePath());
         assertTrue(underTest.isDefault());
+        assertFalse(underTest.isInherited());
     }
 
     @Test
     public void testValueNoMetadata() {
-        ValueInfo<String> underTest = new ValueInfoImpl<>("value", 
"/conf/test", null);
+        ValueInfo<String> underTest = new ValueInfoImpl<>("name1", "value", 
null, null, null, null);
         
+        assertEquals("name1", underTest.getName());
         assertNull(underTest.getPropertyMetadata());
         assertEquals("value", underTest.getValue());
         assertEquals("value", underTest.getEffectiveValue());
-        assertEquals("/conf/test", underTest.getConfigSourcePath());
+        assertNull(underTest.getConfigSourcePath());
         assertFalse(underTest.isDefault());
+        assertFalse(underTest.isInherited());
     }
 
 }


Reply via email to