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

svn commit: r1773446 - in /sling/trunk/contrib/extensions/contextaware-config: impl/src/main/java/org/apache/sling/caconfig/impl/ impl/src/main/java/org/apache/sling/caconfig/management/impl/ impl/src/test/java/org/apache/sling/caconfig/example/ impl/s...

Author: sseifert
Date: Fri Dec  9 17:52:44 2016
New Revision: 1773446

URL: http://svn.apache.org/viewvc?rev=1773446&view=rev
Log:
SLING-6385 Context-Aware Config: Support default values in ConfigurationResolver for ValueMaps

Added:
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/DummyConfigurationMetadataProvider.java   (with props)
Modified:
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResolverImpl.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/example/SimpleSlingModel.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAdaptableTest.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverValueMapTest.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationTestUtils.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/metadata/ConfigurationMetadataProviderMultiplexerTest.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/console/CAConfigInventoryPrinterTest.java
    sling/trunk/contrib/extensions/contextaware-config/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/ContextPlugins.java

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java?rev=1773446&r1=1773445&r2=1773446&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java Fri Dec  9 17:52:44 2016
@@ -21,13 +21,17 @@ package org.apache.sling.caconfig.impl;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 
 import org.apache.commons.collections.IteratorUtils;
 import org.apache.commons.collections.Transformer;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.wrappers.ValueMapDecorator;
 import org.apache.sling.caconfig.ConfigurationBuilder;
 import org.apache.sling.caconfig.ConfigurationResolveException;
 import org.apache.sling.caconfig.ConfigurationResolver;
@@ -38,7 +42,10 @@ import org.apache.sling.caconfig.resourc
 import org.apache.sling.caconfig.resource.impl.util.MapUtil;
 import org.apache.sling.caconfig.resource.spi.ConfigurationResourceResolvingStrategy;
 import org.apache.sling.caconfig.spi.ConfigurationInheritanceStrategy;
+import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceStrategy;
+import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
+import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -50,6 +57,7 @@ class ConfigurationBuilderImpl implement
     private final ConfigurationPersistenceStrategy configurationPersistenceStrategy;
     private final ConfigurationInheritanceStrategy configurationInheritanceStrategy;
     private final ConfigurationOverrideManager configurationOverrideManager;
+    private final ConfigurationMetadataProvider configurationMetadataProvider;
     private final Collection<String> configBucketNames;
 
     private String configName;
@@ -62,6 +70,7 @@ class ConfigurationBuilderImpl implement
             final ConfigurationPersistenceStrategy configurationPersistenceStrategy,
             final ConfigurationInheritanceStrategy configurationInheritanceStrategy,
             final ConfigurationOverrideManager configurationOverrideManager,
+            final ConfigurationMetadataProvider configurationMetadataProvider,
             final Collection<String> configBucketNames) {
         this.contentResource = resource;
         this.configurationResolver = configurationResolver;
@@ -69,6 +78,7 @@ class ConfigurationBuilderImpl implement
         this.configurationPersistenceStrategy = configurationPersistenceStrategy;
         this.configurationInheritanceStrategy = configurationInheritanceStrategy;
         this.configurationOverrideManager = configurationOverrideManager;
+        this.configurationMetadataProvider = configurationMetadataProvider;
         this.configBucketNames = configBucketNames;
     }
 
@@ -94,42 +104,42 @@ class ConfigurationBuilderImpl implement
      * @param <T> Target class
      */
     private interface Converter<T> {
-        T convert(Resource resource, Class<T> clazz, String name);
+        T convert(Resource resource, Class<T> clazz, String configName);
     }
 
     /**
      * Get singleton configuration resource and convert it to the desired target class.
-     * @param name Configuration name
+     * @param configName Configuration name
      * @param clazz Target class
      * @param converter Conversion method
      * @return Converted singleton configuration
      */
-    private <T> T getConfigResource(String name, Class<T> clazz, Converter<T> converter) {
+    private <T> T getConfigResource(String configName, Class<T> clazz, Converter<T> converter) {
         Iterator<Resource> resourceInheritanceChain = null;
         if (this.contentResource != null) {
-            validateConfigurationName(name);
+            validateConfigurationName(configName);
             resourceInheritanceChain = this.configurationResourceResolvingStrategy
-                    .getResourceInheritanceChain(this.contentResource, configBucketNames, name);
+                    .getResourceInheritanceChain(this.contentResource, configBucketNames, configName);
         }
-        return convert(resourceInheritanceChain, clazz, converter, name, false);
+        return convert(resourceInheritanceChain, clazz, converter, configName, false);
     }
 
     /**
      * Get configuration resource collection and convert it to the desired target class.
-     * @param name Configuration name
+     * @param configName Configuration name
      * @param clazz Target class
      * @param converter Conversion method
      * @return Converted configuration collection
      */
-    private <T> Collection<T> getConfigResourceCollection(String name, Class<T> clazz, Converter<T> converter) {
+    private <T> Collection<T> getConfigResourceCollection(String configName, Class<T> clazz, Converter<T> converter) {
         if (this.contentResource != null) {
-           validateConfigurationName(name);
+           validateConfigurationName(configName);
            final Collection<T> result = new ArrayList<>();
            Collection<Iterator<Resource>> resourceInheritanceChains = this.configurationResourceResolvingStrategy
-                   .getResourceCollectionInheritanceChain(this.contentResource, configBucketNames, name);;
+                   .getResourceCollectionInheritanceChain(this.contentResource, configBucketNames, configName);;
            if (resourceInheritanceChains != null) {
                for (final Iterator<Resource> resourceInheritanceChain : resourceInheritanceChains) {
-                   final T obj = convert(resourceInheritanceChain, clazz, converter, name, true);
+                   final T obj = convert(resourceInheritanceChain, clazz, converter, configName, true);
                    if (obj != null) {
                        result.add(obj);
                    }
@@ -171,6 +181,37 @@ class ConfigurationBuilderImpl implement
         }
         return converter.convert(configResource, clazz, conversionName);
     }
+    
+    /**
+     * Apply default values from configuration metadata (where no real data is present).
+     * @param props Properties
+     * @param configName Configuration name
+     * @return null if default values found, or a new map with added default properties.
+     */
+    private Map<String,Object> applyDefaultValues(Map<String,Object> props, String configName) {
+        ConfigurationMetadata metadata = configurationMetadataProvider.getConfigurationMetadata(configName);
+        if (metadata == null) {
+            // probably a configuration list - remove item name from end
+            if (StringUtils.contains(configName, "/")) {
+                String partialConfigName = StringUtils.substringBeforeLast(configName, "/");
+                metadata = configurationMetadataProvider.getConfigurationMetadata(partialConfigName);
+            }
+            if (metadata == null) {
+                return null;
+            }
+        }
+        Map<String,Object> updatedMap = new HashMap<>();
+        for (PropertyMetadata<?> propertyMetadata : metadata.getPropertyMetadata().values()) {
+            if (propertyMetadata.getDefaultValue() != null) {
+                updatedMap.put(propertyMetadata.getName(), propertyMetadata.getDefaultValue());
+            }
+        }
+        if (updatedMap.isEmpty()) {
+            return null;
+        }
+        updatedMap.putAll(props);
+        return updatedMap;
+    }
 
     // --- Annotation class support ---
 
@@ -204,10 +245,10 @@ class ConfigurationBuilderImpl implement
 
     private class AnnotationConverter<T> implements Converter<T> {
         @Override
-        public T convert(final Resource resource, final Class<T> clazz, final String name) {
+        public T convert(final Resource resource, final Class<T> clazz, final String configName) {
             return ConfigurationProxy.get(resource, clazz, new ChildResolver() {
-                private ConfigurationBuilder getConfiguration(String configName) {
-                    String childName = configurationPersistenceStrategy.getResourcePath(name) + "/" + configName;
+                private ConfigurationBuilder getConfiguration(String nestedConfigName) {
+                    String childName = configurationPersistenceStrategy.getResourcePath(configName) + "/" + nestedConfigName;
                     return configurationResolver.get(contentResource).name(childName);
                 }
                 @Override
@@ -240,10 +281,17 @@ class ConfigurationBuilderImpl implement
         return getConfigResourceCollection(this.configName, ValueMap.class, new ValueMapConverter());
     }
 
-    private static class ValueMapConverter implements Converter<ValueMap> {
+    private class ValueMapConverter implements Converter<ValueMap> {
         @Override
-        public ValueMap convert(Resource resource, Class<ValueMap> clazz, String name) {
-            return ResourceUtil.getValueMap(resource);
+        public ValueMap convert(Resource resource, Class<ValueMap> clazz, String configName) {
+            ValueMap props = ResourceUtil.getValueMap(resource);
+            Map<String,Object> updatedMap = applyDefaultValues(props, configName);
+            if (updatedMap != null) {
+                return new ValueMapDecorator(updatedMap);
+            }
+            else {
+                return props;
+            }
         }
     }
     
@@ -265,9 +313,9 @@ class ConfigurationBuilderImpl implement
         return getConfigResourceCollection(this.configName, clazz, new AdaptableConverter<T>());
     }
 
-    private static class AdaptableConverter<T> implements Converter<T> {
+    private class AdaptableConverter<T> implements Converter<T> {
         @Override
-        public T convert(Resource resource, Class<T> clazz, String name) {
+        public T convert(Resource resource, Class<T> clazz, String configName) {
             if (resource == null || clazz == ConfigurationBuilder.class) {
                 return null;
             }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResolverImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResolverImpl.java?rev=1773446&r1=1773445&r2=1773446&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResolverImpl.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResolverImpl.java Fri Dec  9 17:52:44 2016
@@ -28,6 +28,7 @@ import org.apache.commons.lang3.ArrayUti
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.caconfig.ConfigurationBuilder;
 import org.apache.sling.caconfig.ConfigurationResolver;
+import org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.impl.override.ConfigurationOverrideManager;
 import org.apache.sling.caconfig.management.impl.ConfigurationPersistenceStrategyMultiplexer;
 import org.apache.sling.caconfig.resource.impl.ConfigurationResourceResolvingStrategyMultiplexer;
@@ -50,6 +51,8 @@ public class ConfigurationResolverImpl i
     private ConfigurationInheritanceStrategyMultiplexer configurationInheritanceStrategy;
     @Reference
     private ConfigurationOverrideManager configurationOverrideManager;
+    @Reference
+    private ConfigurationMetadataProviderMultiplexer configurationMetadataProvider;
     
     @ObjectClassDefinition(name="Apache Sling Context-Aware Configuration Resolver",
             description="Getting context-aware configurations for a given resource context.")
@@ -79,7 +82,7 @@ public class ConfigurationResolverImpl i
     public ConfigurationBuilder get(Resource resource) {
         return new ConfigurationBuilderImpl(resource, this,
                 configurationResourceResolvingStrategy, configurationPersistenceStrategy,
-                configurationInheritanceStrategy, configurationOverrideManager,
+                configurationInheritanceStrategy, configurationOverrideManager, configurationMetadataProvider,
                 configBucketNames);
     }
 

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=1773446&r1=1773445&r2=1773446&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 Fri Dec  9 17:52:44 2016
@@ -136,7 +136,7 @@ final class ConfigurationDataImpl implem
         if (valuesCache == null) {
             Map<String,Object> props = new HashMap<>();
             if (writebackConfigurationResource != null) {
-                props.putAll( ResourceUtil.getValueMap(writebackConfigurationResource));
+                props.putAll(ResourceUtil.getValueMap(writebackConfigurationResource));
             }
             PropertiesFilterUtil.removeIgnoredProperties(props);
             resolveNestedConfigs(props);

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/example/SimpleSlingModel.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/example/SimpleSlingModel.java?rev=1773446&r1=1773445&r2=1773446&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/example/SimpleSlingModel.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/example/SimpleSlingModel.java Fri Dec  9 17:52:44 2016
@@ -28,4 +28,10 @@ public interface SimpleSlingModel {
     @ValueMapValue(name="stringParam")
     String getStringParam();
     
+    @ValueMapValue(name="intParam", optional = true)
+    int getIntParam();
+    
+    @ValueMapValue(name="boolParam", optional = true)
+    boolean getBoolParam();
+    
 }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAdaptableTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAdaptableTest.java?rev=1773446&r1=1773445&r2=1773446&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAdaptableTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAdaptableTest.java Fri Dec  9 17:52:44 2016
@@ -80,10 +80,12 @@ public class ConfigurationResolverAdapta
 
         SimpleSlingModel model = underTest.get(site1Page1).name("sampleName").asAdaptable(SimpleSlingModel.class);
         assertEquals("configValue1", model.getStringParam());
+        assertEquals(111, model.getIntParam());
+        assertEquals(true, model.getBoolParam());
     }
 
     @Test
-    public void testConfig_ValueMapCollection() {
+    public void testConfigCollection() {
         context.build().resource("/conf/content/site1/sling:configs/sampleList")
             .siblingsMode()
             .resource("1", "stringParam", "configValue1.1")
@@ -98,6 +100,45 @@ public class ConfigurationResolverAdapta
         assertEquals("configValue1.3", propsIterator.next().getStringParam());
     }
 
+    /*
+     -- this is currently not supported --
+    @Test
+    public void testConfigWithDefaultValues() {
+        context.registerService(ConfigurationMetadataProvider.class, new DummyConfigurationMetadataProvider("sampleName", 
+                ImmutableMap.<String, Object>of("stringParam", "defValue1", "intParam", 999), false));
+
+        context.build().resource("/conf/content/site1/sling:configs/sampleName",
+                "boolParam", true);
+
+        SimpleSlingModel model = underTest.get(site1Page1).name("sampleName").asAdaptable(SimpleSlingModel.class);
+        assertEquals("defValue1", model.getStringParam());
+        assertEquals(999, model.getIntParam());
+        assertEquals(true, model.getBoolParam());
+    }
+
+    @Test
+    public void testConfigCollectionWithDefaultValues() {
+        context.registerService(ConfigurationMetadataProvider.class, new DummyConfigurationMetadataProvider("sampleList", 
+                ImmutableMap.<String, Object>of("intParam", 999), true));
+
+        context.build().resource("/conf/content/site1/sling:configs/sampleList")
+            .siblingsMode()
+            .resource("1", "stringParam", "configValue1.1")
+            .resource("2", "stringParam", "configValue1.2")
+            .resource("3", "stringParam", "configValue1.3");
+
+        List<SimpleSlingModel> propsList = ImmutableList.copyOf(underTest.get(site1Page1).name("sampleList").asAdaptableCollection(SimpleSlingModel.class));
+
+        assertEquals("configValue1.1", propsList.get(0).getStringParam());
+        assertEquals(999, propsList.get(0).getIntParam());
+        assertEquals("configValue1.2", propsList.get(1).getStringParam());
+        assertEquals(999, propsList.get(1).getIntParam());
+        assertEquals("configValue1.3", propsList.get(2).getStringParam());
+        assertEquals(999, propsList.get(2).getIntParam());
+    }
+    -- end --
+    */
+
     @Test
     public void testNonExistingContentResource() {
         SimpleSlingModel model = underTest.get(null).name("sampleName").asAdaptable(SimpleSlingModel.class);

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverValueMapTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverValueMapTest.java?rev=1773446&r1=1773445&r2=1773446&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverValueMapTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverValueMapTest.java Fri Dec  9 17:52:44 2016
@@ -25,18 +25,23 @@ import static org.junit.Assert.assertTru
 
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.caconfig.ConfigurationResolveException;
 import org.apache.sling.caconfig.ConfigurationResolver;
 import org.apache.sling.caconfig.impl.override.DummyConfigurationOverrideProvider;
+import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
 import org.apache.sling.caconfig.spi.ConfigurationOverrideProvider;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
 /**
  * Test {@link ConfigurationResolver} with ValueMap for reading the config.
  */
@@ -104,6 +109,42 @@ public class ConfigurationResolverValueM
     }
 
     @Test
+    public void testConfigWithDefaultValues() {
+        context.registerService(ConfigurationMetadataProvider.class, new DummyConfigurationMetadataProvider("sampleName", 
+                ImmutableMap.<String, Object>of("stringParam", "defValue1", "intParam", 999), false));
+        
+        context.build().resource("/conf/content/site1/sling:configs/sampleName", 
+                "boolParam", true);
+
+        ValueMap props = underTest.get(site1Page1).name("sampleName").asValueMap();
+
+        assertEquals("defValue1", props.get("stringParam", String.class));
+        assertEquals(999, (int)props.get("intParam", 0));
+        assertEquals(true, props.get("boolParam", false));
+    }
+
+    @Test
+    public void testConfigCollectionWithDefaultValues() {
+        context.registerService(ConfigurationMetadataProvider.class, new DummyConfigurationMetadataProvider("sampleList", 
+                ImmutableMap.<String, Object>of("intParam", 999), true));
+
+        context.build().resource("/conf/content/site1/sling:configs/sampleList")
+            .siblingsMode()
+            .resource("1", "stringParam", "configValue1.1")
+            .resource("2", "stringParam", "configValue1.2")
+            .resource("3", "stringParam", "configValue1.3");
+
+        List<ValueMap> propsList = ImmutableList.copyOf(underTest.get(site1Page1).name("sampleList").asValueMapCollection());
+
+        assertEquals("configValue1.1", propsList.get(0).get("stringParam", String.class));
+        assertEquals(999, (int)propsList.get(0).get("intParam", 0));
+        assertEquals("configValue1.2", propsList.get(1).get("stringParam", String.class));
+        assertEquals(999, (int)propsList.get(1).get("intParam", 0));
+        assertEquals("configValue1.3", propsList.get(2).get("stringParam", String.class));
+        assertEquals(999, (int)propsList.get(2).get("intParam", 0));
+    }
+
+    @Test
     public void testConfigWithOverride() {
         context.registerService(ConfigurationOverrideProvider.class, new DummyConfigurationOverrideProvider(
                 "[/content]sampleName={stringParam='override1',intParam=222}"));

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationTestUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationTestUtils.java?rev=1773446&r1=1773445&r2=1773446&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationTestUtils.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationTestUtils.java Fri Dec  9 17:52:44 2016
@@ -21,6 +21,7 @@ package org.apache.sling.caconfig.impl;
 import org.apache.sling.caconfig.ConfigurationResolver;
 import org.apache.sling.caconfig.impl.def.DefaultConfigurationInheritanceStrategy;
 import org.apache.sling.caconfig.impl.def.DefaultConfigurationPersistenceStrategy;
+import org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.impl.override.ConfigurationOverrideManager;
 import org.apache.sling.caconfig.management.impl.ConfigurationPersistenceStrategyMultiplexer;
 import org.apache.sling.caconfig.resource.impl.ConfigurationResourceTestUtils;
@@ -43,6 +44,7 @@ public final class ConfigurationTestUtil
         context.registerInjectActivateService(new DefaultConfigurationInheritanceStrategy());
         context.registerInjectActivateService(new ConfigurationInheritanceStrategyMultiplexer());
         context.registerInjectActivateService(new ConfigurationOverrideManager());
+        context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer());
         return context.registerInjectActivateService(new ConfigurationResolverImpl(), properties);
     }
     
@@ -56,6 +58,7 @@ public final class ConfigurationTestUtil
         context.registerInjectActivateService(new ConfigurationPersistenceStrategyMultiplexer());
         context.registerInjectActivateService(new ConfigurationInheritanceStrategyMultiplexer());
         context.registerInjectActivateService(new ConfigurationOverrideManager());
+        context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer());
         return context.registerInjectActivateService(new ConfigurationResolverImpl(), properties);
     }
     

Added: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/DummyConfigurationMetadataProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/DummyConfigurationMetadataProvider.java?rev=1773446&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/DummyConfigurationMetadataProvider.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/DummyConfigurationMetadataProvider.java Fri Dec  9 17:52:44 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.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
+import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
+import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
+
+import com.google.common.collect.ImmutableSortedSet;
+
+class DummyConfigurationMetadataProvider implements ConfigurationMetadataProvider {
+
+    private final String configName;
+    private final Map<String,Object> defaultValues;
+    private final boolean collection;
+    
+    public DummyConfigurationMetadataProvider(String configName, Map<String, Object> defaultValues, boolean collection) {
+        this.configName = configName;
+        this.defaultValues = defaultValues;
+        this.collection = collection;
+    }
+    
+    @Override
+    public SortedSet<String> getConfigurationNames() {
+        return ImmutableSortedSet.of(configName);
+    }
+    
+    @Override
+    public ConfigurationMetadata getConfigurationMetadata(String configName) {
+        if (!StringUtils.equals(this.configName, configName)) {
+            return null;
+        }
+        List<PropertyMetadata<?>> properties = new ArrayList<>();
+        for (Map.Entry<String, Object> entry : defaultValues.entrySet()) {
+            properties.add(new PropertyMetadata<>(entry.getKey(), entry.getValue()));
+        }
+        return new ConfigurationMetadata(configName, properties, collection);
+    }
+
+}

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

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/DummyConfigurationMetadataProvider.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Fri Dec  9 17:52:44 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/impl/DummyConfigurationMetadataProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/metadata/ConfigurationMetadataProviderMultiplexerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/metadata/ConfigurationMetadataProviderMultiplexerTest.java?rev=1773446&r1=1773445&r2=1773446&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/metadata/ConfigurationMetadataProviderMultiplexerTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/metadata/ConfigurationMetadataProviderMultiplexerTest.java Fri Dec  9 17:52:44 2016
@@ -27,6 +27,8 @@ import java.util.Map;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
+import org.apache.sling.caconfig.impl.def.DefaultConfigurationPersistenceStrategy;
+import org.apache.sling.caconfig.management.impl.ConfigurationPersistenceStrategyMultiplexer;
 import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
 import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
 import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
@@ -47,6 +49,8 @@ public class ConfigurationMetadataProvid
 
     @Before
     public void setUp() {
+        context.registerInjectActivateService(new ConfigurationPersistenceStrategyMultiplexer());
+        context.registerInjectActivateService(new DefaultConfigurationPersistenceStrategy());
         underTest = context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer());
     }
     

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=1773446&r1=1773445&r2=1773446&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 Fri Dec  9 17:52:44 2016
@@ -29,7 +29,6 @@ import java.util.List;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.caconfig.impl.ConfigurationTestUtils;
-import org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.management.ConfigurationData;
 import org.apache.sling.caconfig.management.ConfigurationManager;
 import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
@@ -69,7 +68,6 @@ public class ConfigurationManagerImplNoD
     @Before
     public void setUp() {
         context.registerService(ConfigurationMetadataProvider.class, configurationMetadataProvider);
-        context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer());
         ConfigurationTestUtils.registerConfigurationResolverWithoutDefaultImpl(context);
         underTest = context.registerInjectActivateService(new ConfigurationManagerImpl());
         

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=1773446&r1=1773445&r2=1773446&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 Fri Dec  9 17:52:44 2016
@@ -34,7 +34,6 @@ import org.apache.sling.api.resource.Res
 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;
@@ -82,7 +81,6 @@ public class ConfigurationManagerImplTes
     @Before
     public void setUp() {
         context.registerService(ConfigurationMetadataProvider.class, configurationMetadataProvider);
-        context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer());
         ConfigurationTestUtils.registerConfigurationResolver(context,
                 "configBucketNames", getAlternativeBucketNames());
         underTest = context.registerInjectActivateService(new ConfigurationManagerImpl());

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/console/CAConfigInventoryPrinterTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/console/CAConfigInventoryPrinterTest.java?rev=1773446&r1=1773445&r2=1773446&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/console/CAConfigInventoryPrinterTest.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/management/impl/console/CAConfigInventoryPrinterTest.java Fri Dec  9 17:52:44 2016
@@ -29,7 +29,6 @@ import org.apache.felix.inventory.Format
 import org.apache.sling.caconfig.impl.ConfigurationTestUtils;
 import org.apache.sling.caconfig.impl.def.DefaultConfigurationInheritanceStrategy;
 import org.apache.sling.caconfig.impl.def.DefaultConfigurationPersistenceStrategy;
-import org.apache.sling.caconfig.impl.metadata.ConfigurationMetadataProviderMultiplexer;
 import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
 import org.apache.sling.caconfig.spi.ConfigurationOverrideProvider;
 import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
@@ -64,7 +63,6 @@ public class CAConfigInventoryPrinterTes
     @Before
     public void setUp() {
         context.registerService(ConfigurationMetadataProvider.class, configurationMetadataProvider);
-        context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer());
         context.registerService(ConfigurationOverrideProvider.class, configurationOverrideProvider);
         ConfigurationTestUtils.registerConfigurationResolver(context);
         underTest = context.registerInjectActivateService(new CAConfigInventoryPrinter());

Modified: sling/trunk/contrib/extensions/contextaware-config/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/ContextPlugins.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/ContextPlugins.java?rev=1773446&r1=1773445&r2=1773446&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/ContextPlugins.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/testing/mocks/caconfig-mock-plugin/src/main/java/org/apache/sling/testing/mock/caconfig/ContextPlugins.java Fri Dec  9 17:52:44 2016
@@ -104,6 +104,7 @@ public final class ContextPlugins {
      */
     private static void registerConfigurationResolver(SlingContextImpl context) {
         context.registerInjectActivateService(new ConfigurationPersistenceStrategyMultiplexer());
+        context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer());
         
         // only required for impl 1.2+
         registerByClassName(context, "org.apache.sling.caconfig.impl.ConfigurationInheritanceStrategyMultiplexer");
@@ -127,7 +128,6 @@ public final class ContextPlugins {
     }
 
     private static void registerConfigurationManagement(SlingContextImpl context) {
-        context.registerInjectActivateService(new ConfigurationMetadataProviderMultiplexer());
         context.registerInjectActivateService(new ConfigurationManagerImpl());
         context.registerInjectActivateService(new AnnotationClassConfigurationMetadataProvider());
     }