You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2016/11/30 21:00:11 UTC

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

Author: sseifert
Date: Wed Nov 30 21:00:11 2016
New Revision: 1772117

URL: http://svn.apache.org/viewvc?rev=1772117&view=rev
Log:
SLING-6347 Context-Aware Config: Access to Inheritance Properties in Management API, SPI

Added:
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationCollectionData.java   (with props)
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImpl.java   (with props)
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImplTest.java   (with props)
    sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java   (with props)
    sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistData.java   (with props)
    sling/trunk/contrib/extensions/contextaware-config/spi/src/test/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistDataTest.java   (with props)
    sling/trunk/contrib/extensions/contextaware-config/spi/src/test/java/org/apache/sling/caconfig/spi/ConfigurationPersistDataTest.java   (with props)
Removed:
    sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ResourceCollectionItem.java
Modified:
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategy.java
    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/ConfigurationManager.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/ConfigurationPersistenceStrategyMultiplexer.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/console/ConfigurationWebConsolePlugin.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategyTest.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/ConfigurationManagerImplNoDefaultTest.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/ConfigurationPersistenceStrategyMultiplexerTest.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/CustomConfigurationPersistenceStrategy.java
    sling/trunk/contrib/extensions/contextaware-config/integration-tests/src/test/java/org/apache/sling/caconfig/it/ConfigurationManagerIT.java
    sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistenceStrategy.java

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategy.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategy.java?rev=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategy.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategy.java Wed Nov 30 21:00:11 2016
@@ -18,7 +18,6 @@
  */
 package org.apache.sling.caconfig.impl.def;
 
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
 
@@ -29,9 +28,10 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
+import org.apache.sling.caconfig.spi.ConfigurationPersistData;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceException;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceStrategy;
-import org.apache.sling.caconfig.spi.ResourceCollectionItem;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -82,26 +82,35 @@ public class DefaultConfigurationPersist
     }
 
     @Override
-    public boolean persist(ResourceResolver resourceResolver, String configResourcePath, Map<String,Object> properties) {
+    public boolean persist(ResourceResolver resourceResolver, String configResourcePath,
+            ConfigurationPersistData data) {
         if (!config.enabled()) {
             return false;
         }
-        getOrCreateResource(resourceResolver, configResourcePath, properties);
+        getOrCreateResource(resourceResolver, configResourcePath, data.getProperties());
         return true;
     }
 
     @Override
     public boolean persistCollection(ResourceResolver resourceResolver, String configResourceCollectionParentPath,
-            Collection<ResourceCollectionItem> resourceCollectionItems) {
+            ConfigurationCollectionPersistData data) {
         if (!config.enabled()) {
             return false;
         }
         Resource configResourceParent = getOrCreateResource(resourceResolver, configResourceCollectionParentPath, ValueMap.EMPTY);
+        
+        // delete existing children and create new ones
         deleteChildren(configResourceParent);
-        for (ResourceCollectionItem item : resourceCollectionItems) {
+        for (ConfigurationPersistData item : data.getItems()) {
             String path = configResourceParent.getPath() + "/" + item.getCollectionItemName();
-            getOrCreateResource(resourceResolver, path, item.getValues());
+            getOrCreateResource(resourceResolver, path, item.getProperties());
+        }
+        
+        // if resource collection parent properties are given replace them as well
+        if (data.getProperties() != null) {
+            replaceProperties(configResourceParent, data.getProperties());
         }
+        
         return true;
     }
     
@@ -130,9 +139,9 @@ public class DefaultConfigurationPersist
     
     private void replaceProperties(Resource resource, Map<String,Object> properties) {
         ModifiableValueMap modValueMap = resource.adaptTo(ModifiableValueMap.class);
-        // remove all existing properties that do not have jcr: or sling: namespace
+        // remove all existing properties that do not have jcr: namespace
         for (String propertyName : new HashSet<>(modValueMap.keySet())) {
-            if (StringUtils.startsWith(propertyName, "jcr:") || StringUtils.startsWith(propertyName, "sling:")) {
+            if (StringUtils.startsWith(propertyName, "jcr:")) {
                 continue;
             }
             modValueMap.remove(propertyName);

Added: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationCollectionData.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationCollectionData.java?rev=1772117&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationCollectionData.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationCollectionData.java Wed Nov 30 21:00:11 2016
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.caconfig.management;
+
+import java.util.Collection;
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+import org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * Provides access to the configuration collection data and metadata for a given context path.
+ */
+@ProviderType
+public interface ConfigurationCollectionData {
+
+    /**
+     * Get configuration name.
+     * @return Configuration name
+     */
+    @Nonnull String getConfigName();
+
+    /**
+     * @return Configuration collection items
+     */
+    @Nonnull Collection<ConfigurationData> getItems();
+    
+    /**
+     * @return Path of the configuration collection resource parent path or null if it cannot be determined.
+     */
+    @CheckForNull String getResourcePath();
+    
+    /**
+     * @return Properties for the configuration collection itself. Does not contain configuration data, but control data e.g. for enabling collection inheritance.
+     */
+    @Nonnull Map<String, Object> getProperties();
+    
+}

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

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationCollectionData.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Wed Nov 30 21:00:11 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

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

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=1772117&r1=1772116&r2=1772117&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 Wed Nov 30 21:00:11 2016
@@ -45,10 +45,7 @@ public interface ConfigurationData {
     @CheckForNull String getCollectionItemName();
 
     /**
-     * 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
+     * @return Path of the configuration resource or null if it cannot be determined.
      */
     @CheckForNull String getResourcePath();
 

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationManager.java?rev=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationManager.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/ConfigurationManager.java Wed Nov 30 21:00:11 2016
@@ -18,15 +18,14 @@
  */
 package org.apache.sling.caconfig.management;
 
-import java.util.Collection;
-import java.util.Map;
 import java.util.SortedSet;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.caconfig.spi.ResourceCollectionItem;
+import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
+import org.apache.sling.caconfig.spi.ConfigurationPersistData;
 import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
 import org.osgi.annotation.versioning.ProviderType;
 
@@ -44,7 +43,7 @@ public interface ConfigurationManager {
      * @param configName Configuration name
      * @return Configuration data. Is null when no configuration resource found and no configuration metadata exists.
      */
-    @CheckForNull ConfigurationData get(@Nonnull Resource resource, @Nonnull String configName);
+    @CheckForNull ConfigurationData getConfiguration(@Nonnull Resource resource, @Nonnull String configName);
 
     /**
      * Get configuration data collection for the given context resource and configuration name.
@@ -52,7 +51,7 @@ public interface ConfigurationManager {
      * @param configName Configuration name
      * @return Configuration data collection. Is empty when no configuration resources found.
      */
-    @Nonnull Collection<ConfigurationData> getCollection(@Nonnull Resource resource, @Nonnull String configName);
+    @Nonnull ConfigurationCollectionData getConfigurationCollection(@Nonnull Resource resource, @Nonnull String configName);
     
     /**
      * Write configuration to repository data using the inner-most context path as reference.
@@ -60,7 +59,8 @@ public interface ConfigurationManager {
      * @param configName Configuration name
      * @param values Values to be stored. All existing properties are erased and replaced with the new ones.
      */
-    void persist(@Nonnull Resource resource, @Nonnull String configName, @Nonnull Map<String,Object> values);
+    void persistConfiguration(@Nonnull Resource resource, @Nonnull String configName,
+            @Nonnull ConfigurationPersistData data);
 
     /**
      * Write configuration data collection using the inner-most context path as reference.
@@ -69,8 +69,8 @@ public interface ConfigurationManager {
      * @param resourceCollectionItems Resource collection items to be stored.
      *      All existing collection entries on this context path level are erased and replaced with the new ones.
      */
-    void persistCollection(@Nonnull Resource resource, @Nonnull String configName,
-            @Nonnull Collection<ResourceCollectionItem> resourceCollectionItems);
+    void persistConfigurationCollection(@Nonnull Resource resource, @Nonnull String configName,
+            @Nonnull ConfigurationCollectionPersistData data);
     
     /**
      * Creates a new empty configuration data item for a configuration data collection for the given configuration name.

Added: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImpl.java?rev=1772117&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImpl.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImpl.java Wed Nov 30 21:00:11 2016
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.caconfig.management.impl;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.sling.caconfig.management.ConfigurationCollectionData;
+import org.apache.sling.caconfig.management.ConfigurationData;
+
+final class ConfigurationCollectionDataImpl implements ConfigurationCollectionData {
+    
+    private final String configName;
+    private final Collection<ConfigurationData> items;
+    private final String resourcePath;
+    private final Map<String,Object> properties;
+    
+    public ConfigurationCollectionDataImpl(String configName, Collection<ConfigurationData> items,
+            String resourcePath, Map<String, Object> properties) {
+        this.configName = configName;
+        this.items = items;
+        this.resourcePath = resourcePath;
+        this.properties = properties;
+    }
+
+    @Override
+    public String getConfigName() {
+        return configName;
+    }
+
+    @Override
+    public Collection<ConfigurationData> getItems() {
+        return items;
+    }
+
+    @Override
+    public String getResourcePath() {
+        return resourcePath;
+    }
+
+    @Override
+    public Map<String, Object> getProperties() {
+        return properties;
+    }
+
+}

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

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImpl.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Wed Nov 30 21:00:11 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

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

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=1772117&r1=1772116&r2=1772117&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 Wed Nov 30 21:00:11 2016
@@ -33,7 +33,6 @@ import org.apache.sling.api.resource.Res
 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.impl.def.ConfigurationDefNameConstants;
 import org.apache.sling.caconfig.impl.override.ConfigurationOverrideManager;
 import org.apache.sling.caconfig.management.ConfigurationData;
 import org.apache.sling.caconfig.management.ConfigurationManager;
@@ -61,10 +60,7 @@ final class ConfigurationDataImpl implem
     private ValueMap effectiveValuesCache;
     
     private static final Set<String> PROPERTIES_TO_IGNORE = new HashSet<>(Arrays.asList(
-            "jcr:primaryType",
-            "sling:resourceType",
-            ConfigurationDefNameConstants.PROPERTY_CONFIG_PROPERTY_INHERIT
-            ));
+            "jcr:primaryType"));
     
     @SuppressWarnings("unchecked")
     public ConfigurationDataImpl(ConfigurationMetadata configMetadata,
@@ -200,14 +196,14 @@ final class ConfigurationDataImpl implem
                     nestedConfigName = configurationPersistenceStrategy.getResourcePath(configName) + "/" + nestedConfigMetadata.getName();
                 }
                 if (propertyMetadata.getType().equals(ConfigurationMetadata.class)) {
-                    ConfigurationData configData = configurationManager.get(contextResource, nestedConfigName);
+                    ConfigurationData configData = configurationManager.getConfiguration(contextResource, nestedConfigName);
                     if (configData != null) {
                         ((ConfigurationDataImpl)configData).setConfigMetadata(nestedConfigMetadata);
                     }
                     props.put(propertyMetadata.getName(), configData);
                 }
                 else if (propertyMetadata.getType().equals(ConfigurationMetadata[].class)) {
-                    Collection<ConfigurationData> configDatas = configurationManager.getCollection(contextResource, nestedConfigName);
+                    Collection<ConfigurationData> configDatas = configurationManager.getConfigurationCollection(contextResource, nestedConfigName).getItems();
                     for (ConfigurationData configData : configDatas) {
                         ((ConfigurationDataImpl)configData).setConfigMetadata(nestedConfigMetadata);
                     }

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=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java Wed Nov 30 21:00:11 2016
@@ -35,11 +35,13 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.caconfig.impl.ConfigurationInheritanceStrategyMultiplexer;
 import org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.impl.override.ConfigurationOverrideManager;
+import org.apache.sling.caconfig.management.ConfigurationCollectionData;
 import org.apache.sling.caconfig.management.ConfigurationData;
 import org.apache.sling.caconfig.management.ConfigurationManager;
 import org.apache.sling.caconfig.resource.impl.ConfigurationResourceResolvingStrategyMultiplexer;
+import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
+import org.apache.sling.caconfig.spi.ConfigurationPersistData;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceException;
-import org.apache.sling.caconfig.spi.ResourceCollectionItem;
 import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
@@ -60,7 +62,7 @@ public class ConfigurationManagerImpl im
 
     @SuppressWarnings("unchecked")
     @Override
-    public ConfigurationData get(Resource resource, String configName) {
+    public ConfigurationData getConfiguration(Resource resource, String configName) {
         ConfigurationMetadata configMetadata = configurationMetadataProvider.getConfigurationMetadata(configName);
         Resource configResource = null;
         Iterator<Resource> configResourceInheritanceChain = configurationResourceResolvingStrategy
@@ -94,11 +96,12 @@ public class ConfigurationManagerImpl im
 
     @SuppressWarnings("unchecked")
     @Override
-    public Collection<ConfigurationData> getCollection(Resource resource, String configName) {
+    public ConfigurationCollectionData getConfigurationCollection(Resource resource, String configName) {
         ConfigurationMetadata configMetadata = configurationMetadataProvider.getConfigurationMetadata(configName);
         String writebackConfigResourceCollectionParentPath = configurationResourceResolvingStrategy.getResourceCollectionParentPath(resource, CONFIGS_PARENT_NAME, configName);
         List<ConfigurationData> configData = new ArrayList<>();
 
+        // get configuration resource items
         Collection<Iterator<Resource>> configResourceInheritanceChains = configurationResourceResolvingStrategy
                 .getResourceCollectionInheritanceChain(resource, CONFIGS_PARENT_NAME, configName);
         if (configResourceInheritanceChains != null) {
@@ -125,7 +128,22 @@ public class ConfigurationManagerImpl im
                 }
             }
         }
-        return configData;
+        
+        // get properties of parent resource of the current level
+        Map<String,Object> resourceCollectionParentProps = null;
+        if (writebackConfigResourceCollectionParentPath != null) {
+            Resource writebackConfigResourceCollectionParent = resource.getResourceResolver().getResource(writebackConfigResourceCollectionParentPath);
+            if (writebackConfigResourceCollectionParent != null) {
+                resourceCollectionParentProps = writebackConfigResourceCollectionParent.getValueMap();
+            }
+        }
+        
+        return new ConfigurationCollectionDataImpl(
+                configName,
+                configData,
+                writebackConfigResourceCollectionParentPath,
+                resourceCollectionParentProps
+                );
     }
     
     @SuppressWarnings("unchecked")
@@ -158,23 +176,23 @@ public class ConfigurationManagerImpl im
     }
 
     @Override
-    public void persist(Resource resource, String configName, Map<String,Object> values) {
+    public void persistConfiguration(Resource resource, String configName, ConfigurationPersistData data) {
         String configResourcePath = configurationResourceResolvingStrategy.getResourcePath(resource, CONFIGS_PARENT_NAME, configName);
         if (configResourcePath == null) {
             throw new ConfigurationPersistenceException("Unable to persist configuration: Configuration resolving strategy returned no path.");
         }
-        if (!configurationPersistenceStrategy.persist(resource.getResourceResolver(), configResourcePath, values)) {
+        if (!configurationPersistenceStrategy.persist(resource.getResourceResolver(), configResourcePath, data)) {
             throw new ConfigurationPersistenceException("Unable to persist configuration: No persistence strategy found.");
         }
     }
 
     @Override
-    public void persistCollection(Resource resource, String configName, Collection<ResourceCollectionItem> resourceCollectionItems) {
+    public void persistConfigurationCollection(Resource resource, String configName, ConfigurationCollectionPersistData data) {
         String configResourceParentPath = configurationResourceResolvingStrategy.getResourceCollectionParentPath(resource, CONFIGS_PARENT_NAME, configName);
         if (configResourceParentPath == null) {
             throw new ConfigurationPersistenceException("Unable to persist configuration collection: Configuration resolving strategy returned no parent path.");
         }
-        if (!configurationPersistenceStrategy.persistCollection(resource.getResourceResolver(), configResourceParentPath, resourceCollectionItems)) {
+        if (!configurationPersistenceStrategy.persistCollection(resource.getResourceResolver(), configResourceParentPath, data)) {
             throw new ConfigurationPersistenceException("Unable to persist configuration: No persistence strategy found.");
         }
     }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationPersistenceStrategyMultiplexer.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationPersistenceStrategyMultiplexer.java?rev=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationPersistenceStrategyMultiplexer.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationPersistenceStrategyMultiplexer.java Wed Nov 30 21:00:11 2016
@@ -18,13 +18,13 @@
  */
 package org.apache.sling.caconfig.management.impl;
 
-import java.util.Collection;
 import java.util.Map;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
+import org.apache.sling.caconfig.spi.ConfigurationPersistData;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceStrategy;
-import org.apache.sling.caconfig.spi.ResourceCollectionItem;
 import org.apache.sling.commons.osgi.Order;
 import org.apache.sling.commons.osgi.RankedServices;
 import org.osgi.service.component.annotations.Component;
@@ -85,9 +85,10 @@ public class ConfigurationPersistenceStr
      * Persist configuration data with the first implementation that accepts it.
      */
     @Override
-    public boolean persist(ResourceResolver resourceResolver, String configResourcePath, Map<String,Object> properties) {
+    public boolean persist(ResourceResolver resourceResolver, String configResourcePath,
+            ConfigurationPersistData data) {
         for (ConfigurationPersistenceStrategy item : items) {
-            if (item.persist(resourceResolver, configResourcePath, properties)) {
+            if (item.persist(resourceResolver, configResourcePath, data)) {
                 return true;
             }
         }
@@ -99,9 +100,9 @@ public class ConfigurationPersistenceStr
      */
     @Override
     public boolean persistCollection(ResourceResolver resourceResolver, String configResourceCollectionParentPath,
-            Collection<ResourceCollectionItem> resourceCollectionItems) {
+            ConfigurationCollectionPersistData data) {
         for (ConfigurationPersistenceStrategy item : items) {
-            if (item.persistCollection(resourceResolver, configResourceCollectionParentPath, resourceCollectionItems)) {
+            if (item.persistCollection(resourceResolver, configResourceCollectionParentPath, data)) {
                 return true;
             }
         }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/console/ConfigurationWebConsolePlugin.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/console/ConfigurationWebConsolePlugin.java?rev=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/console/ConfigurationWebConsolePlugin.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/console/ConfigurationWebConsolePlugin.java Wed Nov 30 21:00:11 2016
@@ -165,10 +165,10 @@ public class ConfigurationWebConsolePlug
                 // resolve configuration
                 Collection<ConfigurationData> configDatas;
                 if (resourceCollection) {
-                    configDatas = configurationManager.getCollection(contentResource, configName);
+                    configDatas = configurationManager.getConfigurationCollection(contentResource, configName).getItems();
                 }
                 else {
-                    ConfigurationData configData = configurationManager.get(contentResource, configName);
+                    ConfigurationData configData = configurationManager.getConfiguration(contentResource, configName);
                     if (configData != null) {
                         configDatas = Collections.singletonList(configData);
                     }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategyTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategyTest.java?rev=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategyTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategyTest.java Wed Nov 30 21:00:11 2016
@@ -22,12 +22,15 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
+import org.apache.sling.caconfig.spi.ConfigurationPersistData;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceStrategy;
-import org.apache.sling.caconfig.spi.ResourceCollectionItem;
+import org.apache.sling.hamcrest.ResourceMatchers;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Rule;
 import org.junit.Test;
@@ -65,7 +68,7 @@ public class DefaultConfigurationPersist
         
         // store config data
         assertTrue(underTest.persist(context.resourceResolver(), "/conf/test",
-                ImmutableMap.<String,Object>of("prop1", "value1", "prop2", 5)));
+                new ConfigurationPersistData(ImmutableMap.<String,Object>of("prop1", "value1", "prop2", 5))));
         context.resourceResolver().commit();
         
         ValueMap props = context.resourceResolver().getResource("/conf/test").getValueMap();
@@ -73,7 +76,8 @@ public class DefaultConfigurationPersist
         assertEquals((Integer)5, props.get("prop2", Integer.class));
 
         // remove config data
-        assertTrue(underTest.persist(context.resourceResolver(), "/conf/test", ImmutableMap.<String,Object>of()));
+        assertTrue(underTest.persist(context.resourceResolver(), "/conf/test",
+                new ConfigurationPersistData(ImmutableMap.<String,Object>of())));
         context.resourceResolver().commit();
 
         props = context.resourceResolver().getResource("/conf/test").getValueMap();
@@ -87,10 +91,12 @@ public class DefaultConfigurationPersist
         ConfigurationPersistenceStrategy underTest = context.registerInjectActivateService(new DefaultConfigurationPersistenceStrategy());
         
         // store new config collection items
-        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/test", ImmutableList.of(
-                new ResourceCollectionItem("0", ImmutableMap.<String,Object>of("prop1", "value1")),
-                new ResourceCollectionItem("1", ImmutableMap.<String,Object>of("prop2", 5))
-        )));
+        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/test",
+                new ConfigurationCollectionPersistData(ImmutableList.of(
+                new ConfigurationPersistData(ImmutableMap.<String,Object>of("prop1", "value1")).collectionItemName("0"),
+                new ConfigurationPersistData(ImmutableMap.<String,Object>of("prop2", 5)).collectionItemName("1"))
+                ).properties(ImmutableMap.<String, Object>of("prop1", "abc", "sling:resourceType", "/a/b/c"))
+        ));
         context.resourceResolver().commit();
         
         Resource resource = context.resourceResolver().getResource("/conf/test");
@@ -99,9 +105,14 @@ public class DefaultConfigurationPersist
         assertEquals("value1", props0.get("prop1", String.class));
         ValueMap props1 = context.resourceResolver().getResource("/conf/test/1").getValueMap();
         assertEquals((Integer)5, props1.get("prop2", Integer.class));
+        
+        assertThat(resource, ResourceMatchers.props(
+                "prop1", "abc",
+                "sling:resourceType", "/a/b/c"));
 
         // remove config collection items
-        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/test", ImmutableList.<ResourceCollectionItem>of()));
+        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/test",
+                new ConfigurationCollectionPersistData(ImmutableList.<ConfigurationPersistData>of())));
         context.resourceResolver().commit();
 
         resource = context.resourceResolver().getResource("/conf/test");
@@ -117,8 +128,10 @@ public class DefaultConfigurationPersist
         assertNull(underTest.getResource(resource));
         assertNull(underTest.getResourcePath(resource.getPath()));
 
-        assertFalse(underTest.persist(context.resourceResolver(), "/conf/test", ImmutableMap.<String,Object>of()));
-        assertFalse(underTest.persistCollection(context.resourceResolver(), "/conf/test", ImmutableList.<ResourceCollectionItem>of()));
+        assertFalse(underTest.persist(context.resourceResolver(), "/conf/test",
+                new ConfigurationPersistData(ImmutableMap.<String,Object>of())));
+        assertFalse(underTest.persistCollection(context.resourceResolver(), "/conf/test",
+                new ConfigurationCollectionPersistData(ImmutableList.<ConfigurationPersistData>of())));
     }
 
 }

Added: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImplTest.java?rev=1772117&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImplTest.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImplTest.java Wed Nov 30 21:00:11 2016
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.caconfig.management.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.sling.caconfig.management.ConfigurationCollectionData;
+import org.apache.sling.caconfig.management.ConfigurationData;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ConfigurationCollectionDataImplTest {
+    
+    @Mock
+    private Collection<ConfigurationData> items;
+    @Mock
+    private Map<String, Object> props;
+
+    @Test
+    public void testProperties() {
+        ConfigurationCollectionData underTest = new ConfigurationCollectionDataImpl("name1", items, "/path1", props);
+        
+        assertEquals("name1", underTest.getConfigName());;
+        assertSame(items, underTest.getItems());
+        assertEquals("/path1", underTest.getResourcePath());
+        assertSame(props, underTest.getProperties());
+    }
+
+}

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

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationCollectionDataImplTest.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Wed Nov 30 21:00:11 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

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

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=1772117&r1=1772116&r2=1772117&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 Wed Nov 30 21:00:11 2016
@@ -177,8 +177,7 @@ public class ConfigurationDataImplTest {
         Resource resource = context.create().resource("/conf/testIgnoreProps",
                 "prop1", "value1",
                 "prop4", true,
-                "jcr:primaryType", "myType",
-                "sling:resourceType", "my/type");
+                "jcr:primaryType", "myType");
 
         ConfigurationData underTest = new ConfigurationDataImpl(null, resource, resource, null,
                 contextResource, "test", configurationManager, configurationOverrideManager, configurationPersistenceStrategy,
@@ -188,9 +187,6 @@ public class ConfigurationDataImplTest {
         
         assertNull(underTest.getValues().get("jcr:primaryType"));
         assertNull(underTest.getEffectiveValues().get("jcr:primaryType"));
-
-        assertNull(underTest.getValues().get("sling:resourceType"));
-        assertNull(underTest.getEffectiveValues().get("sling:resourceType"));
     }
 
 }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplNoDefaultTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplNoDefaultTest.java?rev=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplNoDefaultTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplNoDefaultTest.java Wed Nov 30 21:00:11 2016
@@ -98,7 +98,7 @@ public class ConfigurationManagerImplNoD
     
     @Test
     public void testGet_NoConfigResource() {
-        ConfigurationData configData = underTest.get(contextResourceNoConfig, CONFIG_NAME);
+        ConfigurationData configData = underTest.getConfiguration(contextResourceNoConfig, CONFIG_NAME);
         assertNotNull(configData);
 
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3"), configData.getPropertyNames());
@@ -113,13 +113,13 @@ public class ConfigurationManagerImplNoD
     public void testGet_NoConfigResource_NoConfigMetadata() {
         when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(null);
 
-        ConfigurationData configData = underTest.get(contextResourceNoConfig, CONFIG_NAME);
+        ConfigurationData configData = underTest.getConfiguration(contextResourceNoConfig, CONFIG_NAME);
         assertNull(configData);
     }
 
     @Test
     public void testGetCollection_NoConfigResources() {
-        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getCollection(contextResourceNoConfig, CONFIG_COL_NAME));
+        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getConfigurationCollection(contextResourceNoConfig, CONFIG_COL_NAME).getItems());
         assertEquals(0, configDatas.size());
     }
 
@@ -127,7 +127,7 @@ public class ConfigurationManagerImplNoD
     public void testGetCollection_NoConfigResources_NoConfigMetadata() {
         when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_COL_NAME)).thenReturn(null);
 
-        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getCollection(contextResourceNoConfig, CONFIG_COL_NAME));
+        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getConfigurationCollection(contextResourceNoConfig, CONFIG_COL_NAME).getItems());
         assertEquals(0, configDatas.size());
     }
 

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=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java Wed Nov 30 21:00:11 2016
@@ -34,13 +34,17 @@ import java.util.List;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.caconfig.impl.ConfigurationTestUtils;
+import org.apache.sling.caconfig.impl.def.ConfigurationDefNameConstants;
 import org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.impl.override.DummyConfigurationOverrideProvider;
+import org.apache.sling.caconfig.management.ConfigurationCollectionData;
 import org.apache.sling.caconfig.management.ConfigurationData;
 import org.apache.sling.caconfig.management.ConfigurationManager;
+import org.apache.sling.caconfig.resource.impl.def.ConfigurationResourceNameConstants;
+import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
 import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
 import org.apache.sling.caconfig.spi.ConfigurationOverrideProvider;
-import org.apache.sling.caconfig.spi.ResourceCollectionItem;
+import org.apache.sling.caconfig.spi.ConfigurationPersistData;
 import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
 import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
@@ -181,8 +185,8 @@ public class ConfigurationManagerImplTes
     }
     
     @Test
-    public void testGet() {
-        ConfigurationData configData = underTest.get(contextResource, CONFIG_NAME);
+    public void testGetConfiguration() {
+        ConfigurationData configData = underTest.getConfiguration(contextResource, CONFIG_NAME);
         assertNotNull(configData);
 
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3", "prop4"), configData.getPropertyNames());
@@ -191,11 +195,13 @@ public class ConfigurationManagerImplTes
 
         assertFalse(configData.getValueInfo("prop1").isInherited());
         assertFalse(configData.getValueInfo("prop3").isInherited());
+
+        assertFalse(configData.getValues().get(ConfigurationDefNameConstants.PROPERTY_CONFIG_PROPERTY_INHERIT, false));
     }
 
     @Test
-    public void testGet_WithResourceInheritance() {
-        ConfigurationData configData = underTest.get(contextResourceLevel2, CONFIG_NAME);
+    public void testGetConfiguration_WithResourceInheritance() {
+        ConfigurationData configData = underTest.getConfiguration(contextResourceLevel2, CONFIG_NAME);
         assertNotNull(configData);
 
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3", "prop4"), configData.getPropertyNames());
@@ -208,11 +214,13 @@ public class ConfigurationManagerImplTes
         assertTrue(configData.getValueInfo("prop1").isInherited());
         assertFalse(configData.getValueInfo("prop3").isInherited());
         assertNull(configData.getValueInfo("prop3").getConfigSourcePath());
-    }
 
+        assertFalse(configData.getValues().get(ConfigurationDefNameConstants.PROPERTY_CONFIG_PROPERTY_INHERIT, false));
+    }
+    
     @Test
-    public void testGet_WithPropertyInheritance() {
-        ConfigurationData configData = underTest.get(contextResourceLevel3, CONFIG_NAME);
+    public void testGetConfiguration_WithPropertyInheritance() {
+        ConfigurationData configData = underTest.getConfiguration(contextResourceLevel3, CONFIG_NAME);
         assertNotNull(configData);
 
         assertTrue(configData.getPropertyNames().containsAll(ImmutableSet.of("prop1", "prop2", "prop3", "prop4", "prop5")));
@@ -240,14 +248,16 @@ public class ConfigurationManagerImplTes
         assertEquals(configPathLevel3, configData.getValueInfo("prop4").getConfigSourcePath());
         assertFalse(configData.getValueInfo("prop5").isInherited());
         assertEquals(configPathLevel3, configData.getValueInfo("prop5").getConfigSourcePath());
+        
+        assertTrue(configData.getValues().get(ConfigurationDefNameConstants.PROPERTY_CONFIG_PROPERTY_INHERIT, false));
     }
 
     @Test
-    public void testGet_WithOverride() {
+    public void testGetConfiguration_WithOverride() {
         context.registerService(ConfigurationOverrideProvider.class, new DummyConfigurationOverrideProvider(
                 "[/content]" + CONFIG_NAME + "={prop1='override1'}"));
         
-        ConfigurationData configData = underTest.get(contextResource, CONFIG_NAME);
+        ConfigurationData configData = underTest.getConfiguration(contextResource, CONFIG_NAME);
         assertNotNull(configData);
 
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3"), configData.getPropertyNames());
@@ -262,8 +272,8 @@ public class ConfigurationManagerImplTes
     }
 
     @Test
-    public void testGet_NoConfigResource() {
-        ConfigurationData configData = underTest.get(contextResourceNoConfig, CONFIG_NAME);
+    public void testGetConfiguration_NoConfigResource() {
+        ConfigurationData configData = underTest.getConfiguration(contextResourceNoConfig, CONFIG_NAME);
         assertNotNull(configData);
 
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3"), configData.getPropertyNames());
@@ -275,10 +285,10 @@ public class ConfigurationManagerImplTes
     }
 
     @Test
-    public void testGet_NoConfigMetadata() {
+    public void testGetConfiguration_NoConfigMetadata() {
         when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(null);
 
-        ConfigurationData configData = underTest.get(contextResource, CONFIG_NAME);
+        ConfigurationData configData = underTest.getConfiguration(contextResource, CONFIG_NAME);
         assertNotNull(configData);
 
         assertEquals(ImmutableSet.of("prop1", "prop4"), configData.getPropertyNames());
@@ -290,16 +300,17 @@ public class ConfigurationManagerImplTes
     }
 
     @Test
-    public void testGet_NoConfigResource_NoConfigMetadata() {
+    public void testGetConfiguration_NoConfigResource_NoConfigMetadata() {
         when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_NAME)).thenReturn(null);
 
-        ConfigurationData configData = underTest.get(contextResourceNoConfig, CONFIG_NAME);
+        ConfigurationData configData = underTest.getConfiguration(contextResourceNoConfig, CONFIG_NAME);
         assertNull(configData);
     }
 
     @Test
-    public void testGetCollection() {
-        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getCollection(contextResource, CONFIG_COL_NAME));
+    public void testGetConfigurationCollection() {
+        ConfigurationCollectionData configCollectionData = underTest.getConfigurationCollection(contextResource, CONFIG_COL_NAME);
+        List<ConfigurationData> configDatas = ImmutableList.copyOf(configCollectionData.getItems());
         assertEquals(2, configDatas.size());
 
         ConfigurationData configData1 = configDatas.get(0);
@@ -319,11 +330,14 @@ public class ConfigurationManagerImplTes
 
         assertFalse(configData2.getValueInfo("prop1").isInherited());
         assertFalse(configData2.getValueInfo("prop3").isInherited());
+
+        assertNull(configCollectionData.getProperties().get(ConfigurationResourceNameConstants.PROPERTY_CONFIG_COLLECTION_INHERIT));
     }
 
     @Test
-    public void testGetCollection_WithResourceCollectionInheritance() {
-        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getCollection(contextResourceLevel2, CONFIG_COL_NAME));
+    public void testGetConfigurationCollection_WithResourceCollectionInheritance() {
+        ConfigurationCollectionData configCollectionData = underTest.getConfigurationCollection(contextResourceLevel2, CONFIG_COL_NAME);
+        List<ConfigurationData> configDatas = ImmutableList.copyOf(configCollectionData.getItems());
         assertEquals(2, configDatas.size());
         
         ConfigurationData configData1 = configDatas.get(0);
@@ -348,11 +362,14 @@ public class ConfigurationManagerImplTes
         assertEquals(configPath2, configData2.getValueInfo("prop4").getConfigSourcePath());
         assertFalse(configData2.getValueInfo("prop3").isInherited());
         assertNull(configData2.getValueInfo("prop3").getConfigSourcePath());
+        
+        assertTrue((Boolean)configCollectionData.getProperties().get(ConfigurationResourceNameConstants.PROPERTY_CONFIG_COLLECTION_INHERIT));
     }
 
     @Test
-    public void testGetCollection_WithResourceCollectionAndPropertyInheritance() {
-        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getCollection(contextResourceLevel3, CONFIG_COL_NAME));
+    public void testGetConfigurationCollection_WithResourceCollectionAndPropertyInheritance() {
+        ConfigurationCollectionData configCollectionData = underTest.getConfigurationCollection(contextResourceLevel3, CONFIG_COL_NAME);
+        List<ConfigurationData> configDatas = ImmutableList.copyOf(configCollectionData.getItems());
         assertEquals(2, configDatas.size());
         
         ConfigurationData configData1 = configDatas.get(0);
@@ -394,14 +411,17 @@ public class ConfigurationManagerImplTes
         assertEquals(configPath2, configData2.getValueInfo("prop4").getConfigSourcePath());
         assertFalse(configData2.getValueInfo("prop3").isInherited());
         assertNull(configData2.getValueInfo("prop3").getConfigSourcePath());
+
+        assertTrue((Boolean)configCollectionData.getProperties().get(ConfigurationResourceNameConstants.PROPERTY_CONFIG_COLLECTION_INHERIT));
+        assertTrue(configData1.getValues().get(ConfigurationDefNameConstants.PROPERTY_CONFIG_PROPERTY_INHERIT, false));
     }
 
     @Test
-    public void testGetCollection_WithOverride() {
+    public void testGetConfigurationCollection_WithOverride() {
         context.registerService(ConfigurationOverrideProvider.class, new DummyConfigurationOverrideProvider(
                 "[/content]" + CONFIG_COL_NAME + "/prop1='override1'"));
         
-        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getCollection(contextResource, CONFIG_COL_NAME));
+        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getConfigurationCollection(contextResource, CONFIG_COL_NAME).getItems());
         assertEquals(2, configDatas.size());
 
         ConfigurationData configData1 = configDatas.get(0);
@@ -428,16 +448,16 @@ public class ConfigurationManagerImplTes
     }
 
     @Test
-    public void testGetCollection_NoConfigResources() {
-        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getCollection(contextResourceNoConfig, CONFIG_COL_NAME));
+    public void testGetConfigurationCollection_NoConfigResources() {
+        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getConfigurationCollection(contextResourceNoConfig, CONFIG_COL_NAME).getItems());
         assertEquals(0, configDatas.size());
     }
 
     @Test
-    public void testGetCollection_NoConfigMetadata() {
+    public void testGetConfigurationCollection_NoConfigMetadata() {
         when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_COL_NAME)).thenReturn(null);
         
-        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getCollection(contextResource, CONFIG_COL_NAME));
+        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getConfigurationCollection(contextResource, CONFIG_COL_NAME).getItems());
         assertEquals(2, configDatas.size());
         
         ConfigurationData configData1 = configDatas.get(0);
@@ -458,17 +478,17 @@ public class ConfigurationManagerImplTes
     }
 
     @Test
-    public void testGetCollection_NoConfigResources_NoConfigMetadata() {
+    public void testGetConfigurationCollection_NoConfigResources_NoConfigMetadata() {
         when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_COL_NAME)).thenReturn(null);
 
-        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getCollection(contextResourceNoConfig, CONFIG_COL_NAME));
+        List<ConfigurationData> configDatas = ImmutableList.copyOf(underTest.getConfigurationCollection(contextResourceNoConfig, CONFIG_COL_NAME).getItems());
         assertEquals(0, configDatas.size());
     }
 
     @Test
-    public void testPersist() throws Exception {
-        underTest.persist(contextResourceNoConfig, CONFIG_NAME,
-                ImmutableMap.<String, Object>of("prop1", "value1"));
+    public void testPersistConfiguration() throws Exception {
+        underTest.persistConfiguration(contextResourceNoConfig, CONFIG_NAME,
+                new ConfigurationPersistData(ImmutableMap.<String, Object>of("prop1", "value1")));
         context.resourceResolver().commit();
 
         String configPath = getConfigPropsPath("/conf/testNoConfig/" + CONFIGS_PARENT_NAME + "/" + CONFIG_NAME);
@@ -477,10 +497,11 @@ public class ConfigurationManagerImplTes
     }
 
     @Test
-    public void testPersistCollection() throws Exception {
-        underTest.persistCollection(contextResourceNoConfig, CONFIG_COL_NAME, ImmutableList.of(
-                new ResourceCollectionItem("0",  ImmutableMap.<String, Object>of("prop1", "value1")),
-                new ResourceCollectionItem("1", ImmutableMap.<String, Object>of("prop2", 5))
+    public void testPersistConfigurationCollection() throws Exception {
+        underTest.persistConfigurationCollection(contextResourceNoConfig, CONFIG_COL_NAME,
+                new ConfigurationCollectionPersistData(ImmutableList.of(
+                        new ConfigurationPersistData(ImmutableMap.<String, Object>of("prop1", "value1")).collectionItemName("0"),
+                        new ConfigurationPersistData(ImmutableMap.<String, Object>of("prop2", 5)).collectionItemName("1"))
         ));
         context.resourceResolver().commit();
 
@@ -509,18 +530,18 @@ public class ConfigurationManagerImplTes
     }
 
     @Test
-    public void testGetConfigurationNames() {
+    public void testGetConfigurationConfigurationNames() {
         assertEquals(ImmutableSortedSet.of(CONFIG_NAME, CONFIG_COL_NAME, CONFIG_NESTED_NAME), underTest.getConfigurationNames());
     }
 
     @Test
-    public void testGetConfigurationMetadata() {
+    public void testGetConfigurationConfigurationMetadata() {
         assertEquals(CONFIG_NAME, underTest.getConfigurationMetadata(CONFIG_NAME).getName());
     }
 
     @Test
-    public void testGetNested() {
-        ConfigurationData configData = underTest.get(contextResource, CONFIG_NESTED_NAME);
+    public void testGetConfigurationNested() {
+        ConfigurationData configData = underTest.getConfiguration(contextResource, CONFIG_NESTED_NAME);
         assertNotNull(configData);
 
         assertEquals(ImmutableSet.of("prop1", "propSub", "propSubList", "prop4"), configData.getPropertyNames());

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationPersistenceStrategyMultiplexerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationPersistenceStrategyMultiplexerTest.java?rev=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationPersistenceStrategyMultiplexerTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationPersistenceStrategyMultiplexerTest.java Wed Nov 30 21:00:11 2016
@@ -24,14 +24,12 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
-import java.util.Collection;
-import java.util.Map;
-
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.caconfig.impl.def.DefaultConfigurationPersistenceStrategy;
+import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
+import org.apache.sling.caconfig.spi.ConfigurationPersistData;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceStrategy;
-import org.apache.sling.caconfig.spi.ResourceCollectionItem;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Before;
 import org.junit.Rule;
@@ -61,10 +59,11 @@ public class ConfigurationPersistenceStr
     public void testWithNoStrategies() {
         assertNull(underTest.getResource(resource1));
         assertNull(underTest.getResourcePath(resource1.getPath()));
-        assertFalse(underTest.persist(context.resourceResolver(), "/conf/test1", resource1.getValueMap()));
-        assertFalse(underTest.persistCollection(context.resourceResolver(), "/conf/testCol", ImmutableList.of(
-                        new ResourceCollectionItem(resource1.getName(), resource1.getValueMap()),
-                        new ResourceCollectionItem(resource2.getName(), resource2.getValueMap()))));
+        assertFalse(underTest.persist(context.resourceResolver(), "/conf/test1", new ConfigurationPersistData(resource1.getValueMap())));
+        assertFalse(underTest.persistCollection(context.resourceResolver(), "/conf/testCol",
+                new ConfigurationCollectionPersistData(ImmutableList.of(
+                        new ConfigurationPersistData(resource1.getValueMap()).collectionItemName(resource1.getName()),
+                        new ConfigurationPersistData(resource2.getValueMap()).collectionItemName(resource2.getName())))));
     }
 
     @Test
@@ -73,10 +72,11 @@ public class ConfigurationPersistenceStr
 
         assertSame(resource1, underTest.getResource(resource1));
         assertEquals(resource1.getPath(), underTest.getResourcePath(resource1.getPath()));
-        assertTrue(underTest.persist(context.resourceResolver(), "/conf/test1", resource1.getValueMap()));
-        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/testCol", ImmutableList.of(
-                        new ResourceCollectionItem(resource1.getName(), resource1.getValueMap()),
-                        new ResourceCollectionItem(resource2.getName(), resource2.getValueMap()))));
+        assertTrue(underTest.persist(context.resourceResolver(), "/conf/test1", new ConfigurationPersistData(resource1.getValueMap())));
+        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/testCol",
+                new ConfigurationCollectionPersistData(ImmutableList.of(
+                        new ConfigurationPersistData(resource1.getValueMap()).collectionItemName(resource1.getName()),
+                        new ConfigurationPersistData(resource2.getValueMap()).collectionItemName(resource2.getName())))));
     }
     
     @Test
@@ -93,12 +93,13 @@ public class ConfigurationPersistenceStr
                 return resource2.getPath();
             }
             @Override
-            public boolean persist(ResourceResolver resourceResolver, String configResourcePath, Map<String,Object> properties) {
+            public boolean persist(ResourceResolver resourceResolver, String configResourcePath,
+                    ConfigurationPersistData data) {
                 return true;
             }
             @Override
-            public boolean persistCollection(ResourceResolver resourceResolver, String configResourceCollectionParentPath,
-                    Collection<ResourceCollectionItem> resourceCollectionItems) {
+            public boolean persistCollection(ResourceResolver resourceResolver,
+                    String configResourceCollectionParentPath, ConfigurationCollectionPersistData data) {
                 return false;
             }
         }, Constants.SERVICE_RANKING, 2000);
@@ -114,12 +115,13 @@ public class ConfigurationPersistenceStr
                 return resource1.getPath();
             }
             @Override
-            public boolean persist(ResourceResolver resourceResolver, String configResourcePath, Map<String,Object> properties) {
+            public boolean persist(ResourceResolver resourceResolver, String configResourcePath,
+                    ConfigurationPersistData data) {
                 return false;
             }
             @Override
-            public boolean persistCollection(ResourceResolver resourceResolver, String configResourceCollectionParentPath,
-                    Collection<ResourceCollectionItem> resourceCollectionItems) {
+            public boolean persistCollection(ResourceResolver resourceResolver,
+                    String configResourceCollectionParentPath, ConfigurationCollectionPersistData data) {
                 return true;
             }
 
@@ -127,10 +129,11 @@ public class ConfigurationPersistenceStr
         
         assertSame(resource2, underTest.getResource(resource1));
         assertEquals(resource2.getPath(), underTest.getResourcePath(resource1.getPath()));
-        assertTrue(underTest.persist(context.resourceResolver(), "/conf/test1", resource1.getValueMap()));
-        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/testCol", ImmutableList.of(
-                        new ResourceCollectionItem(resource1.getName(), resource1.getValueMap()),
-                        new ResourceCollectionItem(resource2.getName(), resource2.getValueMap()))));
+        assertTrue(underTest.persist(context.resourceResolver(), "/conf/test1", new ConfigurationPersistData(resource1.getValueMap())));
+        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/testCol",
+                new ConfigurationCollectionPersistData(ImmutableList.of(
+                        new ConfigurationPersistData(resource1.getValueMap()).collectionItemName(resource1.getName()),
+                        new ConfigurationPersistData(resource2.getValueMap()).collectionItemName(resource2.getName())))));
     }
 
 }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/CustomConfigurationPersistenceStrategy.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/CustomConfigurationPersistenceStrategy.java?rev=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/CustomConfigurationPersistenceStrategy.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/CustomConfigurationPersistenceStrategy.java Wed Nov 30 21:00:11 2016
@@ -18,7 +18,6 @@
  */
 package org.apache.sling.caconfig.management.impl;
 
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
 
@@ -30,9 +29,10 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
+import org.apache.sling.caconfig.spi.ConfigurationPersistData;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceException;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceStrategy;
-import org.apache.sling.caconfig.spi.ResourceCollectionItem;
 
 /**
  * This is a variant of {@link org.apache.sling.caconfig.impl.def.DefaultConfigurationPersistenceStrategy}
@@ -55,20 +55,29 @@ public class CustomConfigurationPersiste
     }
 
     @Override
-    public boolean persist(ResourceResolver resourceResolver, String configResourcePath, Map<String,Object> properties) {
-        getOrCreateResource(resourceResolver, configResourcePath + "/" + CHILD_NODE_NAME, properties);
+    public boolean persist(ResourceResolver resourceResolver, String configResourcePath,
+            ConfigurationPersistData data) {
+        getOrCreateResource(resourceResolver, configResourcePath + "/" + CHILD_NODE_NAME, data.getProperties());
         return true;
     }
 
     @Override
     public boolean persistCollection(ResourceResolver resourceResolver, String configResourceCollectionParentPath,
-            Collection<ResourceCollectionItem> resourceCollectionItems) {
+            ConfigurationCollectionPersistData data) {
         Resource configResourceParent = getOrCreateResource(resourceResolver, configResourceCollectionParentPath, ValueMap.EMPTY);
+        
+        // delete existing children and create new ones
         deleteChildren(configResourceParent);
-        for (ResourceCollectionItem item : resourceCollectionItems) {
+        for (ConfigurationPersistData item : data.getItems()) {
             String path = configResourceParent.getPath() + "/" + item.getCollectionItemName() + "/" + CHILD_NODE_NAME;
-            getOrCreateResource(resourceResolver, path, item.getValues());
+            getOrCreateResource(resourceResolver, path, item.getProperties());
         }
+        
+        // if resource collection parent properties are given replace them as well
+        if (data.getProperties() != null) {
+            replaceProperties(configResourceParent, data.getProperties());
+        }
+        
         return true;
     }
     
@@ -97,9 +106,9 @@ public class CustomConfigurationPersiste
     
     private void replaceProperties(Resource resource, Map<String,Object> properties) {
         ModifiableValueMap modValueMap = resource.adaptTo(ModifiableValueMap.class);
-        // remove all existing properties that do not have jcr: or sling: namespace
+        // remove all existing properties that do not have jcr: namespace
         for (String propertyName : new HashSet<>(modValueMap.keySet())) {
-            if (StringUtils.startsWith(propertyName, "jcr:") || StringUtils.startsWith(propertyName, "sling:")) {
+            if (StringUtils.startsWith(propertyName, "jcr:")) {
                 continue;
             }
             modValueMap.remove(propertyName);

Modified: sling/trunk/contrib/extensions/contextaware-config/integration-tests/src/test/java/org/apache/sling/caconfig/it/ConfigurationManagerIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/integration-tests/src/test/java/org/apache/sling/caconfig/it/ConfigurationManagerIT.java?rev=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/integration-tests/src/test/java/org/apache/sling/caconfig/it/ConfigurationManagerIT.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/integration-tests/src/test/java/org/apache/sling/caconfig/it/ConfigurationManagerIT.java Wed Nov 30 21:00:11 2016
@@ -38,7 +38,8 @@ import org.apache.sling.caconfig.Configu
 import org.apache.sling.caconfig.it.example.SimpleConfig;
 import org.apache.sling.caconfig.management.ConfigurationData;
 import org.apache.sling.caconfig.management.ConfigurationManager;
-import org.apache.sling.caconfig.spi.ResourceCollectionItem;
+import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
+import org.apache.sling.caconfig.spi.ConfigurationPersistData;
 import org.apache.sling.junit.rules.TeleporterRule;
 import org.apache.sling.resourcebuilder.api.ResourceBuilder;
 import org.apache.sling.resourcebuilder.api.ResourceBuilderFactory;
@@ -82,7 +83,7 @@ public class ConfigurationManagerIT {
     
     @Test
     public void testNonExistingConfig() throws Exception {
-        ConfigurationData config = configManager.get(resourcePage1, CONFIG_NAME);
+        ConfigurationData config = configManager.getConfiguration(resourcePage1, CONFIG_NAME);
         assertNotNull(config);
 
         ValueMap props = config.getEffectiveValues();
@@ -99,7 +100,7 @@ public class ConfigurationManagerIT {
                 "intParam", 123,
                 "boolParam", true);
         
-        ConfigurationData config = configManager.get(resourcePage1, CONFIG_NAME);
+        ConfigurationData config = configManager.getConfiguration(resourcePage1, CONFIG_NAME);
         assertNotNull(config);
         
         ValueMap props = config.getEffectiveValues();
@@ -117,7 +118,7 @@ public class ConfigurationManagerIT {
         values.put("stringParamDefault", "valueB");
         values.put("intParam", 55);
         values.put("boolParam", true);
-        configManager.persist(resourcePage1, CONFIG_NAME, values);
+        configManager.persistConfiguration(resourcePage1, CONFIG_NAME, new ConfigurationPersistData(values));
         resourceResolver.commit();
         
         // read config via configuration resolver
@@ -139,10 +140,10 @@ public class ConfigurationManagerIT {
         Map<String,Object> values2 = new HashMap<>();
         values2.put("intParam", 55);
         values2.put("boolParam", true);
-        List<ResourceCollectionItem> items = new ArrayList<>();
-        items.add(new ResourceCollectionItem("item1", values1));
-        items.add(new ResourceCollectionItem("item2", values2));
-        configManager.persistCollection(resourcePage1, CONFIG_NAME, items);
+        List<ConfigurationPersistData> items = new ArrayList<>();
+        items.add(new ConfigurationPersistData(values1).collectionItemName("item1"));
+        items.add(new ConfigurationPersistData(values2).collectionItemName("item2"));
+        configManager.persistConfigurationCollection(resourcePage1, CONFIG_NAME, new ConfigurationCollectionPersistData(items));
         resourceResolver.commit();
         
         // read config via configuration resolver

Added: sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java?rev=1772117&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java Wed Nov 30 21:00:11 2016
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.caconfig.spi;
+
+import java.util.Collection;
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+import org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * Data for persisting configuration collections.
+ */
+@ProviderType
+public final class ConfigurationCollectionPersistData {
+
+    private final Collection<ConfigurationPersistData> items;
+    private Map<String,Object> properties;
+    
+    /**
+     * @param collection Collection of configuration collection items
+     */
+    public ConfigurationCollectionPersistData(@Nonnull Collection<ConfigurationPersistData> items) {
+        this.items = items;
+    }
+
+    /**
+     * @return Collection of configuration collection items
+     */
+    public @Nonnull Collection<ConfigurationPersistData> getItems() {
+        return items;
+    }
+    
+    /**
+     * @return Properties for the configuration collection itself. Does not contain configuration data, but control data e.g. for enabling collection inheritance.
+     */
+    public @CheckForNull Map<String, Object> getProperties() {
+        return properties;
+    }
+
+    /**
+     * @param properties Properties for the configuration collection itself. Does not contain configuration data, but control data e.g. for enabling collection inheritance.
+     * @return this
+     */
+    public ConfigurationCollectionPersistData properties(Map<String, Object> value) {
+        this.properties = value;
+        return this;
+    }
+
+}

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

Propchange: sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationCollectionPersistData.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Wed Nov 30 21:00:11 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

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

Added: sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistData.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistData.java?rev=1772117&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistData.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistData.java Wed Nov 30 21:00:11 2016
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.caconfig.spi;
+
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+import org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * Data for persisting configuration properties.
+ */
+@ProviderType
+public final class ConfigurationPersistData {
+
+    private final Map<String,Object> properties;
+    private String collectionItemName;
+    
+    /**
+     * @param collectionItemName Resource collection item name
+     * @param properties Property values
+     */
+    public ConfigurationPersistData(@Nonnull Map<String, Object> properties) {
+        this.properties = properties;
+    }
+
+    /**
+     * @return Property values
+     */
+    public @Nonnull Map<String, Object> getProperties() {
+        return properties;
+    }
+
+    /**
+     * @return Resource collection item name. To be set only for resource collection items.
+     */
+    public @CheckForNull String getCollectionItemName() {
+        return collectionItemName;
+    }
+
+    /**
+     * @param collectionItemName Resource collection item name.  To be set only for resource collection items.
+     * @return this
+     */
+    public ConfigurationPersistData collectionItemName(String value) {
+        this.collectionItemName = value;
+        return this;
+    }
+
+}

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

Propchange: sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistData.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Wed Nov 30 21:00:11 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

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

Modified: sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistenceStrategy.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistenceStrategy.java?rev=1772117&r1=1772116&r2=1772117&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistenceStrategy.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ConfigurationPersistenceStrategy.java Wed Nov 30 21:00:11 2016
@@ -18,9 +18,6 @@
  */
 package org.apache.sling.caconfig.spi;
 
-import java.util.Collection;
-import java.util.Map;
-
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
@@ -61,7 +58,7 @@ public interface ConfigurationPersistenc
      *      (but in case of error throw an exception).
      */
     boolean persist(@Nonnull ResourceResolver resourceResolver,
-            @Nonnull String configResourcePath, @Nonnull Map<String,Object> properties);
+            @Nonnull String configResourcePath, @Nonnull ConfigurationPersistData data);
     
     /**
      * Stores configuration data for a configuration resource collection.
@@ -75,6 +72,6 @@ public interface ConfigurationPersistenc
      *      (but in case of error throw an exception).
      */
     boolean persistCollection(@Nonnull ResourceResolver resourceResolver,
-            @Nonnull String configResourceCollectionParentPath, @Nonnull Collection<ResourceCollectionItem> resourceCollectionItems);
+            @Nonnull String configResourceCollectionParentPath, @Nonnull ConfigurationCollectionPersistData data);
     
 }