Author: sseifert
Date: Tue Sep 19 19:33:01 2017
New Revision: 1808934

URL: http://svn.apache.org/viewvc?rev=1808934&view=rev
Log:
SLING-7016 caconfig: Override is not applied for a configuration name if no 
config resource exist

Modified:
    
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/override/ConfigurationOverrideMultiplexerImpl.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ValueInfoImpl.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/multiplexer/ConfigurationOverrideMultiplexer.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverValueMapTest.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java?rev=1808934&r1=1808933&r2=1808934&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
 Tue Sep 19 19:33:01 2017
@@ -185,7 +185,7 @@ class ConfigurationBuilderImpl implement
             // apply resource inheritance
             configResource = 
configurationInheritanceStrategy.getResource(transformedResources);
             // apply overrides
-            configResource = 
configurationOverrideMultiplexer.overrideProperties(contentResource.getPath(), 
name, configResource);
+            configResource = 
configurationOverrideMultiplexer.overrideProperties(contentResource.getPath(), 
name, configResource, configResource.getResourceResolver());
             // build name
             if (configResource != null && isCollection) {
                 conversionName = conversionName + "/" + 
configResource.getName();
@@ -195,6 +195,12 @@ class ConfigurationBuilderImpl implement
             log.trace("+ Found config resource for context path " + 
contentResource.getPath() + ": " + configResource.getPath() + " "
                     + MapUtil.traceOutput(configResource.getValueMap()));
         }
+        
+        // if no config resource found still check for overrides
+        if (configResource == null && contentResource != null) {
+            configResource = 
configurationOverrideMultiplexer.overrideProperties(contentResource.getPath(), 
name, (Resource)null, contentResource.getResourceResolver());
+        }
+        
         return converter.convert(configResource, clazz, conversionName, 
isCollection);
     }
     

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/override/ConfigurationOverrideMultiplexerImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/override/ConfigurationOverrideMultiplexerImpl.java?rev=1808934&r1=1808933&r2=1808934&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/override/ConfigurationOverrideMultiplexerImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/override/ConfigurationOverrideMultiplexerImpl.java
 Tue Sep 19 19:33:01 2017
@@ -27,6 +27,9 @@ import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.SyntheticResource;
+import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.api.wrappers.ValueMapDecorator;
 import org.apache.sling.caconfig.impl.ConfigurationResourceWrapper;
 import 
org.apache.sling.caconfig.management.multiplexer.ConfigurationOverrideMultiplexer;
@@ -69,12 +72,7 @@ public class ConfigurationOverrideMultip
         items.unbind(item, props);
     }
     
-    /**
-     * Checks if the whole configuration for the given context path and name 
is overridden.
-     * @param contextPath Context path
-     * @param configName Config name
-     * @return true if the whole configuration is overridden.
-     */
+    @Override
     public boolean isAllOverridden(String contextPath, String configName) {
         for (OverrideItem override : allOverrides) {
             if (StringUtils.equals(configName, override.getConfigName()) && 
override.matchesPath(contextPath)) {
@@ -86,13 +84,7 @@ public class ConfigurationOverrideMultip
         return false;
     }
 
-    /**
-     * Override properties for given context path and configuration name.
-     * @param contextPath Path of context resource for which configuration was 
resolved
-     * @param configName Configuration name
-     * @param properties Resolved configuration properties
-     * @return Overwritten or replaced properties - or null if no override 
took place
-     */
+    @Override
     public Map<String,Object> overrideProperties(String contextPath, String 
configName, Map<String,Object> properties) {
         if (allOverrides.size() == 0) {
             return null;
@@ -118,27 +110,31 @@ public class ConfigurationOverrideMultip
         }
     }
     
-    /**
-     * Override properties in given configuration resource (if any overrides 
are defined).
-     * @param contextPath Context path
-     * @param configName Configuration name
-     * @param configResource Resolved configuration resource
-     * @return Resource with overwritten configuration properties - or 
original configuration resource if no override took place
-     */
+    @Override
     public Resource overrideProperties(String contextPath, String configName, 
Resource configResource) {
         if (configResource == null) {
             return null;
         }
-        Map<String,Object> overrideProperties = 
overrideProperties(contextPath, configName, configResource.getValueMap());
+        return overrideProperties(contextPath, configName, configResource, 
null);
+    }
+    
+    @Override
+    public Resource overrideProperties(String contextPath, String configName, 
Resource configResource, ResourceResolver resourceResolver) {
+        Map<String,Object> overrideProperties = 
overrideProperties(contextPath, configName, configResource != null ?  
configResource.getValueMap() : ValueMap.EMPTY);
         if (overrideProperties == null) {
             return configResource;
         }
+        Resource configResourceToUse = configResource;
+        if (configResourceToUse == null) {
+            // build synthetic resource if override properties exist
+            configResourceToUse = new SyntheticResource(resourceResolver, 
(String)null, (String)null);
+        }
         if (log.isTraceEnabled()) {
             log.trace("! Override properties for context path " + contextPath 
+ ", name '" + configName + "', "
-                    + "config path " + configResource.getPath() + ": "
+                    + (configResource.getPath() != null ? "config path " + 
configResource.getPath() : "no config path") + ": "
                     + MapUtil.traceOutput(configResource.getValueMap()) + " -> 
" + MapUtil.traceOutput(overrideProperties));
         }
-        return new ConfigurationResourceWrapper(configResource, new 
ValueMapDecorator(overrideProperties));
+        return new ConfigurationResourceWrapper(configResourceToUse, new 
ValueMapDecorator(overrideProperties));
     }
 
     /**

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.java?rev=1808934&r1=1808933&r2=1808934&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationDataImpl.java
 Tue Sep 19 19:33:01 2017
@@ -262,7 +262,7 @@ final class ConfigurationDataImpl implem
     @Override
     public boolean isInherited() {
         // detect if the whole config or config item was inherited
-        if (resolvedConfigurationResource != null) {
+        if (resolvedConfigurationResource != null && 
resolvedConfigurationResource.getPath() != null) {
             if (writebackConfigurationResource == null) {
                 return true;
             }

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java?rev=1808934&r1=1808933&r2=1808934&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java
 Tue Sep 19 19:33:01 2017
@@ -35,6 +35,7 @@ import org.apache.commons.collections.Tr
 import org.apache.commons.collections.iterators.ListIteratorWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.caconfig.impl.ConfigurationResourceResolverConfig;
 import org.apache.sling.caconfig.management.ConfigurationCollectionData;
 import org.apache.sling.caconfig.management.ConfigurationData;
@@ -92,7 +93,7 @@ public class ConfigurationManagerImpl im
         
         if (configResourceInheritanceChain != null) {
             ResettableIterator resettableConfigResourceInheritanceChain = new 
ListIteratorWrapper(configResourceInheritanceChain);
-            configResource = 
applyPersistenceAndInheritance(resource.getPath(), configName, 
resettableConfigResourceInheritanceChain, false);
+            configResource = 
applyPersistenceAndInheritance(resource.getPath(), configName, 
resettableConfigResourceInheritanceChain, false, 
resource.getResourceResolver());
             if (configResource != null) {
                 // get writeback resource for "reverse inheritance detection"
                 Resource writebackConfigResource = null;
@@ -122,6 +123,14 @@ public class ConfigurationManagerImpl im
             }
         }
         if (configMetadata != null) {
+            // if no config resource found still check for overrides
+            configResource = 
configurationOverrideMultiplexer.overrideProperties(resource.getPath(), 
configName, (Resource)null, resource.getResourceResolver());
+            if (configResource != null) {
+                return new ConfigurationDataImpl(configMetadata, 
configResource, null, null,
+                        resource, configName, this, 
configurationManagementSettings,
+                        configurationOverrideMultiplexer, 
configurationPersistenceStrategy, false, null);
+            }
+
             // if no config resource found but config metadata exist return 
empty config data with default values
             return new ConfigurationDataImpl(configMetadata,
                     resource, configName, this, 
configurationManagementSettings,
@@ -157,7 +166,7 @@ public class ConfigurationManagerImpl im
         if (configResourceInheritanceChains != null) {
             for (Iterator<Resource> configResourceInheritanceChain : 
configResourceInheritanceChains) {
                 ResettableIterator resettableConfigResourceInheritanceChain = 
new ListIteratorWrapper(configResourceInheritanceChain);
-                Resource configResource = 
applyPersistenceAndInheritance(resource.getPath(), configName, 
resettableConfigResourceInheritanceChain, true);
+                Resource configResource = 
applyPersistenceAndInheritance(resource.getPath(), configName, 
resettableConfigResourceInheritanceChain, true, resource.getResourceResolver());
                 resettableConfigResourceInheritanceChain.reset();
                 Resource untransformedConfigResource = 
(Resource)resettableConfigResourceInheritanceChain.next();
                 if (configResource != null) {
@@ -240,7 +249,7 @@ public class ConfigurationManagerImpl im
     }
 
     private Resource applyPersistenceAndInheritance(String contextPath, String 
configName, Iterator<Resource> configResourceInheritanceChain,
-            boolean isCollection) {
+            boolean isCollection, ResourceResolver resourceResolver) {
         if (configResourceInheritanceChain == null) {
             return null;
         }
@@ -252,7 +261,7 @@ public class ConfigurationManagerImpl im
         Resource configResource = 
configurationInheritanceStrategy.getResource(transformedConfigResources);
         
         // apply overrides
-        return 
configurationOverrideMultiplexer.overrideProperties(contextPath, configName, 
configResource);
+        return 
configurationOverrideMultiplexer.overrideProperties(contextPath, configName, 
configResource, resourceResolver);
     }
 
     @Override

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ValueInfoImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ValueInfoImpl.java?rev=1808934&r1=1808933&r2=1808934&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ValueInfoImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/impl/ValueInfoImpl.java
 Tue Sep 19 19:33:01 2017
@@ -112,7 +112,7 @@ final class ValueInfoImpl<T> implements
         if (isDefault() || effectiveValue == null) {
             return false;
         }
-        else if (resolvedConfigurationResource == null) {
+        else if (resolvedConfigurationResource == null || 
resolvedConfigurationResource.getPath() == null) {
             return false;
         }
         else if (writebackConfigurationResource == null) {

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/multiplexer/ConfigurationOverrideMultiplexer.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/multiplexer/ConfigurationOverrideMultiplexer.java?rev=1808934&r1=1808933&r2=1808934&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/multiplexer/ConfigurationOverrideMultiplexer.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/multiplexer/ConfigurationOverrideMultiplexer.java
 Tue Sep 19 19:33:01 2017
@@ -24,6 +24,7 @@ import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.osgi.annotation.versioning.ProviderType;
 
 /**
@@ -56,7 +57,20 @@ public interface ConfigurationOverrideMu
      * @param configName Configuration name
      * @param configResource Resolved configuration resource
      * @return Resource with overwritten configuration properties - or 
original configuration resource if no override took place
+     * @deprecated Please use {@link #overrideProperties(String, String, 
Resource, ResourceResolver)} instead.
      */
+    @Deprecated
     @CheckForNull Resource overrideProperties(@Nonnull String contextPath, 
@Nonnull String configName, @CheckForNull Resource configResource);
 
+    /**
+     * Override properties in given configuration resource (if any overrides 
are defined).
+     * @param contextPath Context path
+     * @param configName Configuration name
+     * @param configResource Resolved configuration resource
+     * @param resourceResolver Resource resolver
+     * @return Resource with overwritten configuration properties - or 
original configuration resource if no override took place
+     */
+    @CheckForNull Resource overrideProperties(@Nonnull String contextPath, 
@Nonnull String configName, @CheckForNull Resource configResource,
+            @Nonnull ResourceResolver resourceResolver);
+
 }

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java?rev=1808934&r1=1808933&r2=1808934&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/management/multiplexer/package-info.java
 Tue Sep 19 19:33:01 2017
@@ -19,5 +19,5 @@
 /**
  * Multiplexer services provide aggregated access to all implementations of 
the related SPI interface.
  */
[email protected]("1.0.0")
[email protected]("1.1.0")
 package org.apache.sling.caconfig.management.multiplexer;

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverValueMapTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverValueMapTest.java?rev=1808934&r1=1808933&r2=1808934&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverValueMapTest.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverValueMapTest.java
 Tue Sep 19 19:33:01 2017
@@ -161,6 +161,21 @@ public class ConfigurationResolverValueM
         assertEquals(false, props.get("boolParam", false));
     }
 
+    /**
+     * Test override for context path on which no configuration exists below 
/conf - not even on the inheritance lookup paths (SLING-7016)
+     */
+    @Test
+    public void testConfigWithOverride_NoExistingConfig() {
+        context.registerService(ConfigurationOverrideProvider.class, new 
DummyConfigurationOverrideProvider(
+                
"[/content]sampleName={\"stringParam\":\"override1\",\"intParam\":222}"));
+
+        ValueMap props = 
underTest.get(site1Page1).name("sampleName").asValueMap();
+
+        assertEquals("override1", props.get("stringParam", String.class));
+        assertEquals(222, (int)props.get("intParam", 0));
+        assertEquals(false, props.get("boolParam", false));
+    }
+
     @Test
     public void testConfigCollectionWithOverride() {
         context.registerService(ConfigurationOverrideProvider.class, new 
DummyConfigurationOverrideProvider(

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java?rev=1808934&r1=1808933&r2=1808934&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImplTest.java
 Tue Sep 19 19:33:01 2017
@@ -30,7 +30,9 @@ import static org.mockito.Mockito.when;
 
 import java.util.List;
 
+import org.apache.sling.api.resource.PersistenceException;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.caconfig.impl.ConfigurationTestUtils;
 import org.apache.sling.caconfig.impl.def.ConfigurationDefNameConstants;
@@ -308,6 +310,35 @@ public class ConfigurationManagerImplTes
         assertEquals("override1", configData.getEffectiveValues().get("prop1", 
String.class));
         assertEquals((Integer)5, configData.getEffectiveValues().get("prop3", 
0));
 
+        assertFalse(configData.getValueInfo("prop1").isInherited());
+        assertTrue(configData.getValueInfo("prop1").isOverridden());
+        assertFalse(configData.getValueInfo("prop3").isInherited());
+        assertTrue(configData.getValueInfo("prop3").isOverridden());
+    }
+
+    /**
+     * Test override for context path on which no configuration exists below 
/conf - not even on the inheritance lookup paths (SLING-7016)
+     */
+    @Test
+    public void testGetConfiguration_WithOverride_NoExistingConfig() throws 
PersistenceException {
+        context.registerService(ConfigurationOverrideProvider.class, new 
DummyConfigurationOverrideProvider(
+                "[/content]" + CONFIG_NAME + "={\"prop1\":\"override1\"}"));
+        
+        // delete all existing config
+        ResourceResolver resolver = context.resourceResolver();
+        Resource existingConf = resolver.getResource("/conf/test");
+        resolver.delete(existingConf);
+        
+        ConfigurationData configData = 
underTest.getConfiguration(contextResource, CONFIG_NAME);
+        assertNotNull(configData);
+        assertFalse(configData.isInherited());
+        assertTrue(configData.isOverridden());
+
+        assertEquals(ImmutableSet.of("prop1", "prop2", "prop3"), 
configData.getPropertyNames());
+        assertNull(configData.getValues().get("prop1", String.class));
+        assertEquals("override1", configData.getEffectiveValues().get("prop1", 
String.class));
+        assertEquals((Integer)5, configData.getEffectiveValues().get("prop3", 
0));
+
         assertFalse(configData.getValueInfo("prop1").isInherited());
         assertTrue(configData.getValueInfo("prop1").isOverridden());
         assertFalse(configData.getValueInfo("prop3").isInherited());


Reply via email to