SLING-10568 : Use configuration property origin for validation
diff --git a/pom.xml b/pom.xml
index e6ad546..e868332 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,7 +62,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.feature</artifactId>
- <version>1.2.24</version>
+ <version>1.2.25-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
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 ad1c176..867c217 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
@@ -19,9 +19,11 @@
import java.util.Arrays;
import java.util.Dictionary;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.apache.sling.feature.ArtifactId;
import org.apache.sling.feature.Configuration;
import org.apache.sling.feature.extension.apiregions.api.config.ConfigurableEntity;
import org.apache.sling.feature.extension.apiregions.api.config.ConfigurationDescription;
@@ -48,6 +50,8 @@
private boolean liveValues = false;
+ private Map<ArtifactId, Region> cache = new HashMap<>();
+
/**
* Are live values validated?
* @return {@code true} if live values are validated
@@ -163,11 +167,14 @@
while ( keyEnum.hasMoreElements() ) {
final String propName = keyEnum.nextElement();
if ( !desc.getPropertyDescriptions().containsKey(propName) ) {
+ // detect the region
+ final Region propRegion = FeatureValidator.getRegionInfo(region, configuration, propName, this.cache);
+
final PropertyValidationResult result = new PropertyValidationResult();
results.put(propName, result);
if ( desc.getInternalPropertyNames().contains(propName ) ) {
- if ( region != Region.INTERNAL ) {
+ if ( propRegion != Region.INTERNAL ) {
PropertyValidator.setResult(result, null, mode, "Property is not allowed");
}
} else if ( Constants.SERVICE_RANKING.equalsIgnoreCase(propName) ) {
@@ -175,7 +182,7 @@
if ( !(value instanceof Integer) ) {
PropertyValidator.setResult(result, 0, mode, "service.ranking must be of type Integer");
}
- } else if ( !isAllowedProperty(propName) && region != Region.INTERNAL && !desc.isAllowAdditionalProperties() ) {
+ } else if ( !isAllowedProperty(propName) && propRegion != Region.INTERNAL && !desc.isAllowAdditionalProperties() ) {
PropertyValidator.setResult(result, null, mode, "Property is not allowed");
}
}
@@ -201,4 +208,8 @@
}
return false;
}
+
+ void setCache(Map<ArtifactId, Region> cache) {
+ this.cache = cache;
+ }
}
\ No newline at end of file
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 dcbb162..dfecf09 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
@@ -30,7 +30,6 @@
import org.apache.sling.feature.extension.apiregions.api.config.ConfigurationDescription;
import org.apache.sling.feature.extension.apiregions.api.config.FactoryConfigurationDescription;
import org.apache.sling.feature.extension.apiregions.api.config.FrameworkPropertyDescription;
-import org.apache.sling.feature.extension.apiregions.api.config.Mode;
import org.apache.sling.feature.extension.apiregions.api.config.Operation;
import org.apache.sling.feature.extension.apiregions.api.config.Region;
@@ -47,6 +46,8 @@
private boolean liveValues = false;
+ final Map<ArtifactId, Region> cache = new HashMap<>();
+
/**
* Get the current feature provider
* @return the feature provider or {@code null}
@@ -80,6 +81,7 @@
public void setLiveValues(final boolean value) {
this.liveValues = value;
this.configurationValidator.setLiveValues(value);
+ this.configurationValidator.setCache(cache);
this.propertyValidator.setLiveValues(value);
}
@@ -106,8 +108,7 @@
if ( api == null ) {
throw new IllegalArgumentException();
}
-
- final Map<ArtifactId, Region> cache = new HashMap<>(api.getFeatureToRegionCache());
+ cache.putAll(api.getFeatureToRegionCache());
cache.put(feature.getId(), api.detectRegion());
for(final Configuration config : feature.getConfigurations()) {
@@ -235,7 +236,7 @@
return changed;
}
- Region getConfigurationApiRegion(final ArtifactId id, final Map<ArtifactId, Region> cache) {
+ static Region getConfigurationApiRegion(final ArtifactId id, final Map<ArtifactId, Region> cache) {
Region result = cache.get(id);
if ( result == null ) {
result = Region.GLOBAL;
@@ -277,6 +278,25 @@
return result;
}
+ static Region getRegionInfo(final Region cfgRegion, final Configuration cfg, final String propertyName, final Map<ArtifactId, Region> cache) {
+ final List<ArtifactId> list = cfg.getFeatureOrigins(propertyName);
+ if ( !list.isEmpty() ) {
+ boolean global = false;
+ for(final ArtifactId id : list) {
+ final Region region = getConfigurationApiRegion(id, cache);
+ if ( region == null ) {
+ return null;
+ }
+ if ( region == Region.GLOBAL ) {
+ global = true;
+ break;
+ }
+ }
+ return global ? Region.GLOBAL : Region.INTERNAL;
+ }
+ return cfgRegion;
+ }
+
RegionInfo getRegionInfo(final Feature feature, final String frameworkProperty, final Map<ArtifactId, Region> cache) {
final List<ArtifactId> list = feature.getFeatureOrigins(feature.getFrameworkPropertyMetadata(frameworkProperty));
boolean global = false;
@@ -289,7 +309,7 @@
global = true;
break;
}
- }
+ }
final RegionInfo result = new RegionInfo();
result.region = global ? Region.GLOBAL : Region.INTERNAL;
result.isUpdate = list.size() > 1;
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/PropertyValidator.java b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/PropertyValidator.java
index 2e31db9..e881ba2 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/PropertyValidator.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/PropertyValidator.java
@@ -23,13 +23,16 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
+import java.util.Map;
import java.util.regex.Pattern;
+import org.apache.sling.feature.ArtifactId;
import org.apache.sling.feature.extension.apiregions.api.config.Mode;
import org.apache.sling.feature.extension.apiregions.api.config.Option;
import org.apache.sling.feature.extension.apiregions.api.config.PlaceholderPolicy;
import org.apache.sling.feature.extension.apiregions.api.config.PropertyDescription;
import org.apache.sling.feature.extension.apiregions.api.config.PropertyType;
+import org.apache.sling.feature.extension.apiregions.api.config.Region;
/**
* Validate a configuration property or framework property
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/package-info.java b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/package-info.java
index 8e9b68a..4f6c6e4 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/package-info.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
-@org.osgi.annotation.versioning.Version("1.5.0")
+@org.osgi.annotation.versioning.Version("1.5.1")
package org.apache.sling.feature.extension.apiregions.api.config.validation;