SLING-9391 : Allow to provide additional region information via configuration
diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConfiguration.java b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConfiguration.java
index 1b81fd3..fa94278 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConfiguration.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConfiguration.java
@@ -44,73 +44,75 @@
 import org.osgi.framework.Version;
 
 class RegionConfiguration {
-    public static final String GLOBAL_REGION = "global";
 
-    static final String CLASSLOADER_PSEUDO_PROTOCOL = "classloader://";
-    static final String APIREGIONS_JOINGLOBAL = "sling.feature.apiregions.joinglobal";
-    static final String DEFAULT_REGIONS = "sling.feature.apiregions.default";
-    static final String PROPERTIES_RESOURCE_PREFIX = "sling.feature.apiregions.resource.";
-    static final String PROPERTIES_FILE_LOCATION = "sling.feature.apiregions.location";
-
-    static final String IDBSNVER_FILENAME = "idbsnver.properties";
-    static final String BUNDLE_FEATURE_FILENAME = "bundles.properties";
-    static final String FEATURE_REGION_FILENAME = "features.properties";
-    static final String REGION_PACKAGE_FILENAME = "regions.properties";
-
-    private static final String PROP_idbsnver = "mapping.bundleid.bsnver";
-    private static final String PROP_bundleFeatures = "mapping.bundleid.features";
-    private static final String PROP_featureRegions = "mapping.featureid.regions";
-    private static final String PROP_regionPackage = "mapping.region.packages";
 
     volatile Map<Map.Entry<String, Version>, List<String>> bsnVerMap;
     volatile Map<String, Set<String>> bundleFeatureMap;
     volatile Map<String, Set<String>> featureRegionMap;
     volatile Map<String, Set<String>> regionPackageMap;
+
     final Set<String> defaultRegions;
 
     private final Dictionary<String, Object> regProps = new Hashtable<>();
 
     private final Map<String, Dictionary<String, Object>> factoryConfigs = new ConcurrentHashMap<>();
 
+    private final Map<Map.Entry<String, Version>, List<String>> baseBsnVerMap;
+    private final Map<String, Set<String>> baseBundleFeatureMap;
+    private final Map<String, Set<String>> baseFeatureRegionMap;
+    private final Map<String, Set<String>> baseRegionPackageMap;
+
+    private final String toGlobalConfig;
+
     RegionConfiguration(Map<Entry<String, Version>, List<String>> bsnVerMap, Map<String, Set<String>> bundleFeatureMap,
                         Map<String, Set<String>> featureRegionMap, Map<String, Set<String>> regionPackageMap, Set<String> defaultRegions) {
-        this.bsnVerMap = bsnVerMap;
-        this.bundleFeatureMap = bundleFeatureMap;
-        this.featureRegionMap = featureRegionMap;
-        this.regionPackageMap = regionPackageMap;
         this.defaultRegions = defaultRegions;
+
+        this.baseBsnVerMap = new HashMap<>(bsnVerMap);
+        this.baseBundleFeatureMap = new HashMap<>(bundleFeatureMap);
+        this.baseFeatureRegionMap = new HashMap<>(featureRegionMap);
+        this.baseRegionPackageMap = new HashMap<>(regionPackageMap);
+
+        this.toGlobalConfig = null;
+
+        updateConfiguration();
     }
 
     RegionConfiguration(final BundleContext context)
             throws IOException, URISyntaxException {
 
-        URI idbsnverFile = getDataFileURI(context, IDBSNVER_FILENAME);
+        URI idbsnverFile = getDataFileURI(context, RegionConstants.IDBSNVER_FILENAME);
         // Register the location as a service property for diagnostic purposes
-        regProps.put(IDBSNVER_FILENAME, idbsnverFile.toString());
+        regProps.put(RegionConstants.IDBSNVER_FILENAME, idbsnverFile.toString());
         Map<Entry<String, Version>, List<String>> bvm = populateBSNVerMap(idbsnverFile);
 
-        URI bundlesFile = getDataFileURI(context, BUNDLE_FEATURE_FILENAME);
+        URI bundlesFile = getDataFileURI(context, RegionConstants.BUNDLE_FEATURE_FILENAME);
         // Register the location as a service property for diagnostic purposes
-        regProps.put(BUNDLE_FEATURE_FILENAME, bundlesFile.toString());
+        regProps.put(RegionConstants.BUNDLE_FEATURE_FILENAME, bundlesFile.toString());
         Map<String, Set<String>> bfm = populateBundleFeatureMap(bundlesFile);
 
-        URI featuresFile = getDataFileURI(context, FEATURE_REGION_FILENAME);
+        URI featuresFile = getDataFileURI(context, RegionConstants.FEATURE_REGION_FILENAME);
         // Register the location as a service property for diagnostic purposes
-        regProps.put(FEATURE_REGION_FILENAME, featuresFile.toString());
+        regProps.put(RegionConstants.FEATURE_REGION_FILENAME, featuresFile.toString());
         Map<String, Set<String>> frm = populateFeatureRegionMap(featuresFile);
 
-        URI regionsFile = getDataFileURI(context, REGION_PACKAGE_FILENAME);
+        URI regionsFile = getDataFileURI(context, RegionConstants.REGION_PACKAGE_FILENAME);
         // Register the location as a service property for diagnostic purposes
-        regProps.put(REGION_PACKAGE_FILENAME, regionsFile.toString());
+        regProps.put(RegionConstants.REGION_PACKAGE_FILENAME, regionsFile.toString());
         Map<String, Set<String>> rpm = populateRegionPackageMap(regionsFile);
 
-        String toglobal = context.getProperty(APIREGIONS_JOINGLOBAL);
-        if (toglobal != null) {
-            joinRegionsWithGlobal(toglobal, rpm);
-            regProps.put(APIREGIONS_JOINGLOBAL, toglobal);
+        // store base configuration
+        this.baseBsnVerMap = bvm;
+        this.baseBundleFeatureMap = bfm;
+        this.baseFeatureRegionMap = frm;
+        this.baseRegionPackageMap = rpm;
+
+        this.toGlobalConfig = context.getProperty(RegionConstants.APIREGIONS_JOINGLOBAL);
+        if ( this.toGlobalConfig != null ) {
+            regProps.put(RegionConstants.APIREGIONS_JOINGLOBAL, this.toGlobalConfig);
         }
 
-        String defRegProp = context.getProperty(DEFAULT_REGIONS);
+        String defRegProp = context.getProperty(RegionConstants.DEFAULT_REGIONS);
         if (defRegProp != null) {
             Set<String> defRegs = new HashSet<>();
             for (String region : Arrays.asList(defRegProp.split(","))) {
@@ -120,17 +122,80 @@
             }
             defaultRegions = Collections.unmodifiableSet(defRegs);
             if (defaultRegions.size() > 0) {
-                regProps.put(DEFAULT_REGIONS, defaultRegions.toString());
+                regProps.put(RegionConstants.DEFAULT_REGIONS, defaultRegions.toString());
             }
         } else {
             defaultRegions = Collections.emptySet();
         }
 
+        updateConfiguration();
+    }
+
+    private void updateConfiguration() {
+        final Map<Entry<String, Version>, List<String>> bvm = new HashMap<>(this.baseBsnVerMap);
+        final Map<String, Set<String>> bfm = new HashMap<>(this.baseBundleFeatureMap);
+        final Map<String, Set<String>> frm = new HashMap<>(this.baseFeatureRegionMap);
+        final Map<String, Set<String>> rpm = new HashMap<>(this.baseRegionPackageMap);
+
+        // apply configurations
+        for(final Dictionary<String, Object> props : this.factoryConfigs.values()) {
+            // bundle id to bsnver
+            Object valObj = props.get(RegionConstants.PROP_idbsnver);
+            if ( valObj != null ) {
+                for(final String val : convert(valObj)) {
+                    final String[] parts = val.split("=");
+                    final String n = parts[0];
+                    final String[] bsnver = parts[1].split("~");
+                    addBsnVerArtifact(bvm, bsnver[0], bsnver[1], n);
+                }
+            }
+
+            // bundle id to features
+            valObj = props.get(RegionConstants.PROP_bundleFeatures);
+            if ( valObj != null ) {
+                for(final String val : convert(valObj)) {
+                    final String[] parts = val.split("=");
+                    final String n = parts[0];
+                    final String[] features = parts[1].split(",");
+                    addValuesToMap(bfm, n, Arrays.asList(features));
+                }
+            }
+
+            // feature id to regions
+            valObj = props.get(RegionConstants.PROP_featureRegions);
+            if ( valObj != null ) {
+                for(final String val : convert(valObj)) {
+                    final String[] parts = val.split("=");
+                    final String n = parts[0];
+                    final String[] regions = parts[1].split(",");
+                    addValuesToMap(frm, n, Arrays.asList(regions));
+                }
+            }
+
+            // region to packages
+            valObj = props.get(RegionConstants.PROP_regionPackage);
+            if ( valObj != null ) {
+                for(final String val : convert(valObj)) {
+                    final String[] parts = val.split("=");
+                    final String n = parts[0];
+                    final String[] packages = parts[1].split(",");
+                    addValuesToMap(rpm, n, Arrays.asList(packages));
+                }
+            }
+
+        }
+
+        // join regions
+        if (this.toGlobalConfig != null) {
+            joinRegionsWithGlobal(this.toGlobalConfig, rpm);
+        }
+
         // Make all maps and their contents unmodifiable
         bsnVerMap = unmodifiableMapToList(bvm);
         bundleFeatureMap = unmodifiableMapToSet(bfm);
         featureRegionMap = unmodifiableMapToSet(frm);
         regionPackageMap = unmodifiableMapToSet(rpm);
+
     }
 
     private static <K,V> Map<K, List<V>> unmodifiableMapToList(Map<K, List<V>> m) {
@@ -153,7 +218,7 @@
             if (packages == null)
                 continue;
 
-            addValuesToMap(rpm, GLOBAL_REGION, packages);
+            addValuesToMap(rpm, RegionConstants.GLOBAL_REGION, packages);
             rpm.remove(region);
         }
     }
@@ -183,31 +248,11 @@
         List<String> l = bsnVerMap.get(bsnVer);
         if (l == null) {
             l = new ArrayList<>();
-        } else {
-            l = new ArrayList<>(l);
+            bsnVerMap.put(bsnVer, l);
         }
-        bsnVerMap.put(bsnVer, l);
         l.add(artifactId);
     }
 
-    private static void removeBsnVerArtifact(
-            Map<Map.Entry<String, Version>, List<String>> bsnVerMap,
-            String bundleSymbolicName, String bundleVersion,
-            String artifactId) {
-        Version version = Version.valueOf(bundleVersion);
-        Map.Entry<String, Version> bsnVer = new AbstractMap.SimpleEntry<>(bundleSymbolicName, version);
-        List<String> l = bsnVerMap.get(bsnVer);
-        if (l != null) {
-            l = new ArrayList<>(l);
-            l.remove(artifactId);
-            if ( l.isEmpty() ) {
-                bsnVerMap.remove(bsnVer);
-            } else {
-                bsnVerMap.put(bsnVer, l);
-            }
-        }
-    }
-
     private static Map<String, Set<String>> populateBundleFeatureMap(URI bundlesFile) throws IOException {
         return loadMap(bundlesFile);
     }
@@ -240,30 +285,15 @@
         Set<String> bf = map.get(key);
         if (bf == null) {
             bf = new LinkedHashSet<>(); // It's important that the insertion order is maintained.
-        } else {
-            bf = new LinkedHashSet<>(bf);
+            map.put(key, bf);
         }
-        map.put(key, bf);
         bf.addAll(values);
     }
 
-    private static void removeValuesFromMap(Map<String, Set<String>> map, String key, Collection<String> values) {
-        Set<String> bf = map.get(key);
-        if (bf != null) {
-            bf = new LinkedHashSet<>(bf); // It's important that the insertion order is maintained.
-            bf.removeAll(values);
-            if ( bf.isEmpty() ) {
-                map.remove(key);
-            } else {
-                map.put(key, bf);
-            }
-        }
-    }
-
     private URI getDataFileURI(BundleContext ctx, String name) throws IOException, URISyntaxException {
-        String fn = ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + name);
+        String fn = ctx.getProperty(RegionConstants.PROPERTIES_RESOURCE_PREFIX + name);
         if (fn == null) {
-            String loc = ctx.getProperty(PROPERTIES_FILE_LOCATION);
+            String loc = ctx.getProperty(RegionConstants.PROPERTIES_FILE_LOCATION);
             if (loc != null) {
                 fn = loc + "/" + name;
             }
@@ -274,9 +304,9 @@
                     + "region definition resource: " + name);
 
         if (fn.contains(":")) {
-            if (fn.startsWith(CLASSLOADER_PSEUDO_PROTOCOL)) {
+            if (fn.startsWith(RegionConstants.CLASSLOADER_PSEUDO_PROTOCOL)) {
                 // It's using the 'classloader:' protocol looks up the location from the classloader
-                String loc = fn.substring(CLASSLOADER_PSEUDO_PROTOCOL.length());
+                String loc = fn.substring(RegionConstants.CLASSLOADER_PSEUDO_PROTOCOL.length());
                 if (!loc.startsWith("/"))
                     loc = "/" + loc;
                 fn = getClass().getResource(loc).toString();
@@ -326,59 +356,8 @@
      * @param props The properties
      */
     public void setConfig(final String pid, final Dictionary<String, Object> props) {
-        this.removeConfig(pid);
         this.factoryConfigs.put(pid, props);
-        // bundle id to bsnver
-        Object valObj = props.get(PROP_idbsnver);
-        if ( valObj != null ) {
-            final Map<Map.Entry<String, Version>, List<String>> newMap = new HashMap<>(this.bsnVerMap);
-            for(final String val : convert(valObj)) {
-                final String[] parts = val.split("=");
-                final String n = parts[0];
-                final String[] bsnver = parts[1].split("~");
-                addBsnVerArtifact(newMap, bsnver[0], bsnver[1], n);
-            }
-            this.bsnVerMap = newMap;
-        }
-
-        // bundle id to features
-        valObj = props.get(PROP_bundleFeatures);
-        if ( valObj != null ) {
-            final Map<String, Set<String>> newMap = new HashMap<>(this.bundleFeatureMap);
-            for(final String val : convert(valObj)) {
-                final String[] parts = val.split("=");
-                final String n = parts[0];
-                final String[] features = parts[1].split(",");
-                addValuesToMap(newMap, n, Arrays.asList(features));
-            }
-            this.bundleFeatureMap = newMap;
-        }
-
-        // feature id to regions
-        valObj = props.get(PROP_featureRegions);
-        if ( valObj != null ) {
-            final Map<String, Set<String>> newMap = new HashMap<>(this.featureRegionMap);
-            for(final String val : convert(valObj)) {
-                final String[] parts = val.split("=");
-                final String n = parts[0];
-                final String[] regions = parts[1].split(",");
-                addValuesToMap(newMap, n, Arrays.asList(regions));
-            }
-            this.featureRegionMap = newMap;
-        }
-
-        // region to packages
-        valObj = props.get(PROP_regionPackage);
-        if ( valObj != null ) {
-            final Map<String, Set<String>> newMap = new HashMap<>(this.regionPackageMap);
-            for(final String val : convert(valObj)) {
-                final String[] parts = val.split("=");
-                final String n = parts[0];
-                final String[] packages = parts[1].split(",");
-                addValuesToMap(newMap, n, Arrays.asList(packages));
-            }
-            this.regionPackageMap = newMap;
-        }
+        updateConfiguration();
     }
 
     /**
@@ -388,57 +367,7 @@
     public void removeConfig(final String pid) {
         final Dictionary<String, Object> props = this.factoryConfigs.remove(pid);
         if ( props != null ) {
-            // bundle id to bsnver
-            Object valObj = props.get(PROP_idbsnver);
-            if ( valObj != null ) {
-                final Map<Map.Entry<String, Version>, List<String>> newMap = new HashMap<>(this.bsnVerMap);
-                for(final String val : convert(valObj)) {
-                    final String[] parts = val.split("=");
-                    final String n = parts[0];
-                    final String[] bsnver = parts[1].split("~");
-                    removeBsnVerArtifact(newMap, bsnver[0], bsnver[1], n);
-                }
-                this.bsnVerMap = newMap;
-            }
-
-            // bundle id to features
-            valObj = props.get(PROP_bundleFeatures);
-            if ( valObj != null ) {
-                final Map<String, Set<String>> newMap = new HashMap<>(this.bundleFeatureMap);
-                for(final String val : convert(valObj)) {
-                    final String[] parts = val.split("=");
-                    final String n = parts[0];
-                    final String[] features = parts[1].split(",");
-                    removeValuesFromMap(newMap, n, Arrays.asList(features));
-                }
-                this.bundleFeatureMap = newMap;
-            }
-
-            // feature id to regions
-            valObj = props.get(PROP_featureRegions);
-            if ( valObj != null ) {
-                final Map<String, Set<String>> newMap = new HashMap<>(this.featureRegionMap);
-                for(final String val : convert(valObj)) {
-                    final String[] parts = val.split("=");
-                    final String n = parts[0];
-                    final String[] regions = parts[1].split(",");
-                    removeValuesFromMap(newMap, n, Arrays.asList(regions));
-                }
-                this.featureRegionMap = newMap;
-            }
-
-            // region to packages
-            valObj = props.get(PROP_regionPackage);
-            if ( valObj != null ) {
-                final Map<String, Set<String>> newMap = new HashMap<>(this.regionPackageMap);
-                for(final String val : convert(valObj)) {
-                    final String[] parts = val.split("=");
-                    final String n = parts[0];
-                    final String[] packages = parts[1].split(",");
-                    removeValuesFromMap(newMap, n, Arrays.asList(packages));
-                }
-                this.regionPackageMap = newMap;
-            }
+            updateConfiguration();
         }
     }
 }
diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConstants.java b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConstants.java
new file mode 100644
index 0000000..f4b8784
--- /dev/null
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConstants.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.feature.apiregions.impl;
+
+abstract class RegionConstants {
+
+    static final String GLOBAL_REGION = "global";
+
+    static final String CLASSLOADER_PSEUDO_PROTOCOL = "classloader://";
+    static final String APIREGIONS_JOINGLOBAL = "sling.feature.apiregions.joinglobal";
+    static final String DEFAULT_REGIONS = "sling.feature.apiregions.default";
+    static final String PROPERTIES_RESOURCE_PREFIX = "sling.feature.apiregions.resource.";
+    static final String PROPERTIES_FILE_LOCATION = "sling.feature.apiregions.location";
+
+    static final String IDBSNVER_FILENAME = "idbsnver.properties";
+    static final String BUNDLE_FEATURE_FILENAME = "bundles.properties";
+    static final String FEATURE_REGION_FILENAME = "features.properties";
+    static final String REGION_PACKAGE_FILENAME = "regions.properties";
+
+    static final String PROP_idbsnver = "mapping.bundleid.bsnver";
+    static final String PROP_bundleFeatures = "mapping.bundleid.features";
+    static final String PROP_featureRegions = "mapping.featureid.regions";
+    static final String PROP_regionPackage = "mapping.region.packages";
+}
diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java b/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
index 3c1f4b3..556ff34 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
@@ -115,7 +115,7 @@
             List<String> capBundleArtifacts = this.configuration.getBsnVerMap().get(new AbstractMap.SimpleEntry<String, Version>(capBundleName, capBundleVersion));
             if (capBundleArtifacts == null) {
                 // Capability is not in any feature, everyone can access
-                coveredCaps.put(bc, RegionConfiguration.GLOBAL_REGION);
+                coveredCaps.put(bc, RegionConstants.GLOBAL_REGION);
                 continue nextCapability;
             }
 
@@ -132,7 +132,7 @@
             for (String capFeat : capFeatures) {
                 if (capFeat == null) {
                     // everyone can access capability not coming from a feature
-                    coveredCaps.put(bc, RegionConfiguration.GLOBAL_REGION);
+                    coveredCaps.put(bc, RegionConstants.GLOBAL_REGION);
                     continue nextCapability;
                 }
 
@@ -145,7 +145,7 @@
                 Set<String> capRegions = this.configuration.getFeatureRegionMap().get(capFeat);
                 if (capRegions == null || capRegions.size() == 0) {
                     // If the feature hosting the capability has no regions defined, everyone can access
-                    coveredCaps.put(bc, RegionConfiguration.GLOBAL_REGION);
+                    coveredCaps.put(bc, RegionConstants.GLOBAL_REGION);
                     continue nextCapability;
                 }
                 bcFeatureMap.put(bc, capFeat);
@@ -168,10 +168,10 @@
                     }
 
                     // Now check the global region
-                    Set<String> globalPackages = this.configuration.getRegionPackageMap().get(RegionConfiguration.GLOBAL_REGION);
+                    Set<String> globalPackages = this.configuration.getRegionPackageMap().get(RegionConstants.GLOBAL_REGION);
                     if (globalPackages != null && globalPackages.contains(packageName)) {
                         // If the export is in the global region everyone can access
-                        coveredCaps.put(bc, RegionConfiguration.GLOBAL_REGION);
+                        coveredCaps.put(bc, RegionConstants.GLOBAL_REGION);
                         continue nextCapability;
                     }
                 }
@@ -220,7 +220,7 @@
      */
     private void pruneCoveredCaps(Set<String> reqRegions, Map<BundleCapability,String> capMap) {
         Set<String> reqNonGlobalRegions = new HashSet<>(reqRegions);
-        reqNonGlobalRegions.remove(RegionConfiguration.GLOBAL_REGION);
+        reqNonGlobalRegions.remove(RegionConstants.GLOBAL_REGION);
 
         if (capMap.size() <= 1) {
             // Shortcut: there is only 0 or 1 capability, nothing to do
@@ -228,7 +228,7 @@
         }
 
         if (reqRegions.size() == 0
-                || Collections.singleton(RegionConfiguration.GLOBAL_REGION).equals(reqRegions)) {
+                || Collections.singleton(RegionConstants.GLOBAL_REGION).equals(reqRegions)) {
             // No regions (other than global) for the requirement: do nothing
             return;
         }
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
index 44f9d2f..df86a4e 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
@@ -18,11 +18,11 @@
  */
 package org.apache.sling.feature.apiregions.impl;
 
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.BUNDLE_FEATURE_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.FEATURE_REGION_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.IDBSNVER_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.PROPERTIES_RESOURCE_PREFIX;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.REGION_PACKAGE_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.BUNDLE_FEATURE_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.FEATURE_REGION_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.IDBSNVER_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.PROPERTIES_RESOURCE_PREFIX;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.REGION_PACKAGE_FILENAME;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -185,7 +185,7 @@
         BundleContext bc = Mockito.mock(BundleContext.class);
         Mockito.when(bc.getBundle()).thenReturn(fw);
         Mockito.when(bc.getProperty(Activator.REGIONS_PROPERTY_NAME)).thenReturn("*");
-        Mockito.when(bc.getProperty(RegionConfiguration.PROPERTIES_FILE_LOCATION)).thenReturn(resourceDir);
+        Mockito.when(bc.getProperty(RegionConstants.PROPERTIES_FILE_LOCATION)).thenReturn(resourceDir);
         Mockito.when(bc.registerService(
             Mockito.eq("org.osgi.service.cm.ManagedService"),
             Mockito.any(),
@@ -207,7 +207,7 @@
 
         Activator a = new Activator();
         a.bundleContext = bc;
-        a.configuration = new RegionConfiguration(null, null, null, null, null);
+        a.configuration = new RegionConfiguration(Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap(), Collections.emptySet());
         FrameworkEvent ev = Mockito.mock(FrameworkEvent.class);
         Mockito.when(ev.getType()).thenReturn(FrameworkEvent.STARTED);
 
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/RegionConfigurationTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/RegionConfigurationTest.java
index d0cd62e..5c0d8b2 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/RegionConfigurationTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/RegionConfigurationTest.java
@@ -18,14 +18,14 @@
  */
 package org.apache.sling.feature.apiregions.impl;
 
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.APIREGIONS_JOINGLOBAL;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.BUNDLE_FEATURE_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.DEFAULT_REGIONS;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.FEATURE_REGION_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.IDBSNVER_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.PROPERTIES_FILE_LOCATION;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.PROPERTIES_RESOURCE_PREFIX;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.REGION_PACKAGE_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.APIREGIONS_JOINGLOBAL;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.BUNDLE_FEATURE_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.DEFAULT_REGIONS;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.FEATURE_REGION_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.IDBSNVER_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.PROPERTIES_FILE_LOCATION;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.PROPERTIES_RESOURCE_PREFIX;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.REGION_PACKAGE_FILENAME;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
index ebec9e1..57899ce 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
@@ -345,7 +345,7 @@
         bfmap.put("b20", Collections.singleton("f4"));
 
         Map<String, Set<String>> frmap = new HashMap<>();
-        frmap.put("f", new HashSet<>(Arrays.asList("r1", "r2", RegionConfiguration.GLOBAL_REGION)));
+        frmap.put("f", new HashSet<>(Arrays.asList("r1", "r2", RegionConstants.GLOBAL_REGION)));
         frmap.put("f1", Collections.singleton("r1"));
         frmap.put("f2", Collections.singleton("r2"));
         frmap.put("f3", Collections.singleton("r3"));
@@ -354,7 +354,7 @@
         Map<String, Set<String>> rpmap = new HashMap<>();
         rpmap.put("r0", Collections.singleton("org.bar"));
         rpmap.put("r1", new HashSet<>(Arrays.asList("org.blah", "org.foo")));
-        rpmap.put(RegionConfiguration.GLOBAL_REGION, Collections.singleton("org.bar.tar"));
+        rpmap.put(RegionConstants.GLOBAL_REGION, Collections.singleton("org.bar.tar"));
         rpmap.put("r3", Collections.singleton("xyz"));
 
         ResolverHookImpl rh = new ResolverHookImpl(new RegionConfiguration(bsnvermap, bfmap, frmap, rpmap, Collections.emptySet()));
@@ -485,13 +485,13 @@
 
         Map<String, Set<String>> frmap = new HashMap<>();
         frmap.put("f1", new HashSet<>(Arrays.asList(
-                RegionConfiguration.GLOBAL_REGION, "org.foo.blah")));
+                RegionConstants.GLOBAL_REGION, "org.foo.blah")));
         frmap.put("f2", new HashSet<>(Arrays.asList("org.foo.bar",
-                RegionConfiguration.GLOBAL_REGION, "org.foo.blah")));
+                RegionConstants.GLOBAL_REGION, "org.foo.blah")));
 
         Map<String, Set<String>> rpmap = new HashMap<>();
         rpmap.put("org.foo.bar", Collections.singleton("org.test"));
-        rpmap.put(RegionConfiguration.GLOBAL_REGION, Collections.singleton("org.something"));
+        rpmap.put(RegionConstants.GLOBAL_REGION, Collections.singleton("org.something"));
         rpmap.put("org.foo.blah", Collections.singleton("org.something"));
 
         ResolverHookImpl rh = new ResolverHookImpl(new RegionConfiguration(bsnvermap, bfmap, frmap, rpmap, Collections.emptySet()));