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/19 11:37:44 UTC

svn commit: r1770484 - 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/impl/...

Author: sseifert
Date: Sat Nov 19 11:37:44 2016
New Revision: 1770484

URL: http://svn.apache.org/viewvc?rev=1770484&view=rev
Log:
SLING-6303 Context-Aware Config: Persisting configuration resource collections with names

(!) this breaks backward compatibility of both org.apache.sling.caconfig.spi and org.apache.sling.caconfig.management

Added:
    sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ResourceCollectionItem.java   (with props)
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/package-info.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/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
    sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/package-info.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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -31,6 +31,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ValueMap;
 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;
@@ -83,16 +84,15 @@ public class DefaultConfigurationPersist
 
     @Override
     public boolean persistCollection(ResourceResolver resourceResolver, String configResourceCollectionParentPath,
-            Collection<Map<String,Object>> propertiesCollection) {
+            Collection<ResourceCollectionItem> resourceCollectionItems) {
         if (!config.enabled()) {
             return false;
         }
         Resource configResourceParent = getOrCreateResource(resourceResolver, configResourceCollectionParentPath, ValueMap.EMPTY);
         deleteChildren(configResourceParent);
-        int index = 0;
-        for (Map<String,Object> properties : propertiesCollection) {
-            String path = configResourceParent.getPath() + "/" + (index++);
-            getOrCreateResource(resourceResolver, path, properties);
+        for (ResourceCollectionItem item : resourceCollectionItems) {
+            String path = configResourceParent.getPath() + "/" + item.getCollectionItemName();
+            getOrCreateResource(resourceResolver, path, item.getValues());
         }
         return true;
     }

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -33,6 +33,18 @@ import org.osgi.annotation.versioning.Pr
 public interface ConfigurationData {
     
     /**
+     * Get configuration name.
+     * @return Configuration name
+     */
+    @Nonnull String getConfigName();
+
+    /**
+     * In case of configuration resource collection, this returns the collection item resource name.
+     * @return Item resource name or null if it is a singleton resource.
+     */
+    @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.

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -25,6 +25,7 @@ import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.caconfig.spi.ResourceCollectionItem;
 import org.osgi.annotation.versioning.ProviderType;
 
 /**
@@ -63,15 +64,18 @@ public interface ConfigurationManager {
      * Write configuration data collection using the inner-most context path as reference.
      * @param resource Context resource
      * @param configName Configuration name
-     * @param values Value collection to be stored. All existing collection entries on this context path level are erased and replaced with the new ones.
+     * @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<Map<String,Object>> values);
+    void persistCollection(@Nonnull Resource resource, @Nonnull String configName,
+            @Nonnull Collection<ResourceCollectionItem> resourceCollectionItems);
     
     /**
      * Creates a new empty configuration data item for a configuration data collection for the given configuration name.
+     * @param resource Context resource
      * @param configName Configuration name
      * @return Configuration data. Is null when no configuration metadata exists.
      */
-    @CheckForNull ConfigurationData newCollectionItem(@Nonnull String configName);
+    @CheckForNull ConfigurationData newCollectionItem(@Nonnull Resource resource, @Nonnull String configName);
     
 }

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -45,12 +45,14 @@ final class ConfigurationDataImpl implem
     private final Resource contextResource;
     private final String configName;
     private final ConfigurationOverrideManager configurationOverrideManager;
+    private final boolean configResourceCollection;
     
     @SuppressWarnings("unchecked")
     public ConfigurationDataImpl(ConfigurationMetadata configMetadata,
             Resource resolvedConfigurationResource, Resource writebackConfigurationResource,
             Iterator<Resource> configurationResourceInheritanceChain,
-            Resource contextResource, String configName, ConfigurationOverrideManager configurationOverrideManager) {
+            Resource contextResource, String configName, ConfigurationOverrideManager configurationOverrideManager,
+            boolean configResourceCollection) {
         this.configMetadata = configMetadata;
         this.resolvedConfigurationResource = resolvedConfigurationResource;
         this.writebackConfigurationResource = writebackConfigurationResource;
@@ -59,12 +61,26 @@ final class ConfigurationDataImpl implem
         this.contextResource = contextResource;
         this.configName = configName;
         this.configurationOverrideManager = configurationOverrideManager;
+        this.configResourceCollection = configResourceCollection;
     }
 
     public ConfigurationDataImpl(ConfigurationMetadata configMetadata,
-            Resource contextResource, String configName, ConfigurationOverrideManager configurationOverrideManager) {
+            Resource contextResource, String configName, ConfigurationOverrideManager configurationOverrideManager,
+            boolean configResourceCollection) {
         this(configMetadata, null, null, null,
-                contextResource, configName, configurationOverrideManager);
+                contextResource, configName, configurationOverrideManager,
+                configResourceCollection);
+    }
+    
+    @Override
+    public String getConfigName() {
+        return configName;
+    }
+
+    @Override
+    public String getCollectionItemName() {
+        return (configResourceCollection && resolvedConfigurationResource != null)
+                ? resolvedConfigurationResource.getName() : null;
     }
 
     @Override

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -38,6 +38,7 @@ import org.apache.sling.caconfig.managem
 import org.apache.sling.caconfig.management.ConfigurationManager;
 import org.apache.sling.caconfig.resource.impl.ConfigurationResourceResolvingStrategyMultiplexer;
 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;
@@ -77,12 +78,12 @@ public class ConfigurationManagerImpl im
             resettableConfigResourceInheritanceChain.reset();
             return new ConfigurationDataImpl(configMetadata, configResource, writebackConfigResource,
                     applyPersistence(resettableConfigResourceInheritanceChain),
-                    resource, configName, configurationOverrideManager);
+                    resource, configName, configurationOverrideManager, false);
         }
         if (configMetadata != null) {
             // if no config resource found but config metadata exist return empty config data with default values
             return new ConfigurationDataImpl(configMetadata,
-                    resource, configName, configurationOverrideManager);
+                    resource, configName, configurationOverrideManager, false);
         }
         return null;
     }
@@ -114,7 +115,7 @@ public class ConfigurationManagerImpl im
                 resettableConfigResourceInheritanceChain.reset();
                 configData.add(new ConfigurationDataImpl(configMetadata, configResource, writebackConfigResource,
                         applyPersistence(resettableConfigResourceInheritanceChain),
-                        resource, configName, configurationOverrideManager));
+                        resource, configName, configurationOverrideManager, true));
             }
         }
         return configData;
@@ -161,22 +162,22 @@ public class ConfigurationManagerImpl im
     }
 
     @Override
-    public void persistCollection(Resource resource, String configName, Collection<Map<String,Object>> values) {
+    public void persistCollection(Resource resource, String configName, Collection<ResourceCollectionItem> resourceCollectionItems) {
         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, values)) {
+        if (!configurationPersistenceStrategy.persistCollection(resource.getResourceResolver(), configResourceParentPath, resourceCollectionItems)) {
             throw new ConfigurationPersistenceException("Unable to persist configuration: No persistence strategy found.");
         }
     }
 
     @Override
-    public ConfigurationData newCollectionItem(String configName) {
+    public ConfigurationData newCollectionItem(Resource resource, String configName) {
         ConfigurationMetadata configMetadata = configurationMetadataProvider.getConfigurationMetadata(configName);
         if (configMetadata != null) {
             return new ConfigurationDataImpl(configMetadata,
-                    null, configName, configurationOverrideManager);
+                    resource, configName, configurationOverrideManager, true);
         }
         return null;
     }

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -24,6 +24,7 @@ import java.util.Map;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 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;
@@ -87,9 +88,9 @@ public class ConfigurationPersistenceStr
      */
     @Override
     public boolean persistCollection(ResourceResolver resourceResolver, String configResourceCollectionParentPath,
-            Collection<Map<String,Object>> propertiesCollection) {
+            Collection<ResourceCollectionItem> resourceCollectionItems) {
         for (ConfigurationPersistenceStrategy item : items) {
-            if (item.persistCollection(resourceResolver, configResourceCollectionParentPath, propertiesCollection)) {
+            if (item.persistCollection(resourceResolver, configResourceCollectionParentPath, resourceCollectionItems)) {
                 return true;
             }
         }

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 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.
  */
-@org.osgi.annotation.versioning.Version("1.1.0")
+@org.osgi.annotation.versioning.Version("2.0.0")
 package org.apache.sling.caconfig.management;

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -24,11 +24,10 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
-import java.util.Map;
-
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
 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.Rule;
 import org.junit.Test;
@@ -79,9 +78,9 @@ public class DefaultConfigurationPersist
         ConfigurationPersistenceStrategy underTest = context.registerInjectActivateService(new DefaultConfigurationPersistenceStrategy());
         
         // store new config collection items
-        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/test", ImmutableList.<Map<String,Object>>of(
-                ImmutableMap.<String,Object>of("prop1", "value1"),
-                ImmutableMap.<String,Object>of("prop2", 5)
+        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))
         )));
         context.resourceResolver().commit();
         
@@ -93,7 +92,7 @@ public class DefaultConfigurationPersist
         assertEquals((Integer)5, props1.get("prop2", Integer.class));
 
         // remove config collection items
-        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/test", ImmutableList.<Map<String,Object>>of()));
+        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/test", ImmutableList.<ResourceCollectionItem>of()));
         context.resourceResolver().commit();
 
         resource = context.resourceResolver().getResource("/conf/test");
@@ -109,7 +108,7 @@ public class DefaultConfigurationPersist
         assertNull(underTest.getResource(resource));
 
         assertFalse(underTest.persist(context.resourceResolver(), "/conf/test", ImmutableMap.<String,Object>of()));
-        assertFalse(underTest.persistCollection(context.resourceResolver(), "/conf/test", ImmutableList.<Map<String,Object>>of()));
+        assertFalse(underTest.persistCollection(context.resourceResolver(), "/conf/test", ImmutableList.<ResourceCollectionItem>of()));
     }
 
 }

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -68,7 +68,10 @@ public class ConfigurationDataImplTest {
     @Test
     public void testWithResourceMetadata() {
         ConfigurationData underTest = new ConfigurationDataImpl(configMetadata, configResource, configResource, null,
-                contextResource, "test", configurationOverrideManager);
+                contextResource, "test", configurationOverrideManager, true);
+        
+        assertEquals("test", underTest.getConfigName());
+        assertEquals(configResource.getName(), underTest.getCollectionItemName());
         
         assertEquals(configResource.getPath(), underTest.getResourcePath());
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3", "prop4"), underTest.getPropertyNames());
@@ -104,7 +107,10 @@ public class ConfigurationDataImplTest {
     @Test
     public void testWithResourceOnly() {
         ConfigurationData underTest = new ConfigurationDataImpl(null, configResource, configResource, null,
-                contextResource, "test", configurationOverrideManager);
+                contextResource, "test", configurationOverrideManager, false);
+        
+        assertEquals("test", underTest.getConfigName());
+        assertNull(underTest.getCollectionItemName());
         
         assertEquals(ImmutableSet.of("prop1", "prop4"), underTest.getPropertyNames());
         
@@ -130,7 +136,10 @@ public class ConfigurationDataImplTest {
     @Test
     public void testMetadataOnly() {
         ConfigurationData underTest = new ConfigurationDataImpl(configMetadata,
-                contextResource, "test", configurationOverrideManager);
+                contextResource, "test", configurationOverrideManager, false);
+        
+        assertEquals("test", underTest.getConfigName());
+        assertNull(underTest.getCollectionItemName());
         
         assertEquals(ImmutableSet.of("prop1", "prop2", "prop3"), 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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -30,7 +30,6 @@ import static org.junit.Assert.assertTru
 import static org.mockito.Mockito.when;
 
 import java.util.List;
-import java.util.Map;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
@@ -41,6 +40,7 @@ import org.apache.sling.caconfig.managem
 import org.apache.sling.caconfig.management.ConfigurationManager;
 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.metadata.ConfigurationMetadata;
 import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
@@ -432,9 +432,9 @@ public class ConfigurationManagerImplTes
 
     @Test
     public void testPersistCollection() throws Exception {
-        underTest.persistCollection(contextResourceNoConfig, CONFIG_COL_NAME, ImmutableList.<Map<String,Object>>of(
-                ImmutableMap.<String, Object>of("prop1", "value1"),
-                ImmutableMap.<String, Object>of("prop2", 5)
+        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))
         ));
         context.resourceResolver().commit();
 
@@ -449,7 +449,7 @@ public class ConfigurationManagerImplTes
 
     @Test
     public void testNewCollectionItem() {
-        ConfigurationData newItem = underTest.newCollectionItem(CONFIG_COL_NAME);
+        ConfigurationData newItem = underTest.newCollectionItem(contextResource, CONFIG_COL_NAME);
         assertNotNull(newItem);
         assertEquals((Integer)5, newItem.getEffectiveValues().get("prop3", 0));
     }
@@ -458,7 +458,7 @@ public class ConfigurationManagerImplTes
     public void testNewCollectionItem_NoConfigMetadata() {
         when(configurationMetadataProvider.getConfigurationMetadata(CONFIG_COL_NAME)).thenReturn(null);
 
-        ConfigurationData newItem = underTest.newCollectionItem(CONFIG_COL_NAME);
+        ConfigurationData newItem = underTest.newCollectionItem(contextResource, CONFIG_COL_NAME);
         assertNull(newItem);
     }
 

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -30,6 +30,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.caconfig.impl.def.DefaultConfigurationPersistenceStrategy;
 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;
@@ -59,8 +60,9 @@ public class ConfigurationPersistenceStr
     public void testWithNoStrategies() {
         assertNull(underTest.getResource(resource1));
         assertFalse(underTest.persist(context.resourceResolver(), "/conf/test1", resource1.getValueMap()));
-        assertFalse(underTest.persistCollection(context.resourceResolver(), "/conf/testCol", 
-                ImmutableList.<Map<String,Object>>of(resource1.getValueMap(), resource2.getValueMap())));
+        assertFalse(underTest.persistCollection(context.resourceResolver(), "/conf/testCol", ImmutableList.of(
+                        new ResourceCollectionItem(resource1.getName(), resource1.getValueMap()),
+                        new ResourceCollectionItem(resource2.getName(), resource2.getValueMap()))));
     }
 
     @Test
@@ -70,8 +72,9 @@ public class ConfigurationPersistenceStr
         Resource result = underTest.getResource(resource1);
         assertSame(resource1, result);
         assertTrue(underTest.persist(context.resourceResolver(), "/conf/test1", resource1.getValueMap()));
-        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/testCol", 
-                ImmutableList.<Map<String,Object>>of(resource1.getValueMap(), resource2.getValueMap())));
+        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/testCol", ImmutableList.of(
+                        new ResourceCollectionItem(resource1.getName(), resource1.getValueMap()),
+                        new ResourceCollectionItem(resource2.getName(), resource2.getValueMap()))));
     }
     
     @Test
@@ -89,7 +92,7 @@ public class ConfigurationPersistenceStr
             }
             @Override
             public boolean persistCollection(ResourceResolver resourceResolver, String configResourceCollectionParentPath,
-                    Collection<Map<String,Object>> propertiesCollection) {
+                    Collection<ResourceCollectionItem> resourceCollectionItems) {
                 return false;
             }
         }, Constants.SERVICE_RANKING, 2000);
@@ -106,7 +109,7 @@ public class ConfigurationPersistenceStr
             }
             @Override
             public boolean persistCollection(ResourceResolver resourceResolver, String configResourceCollectionParentPath,
-                    Collection<Map<String,Object>> propertiesCollection) {
+                    Collection<ResourceCollectionItem> resourceCollectionItems) {
                 return true;
             }
 
@@ -115,9 +118,9 @@ public class ConfigurationPersistenceStr
         Resource result = underTest.getResource(resource1);
         assertSame(resource2, result);
         assertTrue(underTest.persist(context.resourceResolver(), "/conf/test1", resource1.getValueMap()));
-        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/testCol", 
-                ImmutableList.<Map<String,Object>>of(resource1.getValueMap(), resource2.getValueMap())));
+        assertTrue(underTest.persistCollection(context.resourceResolver(), "/conf/testCol", ImmutableList.of(
+                        new ResourceCollectionItem(resource1.getName(), resource1.getValueMap()),
+                        new ResourceCollectionItem(resource2.getName(), resource2.getValueMap()))));
     }
-    
 
 }

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -32,6 +32,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ValueMap;
 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}
@@ -54,13 +55,12 @@ public class CustomConfigurationPersiste
 
     @Override
     public boolean persistCollection(ResourceResolver resourceResolver, String configResourceCollectionParentPath,
-            Collection<Map<String,Object>> propertiesCollection) {
+            Collection<ResourceCollectionItem> resourceCollectionItems) {
         Resource configResourceParent = getOrCreateResource(resourceResolver, configResourceCollectionParentPath, ValueMap.EMPTY);
         deleteChildren(configResourceParent);
-        int index = 0;
-        for (Map<String,Object> properties : propertiesCollection) {
-            String path = configResourceParent.getPath() + "/" + (index++) + "/jcr:content";
-            getOrCreateResource(resourceResolver, path, properties);
+        for (ResourceCollectionItem item : resourceCollectionItems) {
+            String path = configResourceParent.getPath() + "/" + item.getCollectionItemName() + "/jcr:content";
+            getOrCreateResource(resourceResolver, path, item.getValues());
         }
         return true;
     }

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -38,6 +38,7 @@ 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.junit.rules.TeleporterRule;
 import org.apache.sling.resourcebuilder.api.ResourceBuilder;
 import org.apache.sling.resourcebuilder.api.ResourceBuilderFactory;
@@ -138,10 +139,10 @@ public class ConfigurationManagerIT {
         Map<String,Object> values2 = new HashMap<>();
         values2.put("intParam", 55);
         values2.put("boolParam", true);
-        List<Map<String,Object>> values = new ArrayList<>();
-        values.add(values1);
-        values.add(values2);
-        configManager.persistCollection(resourcePage1, CONFIG_NAME, values);
+        List<ResourceCollectionItem> items = new ArrayList<>();
+        items.add(new ResourceCollectionItem("item1", values1));
+        items.add(new ResourceCollectionItem("item2", values2));
+        configManager.persistCollection(resourcePage1, CONFIG_NAME, items);
         resourceResolver.commit();
         
         // read config via configuration resolver

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=1770484&r1=1770483&r2=1770484&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 Sat Nov 19 11:37:44 2016
@@ -49,7 +49,8 @@ public interface ConfigurationPersistenc
      * @param resourceResolver Resource resolver
      * @param configResourcePath Path to store configuration data to. The resource (and it's parents) may not exist and may have to be created. 
      * @param properties Configuration properties
-     * @return true if the data was persisted. false if persisting the data was not accepted by this persistence strategy (but in case of error throw an exception).
+     * @return true if the data was persisted. false if persisting the data was not accepted by this persistence strategy
+     *      (but in case of error throw an exception).
      */
     boolean persist(@Nonnull ResourceResolver resourceResolver,
             @Nonnull String configResourcePath, @Nonnull Map<String,Object> properties);
@@ -58,11 +59,14 @@ public interface ConfigurationPersistenc
      * Stores configuration data for a configuration resource collection.
      * The changes are written using the given resource resolver. They are not committed, this is left to the caller.
      * @param resourceResolver Resource resolver
-     * @param configResourceCollectionParentPath Parent path to store configuration collection data to. The resource (and it's parents) may not exist and may have to be created. 
-     * @param propertiesCollection Configuration properties
-     * @return true if the data was persisted. false if persisting the data was not accepted by this persistence strategy (but in case of error throw an exception).
+     * @param configResourceCollectionParentPath Parent path to store configuration collection data to.
+     *      The resource (and it's parents) may not exist and may have to be created. 
+     * @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.
+     * @return true if the data was persisted. false if persisting the data was not accepted by this persistence strategy
+     *      (but in case of error throw an exception).
      */
     boolean persistCollection(@Nonnull ResourceResolver resourceResolver,
-            @Nonnull String configResourceCollectionParentPath, @Nonnull Collection<Map<String,Object>> propertiesCollection);
+            @Nonnull String configResourceCollectionParentPath, @Nonnull Collection<ResourceCollectionItem> resourceCollectionItems);
     
 }

Added: sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ResourceCollectionItem.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ResourceCollectionItem.java?rev=1770484&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ResourceCollectionItem.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ResourceCollectionItem.java Sat Nov 19 11:37:44 2016
@@ -0,0 +1,57 @@
+/*
+ * 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 org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * Name and values for persisting resource collection items.
+ */
+@ProviderType
+public final class ResourceCollectionItem {
+    
+    private final String collectionItemName;
+    private final Map<String,Object> values;
+    
+    /**
+     * @param collectionItemName Resource collection item name
+     * @param values Values
+     */
+    public ResourceCollectionItem(String collectionItemName, Map<String, Object> values) {
+        this.collectionItemName = collectionItemName;
+        this.values = values;
+    }
+
+    /**
+     * @return Resource collection item name
+     */
+    public String getCollectionItemName() {
+        return collectionItemName;
+    }
+
+    /**
+     * @return Values
+     */
+    public Map<String, Object> getValues() {
+        return values;
+    }
+
+}

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

Propchange: sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/ResourceCollectionItem.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Sat Nov 19 11:37:44 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/ResourceCollectionItem.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/package-info.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/package-info.java?rev=1770484&r1=1770483&r2=1770484&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/package-info.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/spi/src/main/java/org/apache/sling/caconfig/spi/package-info.java Sat Nov 19 11:37:44 2016
@@ -19,5 +19,5 @@
 /**
  * SPI for applications hooking into the configuration infrastructure for parameterizing and customizing.
  */
-@org.osgi.annotation.versioning.Version("1.1.0")
+@org.osgi.annotation.versioning.Version("2.0.0")
 package org.apache.sling.caconfig.spi;