SLING-11082 : Remove empty configuration in lenient mode
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 @@
                 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 @@
                 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 @@
     }
 
     /**
+     * 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 @@
             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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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() {