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 2017/09/19 19:33:02 UTC
svn commit: r1808934 - in /sling/trunk/bundles/extensions/caconfig/impl/src:
main/java/org/apache/sling/caconfig/impl/
main/java/org/apache/sling/caconfig/impl/override/
main/java/org/apache/sling/caconfig/management/impl/
main/java/org/apache/sling/ca...
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.
*/
-@org.osgi.annotation.versioning.Version("1.0.0")
+@org.osgi.annotation.versioning.Version("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());