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