You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2016/11/02 15:14:55 UTC

svn commit: r1767703 - /sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java

Author: cziegeler
Date: Wed Nov  2 15:14:54 2016
New Revision: 1767703

URL: http://svn.apache.org/viewvc?rev=1767703&view=rev
Log:
SLING-6233 : Allow configuration of fallback properties for inheritance

Modified:
    sling/trunk/contrib/extensions/contextaware-config/impl/src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java

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=1767703&r1=1767702&r2=1767703&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 Wed Nov  2 15:14:54 2016
@@ -36,6 +36,7 @@ import org.apache.commons.collections.it
 import org.apache.commons.collections.iterators.FilterIterator;
 import org.apache.commons.collections.iterators.IteratorChain;
 import org.apache.commons.collections.iterators.TransformIterator;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
@@ -75,6 +76,16 @@ public class DefaultConfigurationResourc
         @AttributeDefinition(name="Fallback paths",
                 description = "Global fallback configurations, ordered from most specific (checked first) to least specific.")
         String[] fallbackPaths() default {"/conf/global", "/apps/conf", "/libs/conf"};
+
+        @AttributeDefinition(name="Config collection inheritance property names",
+                description = "Additional property names to " + PROPERTY_CONFIG_COLLECTION_INHERIT + " to handle configuration inheritance. The names are used in the order defined, "
+                            + "always starting with " + PROPERTY_CONFIG_COLLECTION_INHERIT + ". Once a property with a value is found, that value is used and the following property names are skipped.")
+        String[] configCollectionInheritancePropertyNames();
+
+        @AttributeDefinition(name="Config property inheritance property names",
+                description = "Additional property names to " + PROPERTY_CONFIG_PROPERTY_INHERIT + " to handle property inheritance. The names are used in the order defined, "
+                            + "always starting with " + PROPERTY_CONFIG_PROPERTY_INHERIT + ". Once a property with a value is found, that value is used and the following property names are skipped.")
+        String[] configPropertyInheritancePropertyNames();
     }
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -218,7 +229,7 @@ public class DefaultConfigurationResourc
             final Resource item = contentResource.getResourceResolver().getResource(buildResourcePath(path, name));
             if (item != null) {
                 logger.debug("Resolved config item at [{}]: {}", idx, item.getPath());
-                
+
                 if (propertyInheritance) {
                     // merge property map with values from inheritance parent
                     Map<String,Object> mergedValueMap = new HashMap<>(item.getValueMap());
@@ -298,8 +309,9 @@ public class DefaultConfigurationResourc
                 }
 
                 // check collection and property inheritance mode on current level - should we check on next-highest level as well?
-                inheritCollection = item.getValueMap().get(PROPERTY_CONFIG_COLLECTION_INHERIT, false);
-                inheritProperties = item.getValueMap().get(PROPERTY_CONFIG_PROPERTY_INHERIT, false);
+                final ValueMap valueMap = item.getValueMap();
+                inheritCollection = getBooleanValue(valueMap, PROPERTY_CONFIG_COLLECTION_INHERIT, config.configCollectionInheritancePropertyNames());
+                inheritProperties = getBooleanValue(valueMap, PROPERTY_CONFIG_PROPERTY_INHERIT, config.configPropertyInheritancePropertyNames());
                 inherit = inheritCollection || inheritProperties;
                 if (!inherit) {
                     break;
@@ -316,7 +328,7 @@ public class DefaultConfigurationResourc
         if (logger.isTraceEnabled()) {
             logger.trace("- final list has {} items", result.size());
         }
-        
+
         // replace config resources with wrappers with merged properties if property inheritance was applied
         if (propertyInheritanceApplied) {
             List<Resource> transformedResult = new ArrayList<>();
@@ -341,6 +353,19 @@ public class DefaultConfigurationResourc
         return !StringUtils.equals(resource.getName(), "jcr:content");
     }
 
+    private boolean getBooleanValue(final ValueMap valueMap, final String key, final String[] additionalKeys) {
+        Boolean result = valueMap.get(key, Boolean.class);
+        if ( result != null && !ArrayUtils.isEmpty(additionalKeys) ) {
+            for(final String name : additionalKeys) {
+                result = valueMap.get(name, Boolean.class);
+                if ( result != null ) {
+                    break;
+                }
+            }
+        }
+        return result == null ? false : result.booleanValue();
+    }
+
     @Override
     public String getResourcePath(Resource contentResource, String bucketName, String configName) {
         if (!isEnabledAndParamsValid(contentResource, bucketName, configName)) {