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/11 13:54:48 UTC
svn commit: r1773571 - in
/sling/trunk/contrib/extensions/contextaware-config/impl/src:
main/java/org/apache/sling/caconfig/impl/
test/java/org/apache/sling/caconfig/impl/
Author: sseifert
Date: Sun Dec 11 13:54:48 2016
New Revision: 1773571
URL: http://svn.apache.org/viewvc?rev=1773571&view=rev
Log:
SLING-6385 Context-Aware Config: Support default values in ConfigurationResolver also for ValueMaps adapted for Sling Models
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/ConfigurationResourceWrapper.java
sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAdaptableTest.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=1773571&r1=1773570&r2=1773571&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 Sun Dec 11 13:54:48 2016
@@ -184,9 +184,26 @@ class ConfigurationBuilderImpl implement
/**
* Apply default values from configuration metadata (where no real data is present).
+ * @param resource Resource
+ * @param configName Configuration name
+ * @return null if no default values found, or a wrapped resource with added default properties.
+ */
+ private Resource applyDefaultValues(Resource resource, String configName) {
+ if (resource == null) {
+ return null;
+ }
+ Map<String,Object> updatedMap = applyDefaultValues(resource.getValueMap(), configName);
+ if (updatedMap == null) {
+ return resource;
+ }
+ return new ConfigurationResourceWrapper(resource, new ValueMapDecorator(updatedMap));
+ }
+
+ /**
+ * 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.
+ * @return null if no 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);
@@ -319,7 +336,7 @@ class ConfigurationBuilderImpl implement
if (resource == null || clazz == ConfigurationBuilder.class) {
return null;
}
- return resource.adaptTo(clazz);
+ return applyDefaultValues(resource, configName).adaptTo(clazz);
}
}
Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceWrapper.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceWrapper.java?rev=1773571&r1=1773570&r2=1773571&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceWrapper.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationResourceWrapper.java Sun Dec 11 13:54:48 2016
@@ -18,34 +18,40 @@
*/
package org.apache.sling.caconfig.impl;
+import java.util.Iterator;
+
+import org.apache.sling.api.adapter.SlingAdaptable;
import org.apache.sling.api.resource.Resource;
-import org.apache.sling.api.resource.ResourceWrapper;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
/**
* Wrapper that returns an enhanced value map for the resource
* providing a merged map with all inherited property values.
+ * Unfortunately it's not possible to use {@link org.apache.sling.api.resource.ResourceWrapper} because when adapting
+ * to a Sling Model the replace valuemap would not take effect but the original value map.
*/
-public final class ConfigurationResourceWrapper extends ResourceWrapper {
+public final class ConfigurationResourceWrapper extends SlingAdaptable implements Resource {
+ private final Resource resource;
private final ValueMap props;
public ConfigurationResourceWrapper(Resource resource, ValueMap props) {
- super(unwrap(resource));
+ this.resource = unwrap(resource);
this.props = props;
}
private static Resource unwrap(Resource resource) {
if (resource instanceof ConfigurationResourceWrapper) {
- return ((ConfigurationResourceWrapper)resource).getResource();
+ return ((ConfigurationResourceWrapper)resource).resource;
}
else {
return resource;
}
}
-
+
@SuppressWarnings("unchecked")
- @Override
public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
if (type == ValueMap.class) {
return (AdapterType)props;
@@ -53,9 +59,74 @@ public final class ConfigurationResource
return super.adaptTo(type);
}
- @Override
public ValueMap getValueMap() {
return props;
}
+
+ public String getPath() {
+ return resource.getPath();
+ }
+
+ public String getName() {
+ return resource.getName();
+ }
+
+ public Resource getParent() {
+ return resource.getParent();
+ }
+
+ public Iterator<Resource> listChildren() {
+ return resource.listChildren();
+ }
+
+ public Iterable<Resource> getChildren() {
+ return resource.getChildren();
+ }
+
+ public Resource getChild(String relPath) {
+ return resource.getChild(relPath);
+ }
+
+ public String getResourceType() {
+ return resource.getResourceType();
+ }
+
+ public String getResourceSuperType() {
+ return resource.getResourceSuperType();
+ }
+
+ public boolean hasChildren() {
+ return resource.hasChildren();
+ }
+
+ public boolean isResourceType(String resourceType) {
+ return resource.isResourceType(resourceType);
+ }
+
+ public ResourceMetadata getResourceMetadata() {
+ return resource.getResourceMetadata();
+ }
+
+ public ResourceResolver getResourceResolver() {
+ return resource.getResourceResolver();
+ }
+ /**
+ * Returns a string representation of this wrapper consisting of the class'
+ * simple name, the {@link #getResourceType() resource type} and
+ * {@link #getPath() path} as well as the string representation of the
+ * {@link #getResource() wrapped resource}.
+ */
+ @Override
+ public String toString() {
+ final String className;
+ if (getClass().getSimpleName().length() == 0) {
+ className = getClass().getName();
+ } else {
+ className = getClass().getSimpleName();
+ }
+ return className + ", type=" + getResourceType()
+ + ", path=" + getPath() + ", resource=[" + resource + "]";
+ }
+
}
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=1773571&r1=1773570&r2=1773571&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 Sun Dec 11 13:54:48 2016
@@ -25,17 +25,22 @@ 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.caconfig.ConfigurationBuilder;
import org.apache.sling.caconfig.ConfigurationResolveException;
import org.apache.sling.caconfig.ConfigurationResolver;
import org.apache.sling.caconfig.example.SimpleSlingModel;
+import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
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 custom adaptions (in this case: Sling Models) for reading the config.
*/
@@ -100,8 +105,6 @@ 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",
@@ -136,8 +139,6 @@ public class ConfigurationResolverAdapta
assertEquals("configValue1.3", propsList.get(2).getStringParam());
assertEquals(999, propsList.get(2).getIntParam());
}
- -- end --
- */
@Test
public void testNonExistingContentResource() {