This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-extension-apiregions.git


The following commit(s) were added to refs/heads/master by this push:
     new ca39272  SLING-11082 : Remove empty configuration in lenient mode
ca39272 is described below

commit ca39272eb3aad6a4bbf78afd8e09852f828bda72
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Sun Jan 23 14:23:43 2022 +0100

    SLING-11082 : Remove empty configuration in lenient mode
---
 .../config/validation/ConfigurationValidator.java  | 29 ++++++++++++++++++++++
 .../api/config/validation/FeatureValidator.java    | 12 ++++++++-
 .../validation/ConfigurationValidatorTest.java     |  8 +++---
 .../config/validation/FeatureValidatorTest.java    | 10 ++++----
 4 files changed, 49 insertions(+), 10 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidator.java
 
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidator.java
index 6358e19..e484318 100644
--- 
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidator.java
+++ 
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidator.java
@@ -16,7 +16,9 @@
  */
 package org.apache.sling.feature.extension.apiregions.api.config.validation;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -108,10 +110,12 @@ public class ConfigurationValidator {
                 if ( desc.getPropertyDescriptions().isEmpty()) {
                     if ( region == Region.GLOBAL && 
!desc.isAllowAdditionalProperties() ) {
                         setResult(result, validationMode, desc, "Factory 
configuration is not allowed");
+                        markGlobalProperties(config, result, region);
                     }
                 } else {
                     if ( region == Region.GLOBAL && desc.getRegion() == 
Region.INTERNAL ) {
                         setResult(result, validationMode, desc, "Factory 
configuration is not allowed");
+                        markGlobalProperties(config, result, region);
                     } else {
                         validateProperties(config, desc, 
result.getPropertyResults(), region, validationMode);
                     }
@@ -124,10 +128,12 @@ public class ConfigurationValidator {
                 if ( desc.getPropertyDescriptions().isEmpty()) {
                     if ( region == Region.GLOBAL && 
!desc.isAllowAdditionalProperties() ) {
                         setResult(result, validationMode, desc, "Configuration 
is not allowed");
+                        markGlobalProperties(config, result, region);
                     }
                 } else {
                     if ( region == Region.GLOBAL && desc.getRegion() == 
Region.INTERNAL ) {
                         setResult(result, validationMode, desc, "Configuration 
is not allowed");
+                        markGlobalProperties(config, result, region);
                     } else {
                         validateProperties(config, desc, 
result.getPropertyResults(), region, validationMode);
                     }
@@ -143,6 +149,29 @@ public class ConfigurationValidator {
     }
 
     /**
+     * Set all global properties to use default value if mode is definitive
+     * @param configuration The OSGi configuration
+     * @param result The result for the configuration
+     * @param region The configuration region
+     */
+    void markGlobalProperties(final Configuration configuration,
+            final ConfigurationValidationResult result,
+            final Region region) {
+        if ( result.isUseDefaultValue() ) {
+            final List<String> names = new 
ArrayList<>(Collections.list(configuration.getConfigurationProperties().keys()));
+            for(final String propName : names) {
+                 // detect the region
+                final Region propRegion = 
FeatureValidator.getRegionInfo(region, configuration, propName, this.cache);
+                if ( propRegion == Region.GLOBAL ) {
+                    final PropertyValidationResult pvr = new 
PropertyValidationResult();
+                    pvr.setUseDefaultValue(true);
+                    result.getPropertyResults().put(propName, pvr);
+                }
+            }    
+        }
+    }
+
+    /**
      * Validate all properties
      * @param configuration The OSGi configuration
      * @param desc The configuration description
diff --git 
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidator.java
 
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidator.java
index 8857a59..9cc0658 100644
--- 
a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidator.java
+++ 
b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidator.java
@@ -212,9 +212,19 @@ public class FeatureValidator {
             if ( entry.getValue().isUseDefaultValue() ) {
                 final Configuration cfg = 
feature.getConfigurations().getConfiguration(entry.getKey());
                 if ( cfg != null ) {
+                    boolean hasPrivateProperty = false;
                     final List<String> keys = new 
ArrayList<>(Collections.list(cfg.getConfigurationProperties().keys()));
                     for(final String k : keys ) {
-                        cfg.getProperties().remove(k);
+                        final PropertyValidationResult pvr = 
entry.getValue().getPropertyResults().get(k);
+                        if ( pvr != null && pvr.isUseDefaultValue() ) {
+                            cfg.getProperties().remove(k);
+                            changed = true;    
+                        } else {
+                            hasPrivateProperty = true;
+                        }
+                    }
+                    if ( !hasPrivateProperty ) {
+                        feature.getConfigurations().remove(cfg);
                         changed = true;
                     }
                 }
diff --git 
a/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidatorTest.java
 
b/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidatorTest.java
index 7628582..a9a7b28 100644
--- 
a/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidatorTest.java
+++ 
b/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/ConfigurationValidatorTest.java
@@ -197,7 +197,7 @@ public class ConfigurationValidatorTest {
         assertTrue(result.isValid());
         assertTrue(result.isUseDefaultValue());
         assertEquals(1, result.getWarnings().size());
-        assertTrue(result.getPropertyResults().isEmpty());
+        assertEquals(2, result.getPropertyResults().size());
         assertTrue(result.getErrors().isEmpty());
 
         // global -> invalid, but mode LENIENT
@@ -224,7 +224,7 @@ public class ConfigurationValidatorTest {
         assertTrue(result.isValid());
         assertTrue(result.isUseDefaultValue());
         assertTrue(result.getWarnings().isEmpty());
-        assertTrue(result.getPropertyResults().isEmpty());
+        assertEquals(2, result.getPropertyResults().size());
         assertTrue(result.getErrors().isEmpty());
     }
 
@@ -257,7 +257,7 @@ public class ConfigurationValidatorTest {
         assertTrue(result.isValid());
         assertTrue(result.isUseDefaultValue());
         assertEquals(1, result.getWarnings().size());
-        assertTrue(result.getPropertyResults().isEmpty());
+        assertEquals(2, result.getPropertyResults().size());
         assertTrue(result.getErrors().isEmpty());
 
         // global -> invalid, but mode LENIENT
@@ -284,7 +284,7 @@ public class ConfigurationValidatorTest {
         assertTrue(result.isValid());
         assertTrue(result.isUseDefaultValue());
         assertTrue(result.getWarnings().isEmpty());
-        assertTrue(result.getPropertyResults().isEmpty());
+        assertEquals(2, result.getPropertyResults().size());
         assertTrue(result.getErrors().isEmpty());
     }
 
diff --git 
a/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidatorTest.java
 
b/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidatorTest.java
index 826c255..72670be 100644
--- 
a/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidatorTest.java
+++ 
b/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidatorTest.java
@@ -827,7 +827,7 @@ public class FeatureValidatorTest {
         result = validator.validate(f1, api);
         assertTrue(result.isValid());
         validator.applyDefaultValues(f1, result);
-        assertEquals(0, 
f1.getConfigurations().getConfiguration(PID).getConfigurationProperties().size());
+        assertNull(f1.getConfigurations().getConfiguration(PID));
 
         // global -> invalid, but mode LENIENT
         f1 = createFeature("g:a:1");
@@ -862,8 +862,8 @@ public class FeatureValidatorTest {
         api.setMode(Mode.SILENT_DEFINITIVE);
         result = validator.validate(f1, api);
         assertTrue(result.isValid());
-        validator.applyDefaultValues(f1, result);
-        assertEquals(0, 
f1.getConfigurations().getConfiguration(PID).getConfigurationProperties().size());
+        assertTrue(validator.applyDefaultValues(f1, result));
+        assertNull(f1.getConfigurations().getConfiguration(PID));
     }
 
     @Test public void testInternalFactoryConfigurationNoPropertyDescriptions() 
{
@@ -898,7 +898,7 @@ public class FeatureValidatorTest {
         result = validator.validate(f1, api);
         assertTrue(result.isValid());
         validator.applyDefaultValues(f1, result);
-        assertEquals(0, 
f1.getConfigurations().getConfiguration(FACTORY_PID.concat("~print")).getConfigurationProperties().size());
+        
assertNull(f1.getConfigurations().getConfiguration(FACTORY_PID.concat("~print")));
 
         // global -> invalid, but mode LENIENT
         f1 = createFeature("g:a:1");
@@ -934,7 +934,7 @@ public class FeatureValidatorTest {
         result = validator.validate(f1, api);
         assertTrue(result.isValid());
         validator.applyDefaultValues(f1, result);
-        assertEquals(0, 
f1.getConfigurations().getConfiguration(FACTORY_PID.concat("~print")).getConfigurationProperties().size());
+        
assertNull(f1.getConfigurations().getConfiguration(FACTORY_PID.concat("~print")));
     }
 
     @Test public void 
testInternalConfigurationNoPropertyDescriptionsButAllowAdditional() {

Reply via email to