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());