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/08 23:26:43 UTC

svn commit: r1773313 - in /sling/trunk/contrib/extensions/contextaware-config/impl/src: main/java/org/apache/sling/caconfig/impl/ main/java/org/apache/sling/caconfig/impl/def/ main/java/org/apache/sling/caconfig/impl/metadata/ main/java/org/apache/slin...

Author: sseifert
Date: Thu Dec  8 23:26:43 2016
New Revision: 1773313

URL: http://svn.apache.org/viewvc?rev=1773313&view=rev
Log:
add consistent (and hopefully useful) debugging and trace logging

Added:
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/MapUtil.java   (with props)
    sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/util/MapUtilTest.java   (with props)
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/def/DefaultConfigurationInheritanceStrategy.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategy.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassConfigurationMetadataProvider.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/BundleConfigurationMapping.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/override/ConfigurationOverrideManager.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/override/OverrideItem.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultContextPathStrategy.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=1773313&r1=1773312&r2=1773313&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 Thu Dec  8 23:26:43 2016
@@ -35,9 +35,12 @@ import org.apache.sling.caconfig.impl.Co
 import org.apache.sling.caconfig.impl.metadata.AnnotationClassParser;
 import org.apache.sling.caconfig.impl.override.ConfigurationOverrideManager;
 import org.apache.sling.caconfig.resource.impl.util.ConfigNameUtil;
+import org.apache.sling.caconfig.resource.impl.util.MapUtil;
 import org.apache.sling.caconfig.resource.spi.ConfigurationResourceResolvingStrategy;
 import org.apache.sling.caconfig.spi.ConfigurationInheritanceStrategy;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceStrategy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 class ConfigurationBuilderImpl implements ConfigurationBuilder {
 
@@ -51,6 +54,8 @@ class ConfigurationBuilderImpl implement
 
     private String configName;
 
+    private static final Logger log = LoggerFactory.getLogger(ConfigurationBuilderImpl.class);
+    
     public ConfigurationBuilderImpl(final Resource resource,
             final ConfigurationResolver configurationResolver,
             final ConfigurationResourceResolvingStrategy configurationResourceResolvingStrategy,
@@ -160,6 +165,10 @@ class ConfigurationBuilderImpl implement
                 conversionName = conversionName + "/" + configResource.getName();
             }
         }
+        if (log.isTraceEnabled() && configResource != null) {
+            log.trace("Found config resource for context path " + contentResource.getPath() + ": " + configResource.getPath() + " "
+                    + MapUtil.traceOutput(configResource.getValueMap()));
+        }
         return converter.convert(configResource, clazz, conversionName);
     }
 
@@ -168,12 +177,18 @@ class ConfigurationBuilderImpl implement
     @Override
     public <T> T as(final Class<T> clazz) {
         final String name = getConfigurationNameForAnnotationClass(clazz);
+        if (log.isDebugEnabled()) {
+            log.debug("Get configuration for context path {}, name '{}', class {}", contentResource.getPath(), name, clazz.getName());
+        }
         return getConfigResource(name, clazz, new AnnotationConverter<T>());
     }
 
     @Override
     public <T> Collection<T> asCollection(Class<T> clazz) {
         final String name = getConfigurationNameForAnnotationClass(clazz);
+        if (log.isDebugEnabled()) {
+            log.debug("Get configuration collection for context path {}, name '{}', class {}", contentResource.getPath(), name, clazz.getName());
+        }
         return getConfigResourceCollection(name, clazz, new AnnotationConverter<T>());
     }
 
@@ -211,11 +226,17 @@ class ConfigurationBuilderImpl implement
 
     @Override
     public ValueMap asValueMap() {
+        if (log.isDebugEnabled()) {
+            log.debug("Get ValueMap for context path {}, name '{}'", contentResource.getPath(), this.configName);
+        }
         return getConfigResource(this.configName, ValueMap.class, new ValueMapConverter());
     }
 
     @Override
     public Collection<ValueMap> asValueMapCollection() {
+        if (log.isDebugEnabled()) {
+            log.debug("Get ValueMap collection for context path {}, name '{}'", contentResource.getPath(), this.configName);
+        }
         return getConfigResourceCollection(this.configName, ValueMap.class, new ValueMapConverter());
     }
 
@@ -230,11 +251,17 @@ class ConfigurationBuilderImpl implement
 
     @Override
     public <T> T asAdaptable(Class<T> clazz) {
+        if (log.isDebugEnabled()) {
+            log.debug("Get adaptable for context path {}, name '{}', class {}", contentResource.getPath(), this.configName, clazz);
+        }
         return getConfigResource(this.configName, clazz, new AdaptableConverter<T>());
     }
 
     @Override
     public <T> Collection<T> asAdaptableCollection(Class<T> clazz) {
+        if (log.isDebugEnabled()) {
+            log.debug("Get adaptable collection for context path {}, name '{}', class {}", contentResource.getPath(), this.configName, clazz);
+        }
         return getConfigResourceCollection(this.configName, clazz, new AdaptableConverter<T>());
     }
 

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationInheritanceStrategy.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationInheritanceStrategy.java?rev=1773313&r1=1773312&r2=1773313&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationInheritanceStrategy.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationInheritanceStrategy.java Thu Dec  8 23:26:43 2016
@@ -34,6 +34,8 @@ import org.osgi.service.component.annota
 import org.osgi.service.metatype.annotations.AttributeDefinition;
 import org.osgi.service.metatype.annotations.Designate;
 import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Component(service=ConfigurationInheritanceStrategy.class)
 @Designate(ocd=DefaultConfigurationInheritanceStrategy.Config.class)
@@ -56,6 +58,8 @@ public class DefaultConfigurationInherit
 
     private Config config;
 
+    private static final Logger log = LoggerFactory.getLogger(DefaultConfigurationInheritanceStrategy.class);
+    
     @Activate
     private void activate(final Config config) {
         this.config = config;
@@ -87,6 +91,7 @@ public class DefaultConfigurationInherit
             return parentProps;
         }
         Resource next = inheritanceChain.next();
+        log.trace("Property inheritance: Merge with properties from {}", next.getPath());
         Map<String,Object> merged = new HashMap<>(next.getValueMap());
         merged.putAll(parentProps);
         if (isPropertyInheritance(next)) {

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategy.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategy.java?rev=1773313&r1=1773312&r2=1773313&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategy.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/def/DefaultConfigurationPersistenceStrategy.java Thu Dec  8 23:26:43 2016
@@ -28,6 +28,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.caconfig.resource.impl.util.MapUtil;
 import org.apache.sling.caconfig.resource.impl.util.PropertiesFilterUtil;
 import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
 import org.apache.sling.caconfig.spi.ConfigurationPersistData;
@@ -39,6 +40,8 @@ import org.osgi.service.component.annota
 import org.osgi.service.metatype.annotations.AttributeDefinition;
 import org.osgi.service.metatype.annotations.Designate;
 import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The default persistence strategy is quite simple: directly use the configuration resources.
@@ -61,6 +64,8 @@ public class DefaultConfigurationPersist
 
     private volatile Config config;
     
+    private static final Logger log = LoggerFactory.getLogger(DefaultConfigurationPersistenceStrategy.class);
+    
     @Activate
     private void activate(ComponentContext componentContext, Config config) {
         this.config = config; 
@@ -125,6 +130,7 @@ public class DefaultConfigurationPersist
         Resource resource = resourceResolver.getResource(configResourcePath);
         if (resource != null) {
             try {
+                log.trace("Delete resource {}", resource.getPath());
                 resourceResolver.delete(resource);
             }
             catch (PersistenceException ex) {
@@ -150,6 +156,7 @@ public class DefaultConfigurationPersist
         ResourceResolver resourceResolver = resource.getResourceResolver();
         try {
             for (Resource child : resource.getChildren()) {
+                log.trace("Delete resource {}", child.getPath());
                 resourceResolver.delete(child);
             }
         }
@@ -159,6 +166,9 @@ public class DefaultConfigurationPersist
     }
     
     private void replaceProperties(Resource resource, Map<String,Object> properties) {
+        if (log.isTraceEnabled()) {
+            log.trace("Replace properties of resource {} with {}", resource.getPath(), MapUtil.traceOutput(properties));
+        }
         ModifiableValueMap modValueMap = resource.adaptTo(ModifiableValueMap.class);
         // remove all existing properties that are not filterd
         Set<String> propertyNamesToRemove = new HashSet<>(modValueMap.keySet());

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassConfigurationMetadataProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassConfigurationMetadataProvider.java?rev=1773313&r1=1773312&r2=1773313&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassConfigurationMetadataProvider.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/AnnotationClassConfigurationMetadataProvider.java Thu Dec  8 23:26:43 2016
@@ -112,10 +112,12 @@ public class AnnotationClassConfiguratio
     }
 
     void addBundeMapping(BundleConfigurationMapping bundleMapping) {
+        log.debug("Add bundle mapping: {}", bundleMapping);
         bundleMappings.put(bundleMapping.getBundle(), bundleMapping);
     }
 
     void removeBundleMapping(BundleConfigurationMapping bundleMapping) {
+        log.debug("Remove bundle mapping: {}", bundleMapping);
         bundleMappings.remove(bundleMapping.getBundle());
     }
     

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/BundleConfigurationMapping.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/BundleConfigurationMapping.java?rev=1773313&r1=1773312&r2=1773313&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/BundleConfigurationMapping.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/metadata/BundleConfigurationMapping.java Thu Dec  8 23:26:43 2016
@@ -123,5 +123,10 @@ class BundleConfigurationMapping {
     public ConfigurationMapping getConfigurationMapping(String configName) {
         return getConfigMappings().get(configName);
     }
+
+    @Override
+    public String toString() {
+        return "Classes from bundle '" + bundle.getSymbolicName() + "': " + classNamesList;
+    }
     
 }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/override/ConfigurationOverrideManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/override/ConfigurationOverrideManager.java?rev=1773313&r1=1773312&r2=1773313&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/override/ConfigurationOverrideManager.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/override/ConfigurationOverrideManager.java Thu Dec  8 23:26:43 2016
@@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUt
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.wrappers.ValueMapDecorator;
 import org.apache.sling.caconfig.impl.ConfigurationResourceWrapper;
+import org.apache.sling.caconfig.resource.impl.util.MapUtil;
 import org.apache.sling.caconfig.spi.ConfigurationOverrideProvider;
 import org.apache.sling.commons.osgi.Order;
 import org.apache.sling.commons.osgi.RankedServices;
@@ -38,6 +39,8 @@ import org.osgi.service.component.annota
 import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.osgi.service.component.annotations.ReferencePolicy;
 import org.osgi.service.component.annotations.ReferencePolicyOption;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Detects all {@link ConfigurationOverrideProvider} implementations in the container
@@ -55,6 +58,8 @@ public class ConfigurationOverrideManage
     private RankedServices<ConfigurationOverrideProvider> items = new RankedServices<>(Order.DESCENDING, this);
     private volatile Collection<OverrideItem> allOverrides = Collections.emptyList();
     
+    private static final Logger log = LoggerFactory.getLogger(ConfigurationOverrideManager.class);
+    
     protected void bindConfigurationOverrideProvider(ConfigurationOverrideProvider item, Map<String, Object> props) {
         items.bind(item, props);
     }
@@ -110,6 +115,11 @@ public class ConfigurationOverrideManage
         if (overrideProperties == null) {
             return configResource;
         }
+        if (log.isTraceEnabled()) {
+            log.trace("Override properties for context path " + contextPath + ", name '" + configName + "', "
+                    + "config path " + configResource.getPath() + ": "
+                    + MapUtil.traceOutput(configResource.getValueMap()) + " -> " + MapUtil.traceOutput(overrideProperties));
+        }
         return new ConfigurationResourceWrapper(configResource, new ValueMapDecorator(overrideProperties));
     }
 
@@ -120,7 +130,11 @@ public class ConfigurationOverrideManage
     public void changed() {
         List<OverrideItem> overrides = new ArrayList<>();
         for (ConfigurationOverrideProvider item : items) {
-            overrides.addAll(OverrideStringParser.parse(item.getOverrideStrings()));
+            Collection<OverrideItem> itemOverrides = OverrideStringParser.parse(item.getOverrideStrings());
+            if (log.isDebugEnabled() && !itemOverrides.isEmpty()) {
+                log.debug("Override items from " + item.getClass().getName() + ":\n" + StringUtils.join(itemOverrides, "\n"));
+            }
+            overrides.addAll(itemOverrides);
         }
         allOverrides = overrides;
     }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/override/OverrideItem.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/override/OverrideItem.java?rev=1773313&r1=1773312&r2=1773313&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/override/OverrideItem.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/impl/override/OverrideItem.java Thu Dec  8 23:26:43 2016
@@ -22,6 +22,8 @@ import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
 
 /**
  * Holds override information provided by override providers.
@@ -91,5 +93,10 @@ class OverrideItem {
     public boolean isAllProperties() {
         return allProperties;
     }
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+    }
     
 }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java?rev=1773313&r1=1773312&r2=1773313&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/management/impl/ConfigurationManagerImpl.java Thu Dec  8 23:26:43 2016
@@ -42,6 +42,7 @@ import org.apache.sling.caconfig.managem
 import org.apache.sling.caconfig.management.ConfigurationManager;
 import org.apache.sling.caconfig.resource.impl.ConfigurationResourceResolvingStrategyMultiplexer;
 import org.apache.sling.caconfig.resource.impl.util.ConfigNameUtil;
+import org.apache.sling.caconfig.resource.impl.util.MapUtil;
 import org.apache.sling.caconfig.spi.ConfigurationCollectionPersistData;
 import org.apache.sling.caconfig.spi.ConfigurationPersistData;
 import org.apache.sling.caconfig.spi.ConfigurationPersistenceException;
@@ -49,6 +50,8 @@ import org.apache.sling.caconfig.spi.met
 import org.apache.sling.caconfig.spi.metadata.PropertyMetadata;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Component(service = ConfigurationManager.class)
 public class ConfigurationManagerImpl implements ConfigurationManager {
@@ -66,10 +69,15 @@ public class ConfigurationManagerImpl im
     @Reference
     private ConfigurationResourceResolverConfig configurationResourceResolverConfig;
 
+    private static final Logger log = LoggerFactory.getLogger(ConfigurationManagerImpl.class);
+    
     @SuppressWarnings("unchecked")
     @Override
     public ConfigurationData getConfiguration(Resource resource, String configName) {
         ConfigNameUtil.ensureValidConfigName(configName);
+        if (log.isDebugEnabled()) {
+            log.debug("Get configuration for context path {}, name '{}', class {}", resource.getPath(), configName);
+        }
         ConfigurationMetadata configMetadata = getConfigurationMetadata(configName);
         Resource configResource = null;
         
@@ -95,6 +103,11 @@ public class ConfigurationManagerImpl im
                     }
                 }
                 
+                if (log.isTraceEnabled() && configResource != null) {
+                    log.trace("Found config resource for context path " + resource.getPath() + ": " + configResource.getPath() + " "
+                            + MapUtil.traceOutput(configResource.getValueMap()) + ", "
+                            + "writeback config resource: " + writebackConfigResourcePath);
+                }
                 resettableConfigResourceInheritanceChain.reset();
                 return new ConfigurationDataImpl(configMetadata, configResource, writebackConfigResource,
                         applyPersistence(resettableConfigResourceInheritanceChain),
@@ -113,6 +126,9 @@ public class ConfigurationManagerImpl im
     @Override
     public ConfigurationCollectionData getConfigurationCollection(Resource resource, String configName) {
         ConfigNameUtil.ensureValidConfigName(configName);
+        if (log.isDebugEnabled()) {
+            log.debug("Get configuration collection for context path {}, name '{}', class {}", resource.getPath(), configName);
+        }
         ConfigurationMetadata configMetadata = getConfigurationMetadata(configName);
         List<ConfigurationData> configData = new ArrayList<>();
 
@@ -131,11 +147,12 @@ public class ConfigurationManagerImpl im
                     // get writeback resource for "reverse inheritance detection"
                     Resource writebackConfigResource = null;
                     
+                    String writebackConfigResourcePath = null;
                     for (String configBucketName : configurationResourceResolverConfig.configBucketNames()) {
                         writebackConfigResourceCollectionParentPath = configurationResourceResolvingStrategy.getResourceCollectionParentPath(resource, configBucketName, configName);
                         if (writebackConfigResourceCollectionParentPath != null) {
-                            writebackConfigResource = configResource.getResourceResolver().getResource(
-                                    writebackConfigResourceCollectionParentPath + "/" + untransformedConfigResource.getName());
+                            writebackConfigResourcePath = writebackConfigResourceCollectionParentPath + "/" + untransformedConfigResource.getName();
+                            writebackConfigResource = configResource.getResourceResolver().getResource(writebackConfigResourcePath);
                             if (writebackConfigResource != null) {
                                 writebackConfigResource = configurationPersistenceStrategy.getResource(writebackConfigResource);
                                 break;
@@ -143,6 +160,11 @@ public class ConfigurationManagerImpl im
                         }
                     }
                     
+                    if (log.isTraceEnabled() && configResource != null) {
+                        log.trace("Found config resource for context path " + resource.getPath() + ": " + configResource.getPath() + " "
+                                + MapUtil.traceOutput(configResource.getValueMap()) + ", "
+                                + "writeback config resource: " + writebackConfigResourcePath);
+                    }
                     resettableConfigResourceInheritanceChain.reset();
                     configData.add(new ConfigurationDataImpl(configMetadata, configResource, writebackConfigResource,
                             applyPersistence(resettableConfigResourceInheritanceChain),
@@ -205,6 +227,9 @@ public class ConfigurationManagerImpl im
         if (configResourcePath == null) {
             throw new ConfigurationPersistenceException("Unable to persist configuration: Configuration resolving strategy returned no path.");
         }
+        if (log.isDebugEnabled()) {
+            log.debug("Persist configuration for context path {}, name '{}' to {}", resource.getPath(), configName, configResourcePath);
+        }
         if (!configurationPersistenceStrategy.persistConfiguration(resource.getResourceResolver(), configResourcePath, data)) {
             throw new ConfigurationPersistenceException("Unable to persist configuration: No persistence strategy found.");
         }
@@ -217,6 +242,9 @@ public class ConfigurationManagerImpl im
         if (configResourceParentPath == null) {
             throw new ConfigurationPersistenceException("Unable to persist configuration collection: Configuration resolving strategy returned no parent path.");
         }
+        if (log.isDebugEnabled()) {
+            log.debug("Persist configuration collection for context path {}, name '{}' to {}", resource.getPath(), configName, configResourceParentPath);
+        }
         if (!configurationPersistenceStrategy.persistConfigurationCollection(resource.getResourceResolver(), configResourceParentPath, data)) {
             throw new ConfigurationPersistenceException("Unable to persist configuration: No persistence strategy found.");
         }
@@ -243,6 +271,9 @@ public class ConfigurationManagerImpl im
             String configResourcePath = configurationResourceResolvingStrategy.getResourcePath(resource, configBucketName, configName);
             if (configResourcePath != null) {
                 foundAnyPath = true;
+                if (log.isDebugEnabled()) {
+                    log.debug("Delete configuration for context path {}, name '{}' from {}", resource.getPath(), configName, configResourcePath);
+                }
                 if (!configurationPersistenceStrategy.deleteConfiguration(resource.getResourceResolver(), configResourcePath)) {
                     throw new ConfigurationPersistenceException("Unable to delete configuration: No persistence strategy found.");
                 }
@@ -263,6 +294,7 @@ public class ConfigurationManagerImpl im
         ConfigNameUtil.ensureValidConfigName(configName);
         ConfigurationMetadata metadata = configurationMetadataProvider.getConfigurationMetadata(configName);
         if (metadata != null) {
+            log.trace("Configuration metadata found for: {}", configName);
             return metadata;
         }
         
@@ -272,10 +304,13 @@ public class ConfigurationManagerImpl im
             if (partialConfigMetadata != null) {
                 ConfigurationMetadata nestedConfigMetadata = getNestedConfigurationMetadata(partialConfigMetadata, configName, partialConfigName);
                 if (nestedConfigMetadata != null) {
+                    log.trace("Nested configuration metadata found for: {}", configName);
                     return nestedConfigMetadata;
                 }
             }
         }
+
+        log.trace("No configuration metadata found for: {}", configName);
         return null;
     }
     

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java?rev=1773313&r1=1773312&r2=1773313&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java Thu Dec  8 23:26:43 2016
@@ -92,7 +92,7 @@ public class DefaultConfigurationResourc
 
     }
 
-    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+    private static final Logger log = LoggerFactory.getLogger(DefaultConfigurationResourceResolvingStrategy.class);
 
     private volatile Config config;
 
@@ -157,7 +157,9 @@ public class DefaultConfigurationResourc
                     if ( useFromRelativePathsWith != null ) {
                         final ContextResource contextResource = relativePaths.remove(relativePaths.size() - 1);
                         val = checkPath(contextResource, useFromRelativePathsWith + "/" + contextResource.getConfigRef(), bucketNames);
-
+                        if (val != null) {
+                            log.trace("Found reference for context path {}: {}", contextResource.getResource().getPath(), val);
+                        }
                         if ( relativePaths.isEmpty() ) {
                             useFromRelativePathsWith = null;
                         }
@@ -171,8 +173,6 @@ public class DefaultConfigurationResourc
                         }
 
                         if (val != null) {
-                            logger.trace("Reference '{}' found at {}",
-                                    contextResource.getConfigRef(), contextResource.getResource().getPath());
                             final boolean isAbsolute = val.startsWith("/");
                             if ( isAbsolute && !relativePaths.isEmpty() ) {
                                 useFromRelativePathsWith = val;
@@ -182,10 +182,14 @@ public class DefaultConfigurationResourc
                                 val = null;
                             }
                         }
+                        
+                        if (val != null) {
+                            log.trace("Found reference for context path {}: {}", contextResource.getResource().getPath(), val);
+                        }
                     }
                 }
                 if ( val == null && !relativePaths.isEmpty() ) {
-                    logger.error("Relative references not used as no absolute reference was found: {}", relativePaths);
+                    log.error("Relative references not used as no absolute reference was found: {}", relativePaths);
                 }
                 return val;
             }
@@ -222,20 +226,20 @@ public class DefaultConfigurationResourc
         for (String bucketName : bucketNames) {
             String notAllowedPostfix = "/" + bucketName;
             if (ref != null && ref.endsWith(notAllowedPostfix)) {
-                logger.warn("Ignoring reference to {} from {} - Probably misconfigured as it ends with '{}'",
+                log.warn("Ignoring reference to {} from {} - Probably misconfigured as it ends with '{}'",
                         contextResource.getConfigRef(), contextResource.getResource().getPath(), notAllowedPostfix);
                 ref = null;
             }
         }
         
         if (ref != null && !isAllowedConfigPath(ref)) {
-            logger.warn("Ignoring reference to {} from {} - not in allowed paths.",
+            log.warn("Ignoring reference to {} from {} - not in allowed paths.",
                     contextResource.getConfigRef(), contextResource.getResource().getPath());
             ref = null;
         }
 
         if (ref != null && isFallbackConfigPath(ref)) {
-            logger.warn("Ignoring reference to {} from {} - already a fallback path.",
+            log.warn("Ignoring reference to {} from {} - already a fallback path.",
                     contextResource.getConfigRef(), contextResource.getResource().getPath());
             ref = null;
         }
@@ -244,9 +248,6 @@ public class DefaultConfigurationResourc
     }
 
     private boolean isAllowedConfigPath(String path) {
-        if (logger.isTraceEnabled()) {
-            logger.trace("- checking if '{}' starts with {}", path, config.configPath());
-        }
         return path.startsWith(config.configPath() + "/");
     }
 
@@ -289,6 +290,7 @@ public class DefaultConfigurationResourc
                     final String name = bucketName + "/" + configName;
                     Resource resource = resourceResolver.getResource(buildResourcePath(path, name));
                     if (resource != null) {
+                        log.trace("Matching config resource for inheritance chain: {}", resource.getPath());
                         return resource;
                     }
                 }
@@ -322,9 +324,13 @@ public class DefaultConfigurationResourc
             for(int i=deciders.size()-1;i>=0;i--) {
                 final InheritanceDecision decision = deciders.get(i).decide(resource, bucketName);
                 if ( decision == InheritanceDecision.EXCLUDE ) {
+                    log.trace("Block resource collection inheritance for bucket {}, resource {} because {} retruned EXCLUDE.",
+                            bucketName, resource.getPath(), deciders.get(i));
                     result = false;
                     break;
                 } else if ( decision == InheritanceDecision.BLOCK ) {
+                    log.trace("Block resource collection inheritance for bucket {}, resource {} because {} retruned BLOCK.",
+                            bucketName, resource.getPath(), deciders.get(i));
                     result = false;
                     blockedItems.add(resource.getName());
                     break;
@@ -341,7 +347,6 @@ public class DefaultConfigurationResourc
         final List<CollectionInheritanceDecider> deciders = this.collectionInheritanceDeciders;
         final Set<String> blockedItems = new HashSet<>();
 
-        int idx = 1;
         boolean inherit = false;
         while (paths.hasNext()) {
             final String path = paths.next();
@@ -350,10 +355,6 @@ public class DefaultConfigurationResourc
             String bucketNameUsed = null;
             for (String bucketName : bucketNames) {
                 String name = bucketName + "/" + configName;
-                if (logger.isTraceEnabled()) {
-                    logger.trace("- searching for list '{}'", name);
-                }
-                
                 item = resourceResolver.getResource(buildResourcePath(path, name));
                 if (item != null) {
                     bucketNameUsed = bucketName;
@@ -362,14 +363,12 @@ public class DefaultConfigurationResourc
             }
 
             if (item != null) {
-                if (logger.isTraceEnabled()) {
-                    logger.trace("+ resolved config item at [{}]: {}", idx, item.getPath());
-                }
-
+                log.trace("Check children of collection parent resource {}", item.getPath());
                 for (Resource child : item.getChildren()) {
                     if (isValidResourceCollectionItem(child)
                             && !result.containsKey(child.getName())
                             && include(deciders, bucketNameUsed, child, blockedItems)) {
+                        log.trace("Found collection resource item {}", item.getPath());
                         result.put(child.getName(), child);
                    }
                 }
@@ -382,17 +381,6 @@ public class DefaultConfigurationResourc
                     break;
                 }
             }
-            else {
-                if (logger.isTraceEnabled()) {
-                    logger.trace("- no item '{}' under config '{}'", StringUtils.join(bucketNames, ","), path);
-                }
-            }
-            
-            idx++;
-        }
-
-        if (logger.isTraceEnabled()) {
-            logger.trace("- final list has {} items", result.size());
         }
 
         return result.values();
@@ -458,11 +446,11 @@ public class DefaultConfigurationResourc
         Iterator<String> configPaths = this.findConfigRefs(contentResource, Collections.singleton(bucketName));
         if (configPaths.hasNext()) {
             String configPath = buildResourcePath(configPaths.next(), name);
-            logger.debug("Building configuration path {} for resource {}: {}", name, contentResource.getPath(), configPath);
+            log.trace("Building configuration path {} for resource {}: {}", name, contentResource.getPath(), configPath);
             return configPath;
         }
         else {
-            logger.debug("No configuration path {} found for resource {}.", name, contentResource.getPath());
+            log.trace("No configuration path {} found for resource {}.", name, contentResource.getPath());
             return null;
         }
     }

Modified: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultContextPathStrategy.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultContextPathStrategy.java?rev=1773313&r1=1773312&r2=1773313&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultContextPathStrategy.java (original)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultContextPathStrategy.java Thu Dec  8 23:26:43 2016
@@ -60,7 +60,7 @@ public class DefaultContextPathStrategy
         String[] configRefPropertyNames();
     }
 
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
+    private static final Logger log = LoggerFactory.getLogger(DefaultContextPathStrategy.class);
 
     private volatile Config config;
 
@@ -120,7 +120,7 @@ public class DefaultContextPathStrategy
             while (resource != null) {
                 String configRef = getConfigRef(resource);
                 if (configRef != null) {
-                    log.trace("Found context path '{}'.", resource.getPath());
+                    log.trace("Found context path {}, configRef {}", resource.getPath(), configRef);
                     return new ContextResource(resource, configRef);
                 }
                 // if getParent() returns null, stop

Added: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/MapUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/MapUtil.java?rev=1773313&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/MapUtil.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/MapUtil.java Thu Dec  8 23:26:43 2016
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.caconfig.resource.impl.util;
+
+import java.lang.reflect.Array;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+public final class MapUtil {
+    
+    private MapUtil() {
+        // static methods only
+    }
+    
+    /**
+     * Produce trace output for properties map.
+     * @param properties Properties
+     * @return Debug output
+     */
+    public static final String traceOutput(Map<String,Object> properties) {
+        SortedSet<String> propertyNames = new TreeSet<>(properties.keySet());
+        PropertiesFilterUtil.removeIgnoredProperties(propertyNames);
+        StringBuilder sb = new StringBuilder();
+        sb.append("{");
+        Iterator<String> propertyNameIterator = propertyNames.iterator();
+        while (propertyNameIterator.hasNext()) {
+            String propertyName = propertyNameIterator.next();
+            sb.append(propertyName).append(": ");
+            appendValue(sb, properties.get(propertyName));
+            if (propertyNameIterator.hasNext()) {
+                sb.append(", ");
+            }
+        }
+        sb.append("}");
+        return sb.toString();
+    }
+    
+    private static void appendValue(StringBuilder sb, Object value) {
+        if (value == null) {
+            sb.append("null");
+        }
+        else if (value.getClass().isArray()) {
+            sb.append("[");
+            for (int i = 0; i < Array.getLength(value); i++) {
+                if (i > 0) {
+                    sb.append(",");
+                }
+                appendValue(sb, Array.get(value, i));
+            }
+            sb.append("]");
+        }
+        else {
+            sb.append(value.toString());
+        }
+    }
+
+}

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/MapUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/MapUtil.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Thu Dec  8 23:26:43 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/util/MapUtil.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/util/MapUtilTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/util/MapUtilTest.java?rev=1773313&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/util/MapUtilTest.java (added)
+++ sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/util/MapUtilTest.java Thu Dec  8 23:26:43 2016
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.caconfig.resource.impl.util;
+
+import static org.apache.sling.caconfig.resource.impl.util.MapUtil.traceOutput;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+public class MapUtilTest {
+
+    @Test
+    public void testTraceOutput() {
+        assertEquals("{}", traceOutput(ImmutableMap.<String,Object>of()));
+        
+        assertEquals("{prop1: aa, prop2: 5, prop3: true}", traceOutput(ImmutableMap.<String,Object>of(
+                "prop1", "aa",
+                "prop2", 5,
+                "prop3", true
+                )));
+
+        assertEquals("{prop1: [aa,bb], prop2: [5,10], prop3: true}", traceOutput(ImmutableMap.<String,Object>of(
+                "prop1", new String[] { "aa", "bb" },
+                "prop2", new Integer[] { 5, 10 },
+                "prop3", true
+                )));
+    }
+
+}

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/util/MapUtilTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/util/MapUtilTest.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Thu Dec  8 23:26:43 2016
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/trunk/contrib/extensions/contextaware-config/impl/src/test/java/org/apache/sling/caconfig/resource/impl/util/MapUtilTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain