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;