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