This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-apiregions.git


The following commit(s) were added to refs/heads/master by this push:
     new 72c77a7  SLING-9391 : Allow to provide additional region information 
via configuration
72c77a7 is described below

commit 72c77a77d8beacbc18991cdd178ecd07df3be9c9
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Thu Apr 23 09:26:29 2020 +0200

    SLING-9391 : Allow to provide additional region information via 
configuration
---
 .../sling/feature/apiregions/impl/Activator.java   | 168 +++++++++++------
 .../apiregions/impl/RegionConfiguration.java       | 203 +++++++++++++++++++--
 .../feature/apiregions/impl/RegionEnforcer.java    |   5 +-
 .../feature/apiregions/impl/ActivatorTest.java     |   2 +-
 .../apiregions/impl/RegionConfigurationTest.java   |  37 ++--
 5 files changed, 322 insertions(+), 93 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java 
b/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
index 9f78504..69b2f79 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
@@ -45,6 +45,9 @@ import org.osgi.resource.Resource;
 public class Activator implements BundleActivator, FrameworkListener {
     static final String MANAGED_SERVICE_PKG_NAME = "org.osgi.service.cm";
     static final String MANAGED_SERVICE_CLASS_NAME = MANAGED_SERVICE_PKG_NAME 
+ ".ManagedService";
+    static final String MANAGED_SERVICE_FACTORY_CLASS_NAME = 
MANAGED_SERVICE_PKG_NAME + ".ManagedServiceFactory";
+    static final String FACTORY_PID = 
"org.apache.sling.feature.apiregions.factory";
+
     static final String REGIONS_PROPERTY_NAME = 
"org.apache.sling.feature.apiregions.regions";
 
     static final Logger LOG = 
Logger.getLogger(ResolverHookImpl.class.getName());
@@ -52,10 +55,14 @@ public class Activator implements BundleActivator, 
FrameworkListener {
     BundleContext bundleContext;
     ServiceRegistration<ResolverHookFactory> hookRegistration;
 
+    RegionConfiguration configuration;
+
     @Override
     public synchronized void start(BundleContext context) throws Exception {
         bundleContext = context;
 
+        createConfiguration();
+
         registerHook();
 
         context.addFrameworkListener(this);
@@ -66,6 +73,14 @@ public class Activator implements BundleActivator, 
FrameworkListener {
         // All services automatically get unregistered by the framework.
     }
 
+    private void createConfiguration() {
+        try {
+            this.configuration = new RegionConfiguration(bundleContext);
+        } catch (Exception e) {
+            LOG.log(Level.SEVERE, "Problem activating API Regions runtime 
enforcement component", e);
+        }
+    }
+
     synchronized void registerHook() {
         if (hookRegistration != null)
             return; // There is already a hook, no need to re-register
@@ -75,14 +90,8 @@ public class Activator implements BundleActivator, 
FrameworkListener {
             return; // Component not enabled
         }
 
-        Dictionary<String, Object> props = new Hashtable<>();
-        try {
-            final RegionConfiguration cfg = new 
RegionConfiguration(bundleContext, props);
-            RegionEnforcer enforcer = new RegionEnforcer(cfg);
-            hookRegistration = 
bundleContext.registerService(ResolverHookFactory.class, enforcer, props);
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, "Problem activating API Regions runtime 
enforcement component", e);
-        }
+        RegionEnforcer enforcer = new RegionEnforcer(this.configuration);
+        hookRegistration = 
bundleContext.registerService(ResolverHookFactory.class, enforcer, 
this.configuration.getRegistrationProperties());
     }
 
     synchronized void unregisterHook() {
@@ -109,58 +118,109 @@ public class Activator implements BundleActivator, 
FrameworkListener {
             // Because this fragment is a framework extension, we need to use 
the wiring API to find the CM API.
             Collection<BundleCapability> providers = fw.findProviders(cmReq);
             for (BundleCapability cap : providers) {
-                try {
-                    ClassLoader loader = 
cap.getRevision().getWiring().getClassLoader();
-                    Class<?> msClass = 
loader.loadClass(MANAGED_SERVICE_CLASS_NAME);
-                    Object ms = Proxy.newProxyInstance(loader, new Class[] 
{msClass}, new InvocationHandler() {
-                        @Override
-                        public Object invoke(Object proxy, Method method, 
Object[] args) throws Throwable {
-                            Class<?> mdDecl = method.getDeclaringClass();
-                            if (mdDecl.equals(Object.class)) {
-                                switch (method.getName()) {
-                                    case "equals" :
-                                        return proxy == args[0];
-                                    case "hashCode" :
-                                        return System.identityHashCode(proxy);
-                                    case "toString" :
-                                        return "Proxy for " + msClass;
-                                    default :
-                                        throw new 
UnsupportedOperationException("Method " + method
-                                            + " not supported on proxy for " + 
msClass);
-                                }
-                            }
-                            if ("updated".equals(method.getName())) {
-                                if (args.length == 1) {
-                                    Object arg = args[0];
-                                    if (arg == null) {
-                                        registerHook();
-                                    } else if (arg instanceof Dictionary) {
-                                        Dictionary<?,?> props = 
(Dictionary<?,?>) args[0];
-                                        Object disabled = props.get("disable");
-                                        if ("true".equals(disabled)) {
-                                            unregisterHook();
-                                        } else {
-                                            registerHook();
-                                        }
-                                    }
-                                }
-                            }
-                            return null;
-                        }
-                    });
-                    Dictionary<String, Object> props = new Hashtable<>();
-                    props.put(Constants.SERVICE_PID, 
getClass().getPackage().getName());
-                    bundleContext.registerService(MANAGED_SERVICE_CLASS_NAME, 
ms, props);
-
-                    return; // ManagedService registration successful. Exit 
method.
-                } catch (Exception e) {
-                    LOG.log(Level.WARNING, "Problem attempting to register 
ManagedService from " + cap, e);
+                if ( registerManagedService(cap) && 
registerManagedServiceFactory(cap)) {
+                    break;
                 }
             }
             LOG.log(Level.INFO, "No Configuration Admin API available");
         }
     }
 
+    private boolean registerManagedService(final BundleCapability cap) {
+        try {
+            ClassLoader loader = 
cap.getRevision().getWiring().getClassLoader();
+            Class<?> msClass = loader.loadClass(MANAGED_SERVICE_CLASS_NAME);
+            Object ms = Proxy.newProxyInstance(loader, new Class[] {msClass}, 
new InvocationHandler() {
+                @Override
+                public Object invoke(Object proxy, Method method, Object[] 
args) throws Throwable {
+                    Class<?> mdDecl = method.getDeclaringClass();
+                    if (mdDecl.equals(Object.class)) {
+                        switch (method.getName()) {
+                            case "equals" :
+                                return proxy == args[0];
+                            case "hashCode" :
+                                return System.identityHashCode(proxy);
+                            case "toString" :
+                                return "Proxy for " + msClass;
+                            default :
+                                throw new 
UnsupportedOperationException("Method " + method
+                                    + " not supported on proxy for " + 
msClass);
+                        }
+                    }
+                    if ("updated".equals(method.getName()) && args.length == 
1) {
+                        Object arg = args[0];
+                        if (arg == null) {
+                            registerHook();
+                        } else if (arg instanceof Dictionary) {
+                            Dictionary<?,?> props = (Dictionary<?,?>) args[0];
+                            Object disabled = props.get("disable");
+                            if ("true".equals(disabled)) {
+                                unregisterHook();
+                            } else {
+                                registerHook();
+                            }
+                        }
+                    }
+                    return null;
+                }
+            });
+            Dictionary<String, Object> props = new Hashtable<>();
+            props.put(Constants.SERVICE_PID, 
getClass().getPackage().getName());
+            bundleContext.registerService(MANAGED_SERVICE_CLASS_NAME, ms, 
props);
+
+            return true;
+        } catch (Exception e) {
+            LOG.log(Level.WARNING, "Problem attempting to register 
ManagedService from " + cap, e);
+        }
+        return false;
+    }
+
+    private boolean registerManagedServiceFactory(final BundleCapability cap) {
+        try {
+            ClassLoader loader = 
cap.getRevision().getWiring().getClassLoader();
+            Class<?> msClass = 
loader.loadClass(MANAGED_SERVICE_FACTORY_CLASS_NAME);
+            Object msf = Proxy.newProxyInstance(loader, new Class[] {msClass}, 
new InvocationHandler() {
+                @Override
+                public Object invoke(Object proxy, Method method, Object[] 
args) throws Throwable {
+                    Class<?> mdDecl = method.getDeclaringClass();
+                    if (mdDecl.equals(Object.class)) {
+                        switch (method.getName()) {
+                            case "equals" :
+                                return proxy == args[0];
+                            case "hashCode" :
+                                return System.identityHashCode(proxy);
+                            case "toString" :
+                                return "Proxy for " + msClass;
+                            default :
+                                throw new 
UnsupportedOperationException("Method " + method
+                                    + " not supported on proxy for " + 
msClass);
+                        }
+                    }
+                    if ("updated".equals(method.getName()) && args.length == 
2) {
+                        final String pid = (String)args[0];
+                        @SuppressWarnings("unchecked")
+                        final Dictionary<String, Object> props = 
(Dictionary<String, Object>) args[1];
+                        configuration.setConfig(pid, props);
+                    } else if ("deleted".equals(method.getName()) && 
args.length == 1) {
+                        final String pid = (String)args[0];
+                        configuration.removeConfig(pid);
+                    } else if ("getName".equals(method.getName()) && 
args.length == 0 ) {
+                        return "Region Factory Configuration";
+                    }
+                    return null;
+                }
+            });
+            Dictionary<String, Object> props = new Hashtable<>();
+            props.put(Constants.SERVICE_PID, FACTORY_PID);
+            bundleContext.registerService(MANAGED_SERVICE_FACTORY_CLASS_NAME, 
msf, props);
+
+            return true;
+        } catch (Exception e) {
+            LOG.log(Level.WARNING, "Problem attempting to register 
ManagedServiceFactory from " + cap, e);
+        }
+        return false;
+    }
+
     static Requirement createPackageRequirement() {
         Requirement cmReq = new Requirement() {
             @Override
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 3fb8809..1b81fd3 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
@@ -31,12 +31,14 @@ import java.util.Collections;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Version;
@@ -55,12 +57,21 @@ class RegionConfiguration {
     static final String FEATURE_REGION_FILENAME = "features.properties";
     static final String REGION_PACKAGE_FILENAME = "regions.properties";
 
-    final Map<Map.Entry<String, Version>, List<String>> bsnVerMap;
-    final Map<String, Set<String>> bundleFeatureMap;
-    final Map<String, Set<String>> featureRegionMap;
-    final Map<String, Set<String>> regionPackageMap;
+    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<>();
+
     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;
@@ -69,8 +80,10 @@ class RegionConfiguration {
         this.regionPackageMap = regionPackageMap;
         this.defaultRegions = defaultRegions;
     }
-    RegionConfiguration(BundleContext context, Dictionary<String, Object> 
regProps)
+
+    RegionConfiguration(final BundleContext context)
             throws IOException, URISyntaxException {
+
         URI idbsnverFile = getDataFileURI(context, IDBSNVER_FILENAME);
         // Register the location as a service property for diagnostic purposes
         regProps.put(IDBSNVER_FILENAME, idbsnverFile.toString());
@@ -170,11 +183,31 @@ class RegionConfiguration {
         List<String> l = bsnVerMap.get(bsnVer);
         if (l == null) {
             l = new ArrayList<>();
-            bsnVerMap.put(bsnVer, l);
+        } else {
+            l = new ArrayList<>(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);
     }
@@ -196,26 +229,37 @@ class RegionConfiguration {
         }
 
         for (String n : p.stringPropertyNames()) {
-            String[] features = p.getProperty(n).split(",");
-            addValuesToMap(m, n, features);
+            String[] values = p.getProperty(n).split(",");
+            addValuesToMap(m, n, Arrays.asList(values));
         }
 
         return m;
     }
 
-    private static void addValuesToMap(Map<String, Set<String>> map, String 
key, String ... values) {
-        addValuesToMap(map, key, Arrays.asList(values));
-
-    }
     private static void addValuesToMap(Map<String, Set<String>> map, String 
key, Collection<String> values) {
         Set<String> bf = map.get(key);
         if (bf == null) {
             bf = new LinkedHashSet<>(); // It's important that the insertion 
order is maintained.
-            map.put(key, bf);
+        } else {
+            bf = new LinkedHashSet<>(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);
         if (fn == null) {
@@ -264,4 +308,137 @@ class RegionConfiguration {
     public Set<String> getDefaultRegions() {
         return defaultRegions;
     }
+
+    public Dictionary<String, Object> getRegistrationProperties() {
+        return regProps;
+    }
+
+    private String[] convert(final Object obj) {
+        if ( obj instanceof String[]) {
+            return (String[])obj;
+        }
+        return new String[] {obj.toString()};
+    }
+
+    /**
+     * Add a new factory configuration
+     * @param pid The pid
+     * @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;
+        }
+    }
+
+    /**
+     * Remove a factory configuration
+     * @param pid The pid
+     */
+    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;
+            }
+        }
+    }
 }
diff --git 
a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java 
b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java
index 74a5ae7..23ac57d 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java
@@ -18,8 +18,6 @@
  */
 package org.apache.sling.feature.apiregions.impl;
 
-import java.io.IOException;
-import java.net.URISyntaxException;
 import java.util.Collection;
 
 import org.osgi.framework.hooks.resolver.ResolverHook;
@@ -30,8 +28,7 @@ class RegionEnforcer implements ResolverHookFactory {
 
     final RegionConfiguration configuration;
 
-    RegionEnforcer(RegionConfiguration configuration)
-            throws IOException, URISyntaxException {
+    RegionEnforcer(RegionConfiguration configuration) {
         this.configuration = configuration;
     }
 
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 94b639b..44f9d2f 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
@@ -207,7 +207,7 @@ public class ActivatorTest {
 
         Activator a = new Activator();
         a.bundleContext = bc;
-
+        a.configuration = new RegionConfiguration(null, null, null, null, 
null);
         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 218bfeb..d0cd62e 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
@@ -39,7 +39,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -56,7 +55,7 @@ public class RegionConfigurationTest {
         BundleContext ctx = Mockito.mock(BundleContext.class);
 
         try {
-            new RegionConfiguration(ctx, new Hashtable<String, Object>());
+            new RegionConfiguration(ctx);
             fail("Expected exception. Configuration is enabled but is missing 
configuration");
         } catch (Exception e) {
             // good
@@ -73,14 +72,13 @@ public class RegionConfigurationTest {
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
FEATURE_REGION_FILENAME)).thenReturn(e);
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
REGION_PACKAGE_FILENAME)).thenReturn(e);
 
-        Hashtable<String, Object> props = new Hashtable<>();
-        RegionConfiguration re = new RegionConfiguration(ctx, props);
+        RegionConfiguration re = new RegionConfiguration(ctx);
         assertEquals(2, re.bsnVerMap.size());
         assertEquals(Collections.singletonList("g:b1:1"),
                 re.bsnVerMap.get(new 
AbstractMap.SimpleEntry<String,Version>("b1", new Version(1,0,0))));
         assertEquals(new HashSet<>(Arrays.asList("g:b2:1.2.3", "g2:b2:1.2.4")),
                 new HashSet<>(re.bsnVerMap.get(new 
AbstractMap.SimpleEntry<String,Version>("b2", new Version(1,2,3)))));
-        assertEquals(new File(f).toURI().toString(), 
props.get(IDBSNVER_FILENAME));
+        assertEquals(new File(f).toURI().toString(), 
re.getRegistrationProperties().get(IDBSNVER_FILENAME));
     }
 
     @Test
@@ -93,8 +91,7 @@ public class RegionConfigurationTest {
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
FEATURE_REGION_FILENAME)).thenReturn(e);
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
REGION_PACKAGE_FILENAME)).thenReturn(e);
 
-        Hashtable<String, Object> props = new Hashtable<>();
-        RegionConfiguration re = new RegionConfiguration(ctx, props);
+        RegionConfiguration re = new RegionConfiguration(ctx);
         assertEquals(3, re.bundleFeatureMap.size());
         
assertEquals(Collections.singleton("org.sling:something:1.2.3:slingosgifeature:myclassifier"),
                 re.bundleFeatureMap.get("org.sling:b1:1"));
@@ -102,7 +99,7 @@ public class RegionConfigurationTest {
                 re.bundleFeatureMap.get("org.sling:b2:1"));
         assertEquals(new HashSet<>(Arrays.asList("some.other:feature:123", 
"org.sling:something:1.2.3:slingosgifeature:myclassifier")),
                 re.bundleFeatureMap.get("org.sling:b3:1"));
-        assertEquals(new File(f).toURI().toString(), 
props.get(BUNDLE_FEATURE_FILENAME));
+        assertEquals(new File(f).toURI().toString(),  
re.getRegistrationProperties().get(BUNDLE_FEATURE_FILENAME));
     }
 
     @Test
@@ -115,14 +112,13 @@ public class RegionConfigurationTest {
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
FEATURE_REGION_FILENAME)).thenReturn(f);
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
REGION_PACKAGE_FILENAME)).thenReturn(e);
 
-        Hashtable<String, Object> props = new Hashtable<>();
-        RegionConfiguration re = new RegionConfiguration(ctx, props);
+        RegionConfiguration re = new RegionConfiguration(ctx);
         assertEquals(2, re.featureRegionMap.size());
         assertEquals(Collections.singleton("global"),
                 re.featureRegionMap.get("an.other:feature:123"));
         assertEquals(new HashSet<>(Arrays.asList("global", "internal")),
                 re.featureRegionMap.get("org.sling:something:1.2.3"));
-        assertEquals(new File(f).toURI().toString(), 
props.get(FEATURE_REGION_FILENAME));
+        assertEquals(new File(f).toURI().toString(),  
re.getRegistrationProperties().get(FEATURE_REGION_FILENAME));
     }
 
     @Test
@@ -135,14 +131,13 @@ public class RegionConfigurationTest {
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
FEATURE_REGION_FILENAME)).thenReturn(e);
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
REGION_PACKAGE_FILENAME)).thenReturn(f);
 
-        Hashtable<String, Object> props = new Hashtable<>();
-        RegionConfiguration re = new RegionConfiguration(ctx, props);
+        RegionConfiguration re = new RegionConfiguration(ctx);
         assertEquals(2, re.regionPackageMap.size());
         assertEquals(Collections.singleton("xyz"),
                 re.regionPackageMap.get("internal"));
         assertEquals(new HashSet<>(Arrays.asList("a.b.c", "d.e.f", "test")),
                 re.regionPackageMap.get("global"));
-        assertEquals(new File(f).toURI().toString(), 
props.get(REGION_PACKAGE_FILENAME));
+        assertEquals(new File(f).toURI().toString(),  
re.getRegistrationProperties().get(REGION_PACKAGE_FILENAME));
     }
 
     @Test
@@ -156,7 +151,7 @@ public class RegionConfigurationTest {
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
FEATURE_REGION_FILENAME)).thenReturn(e);
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
REGION_PACKAGE_FILENAME)).thenReturn(f);
 
-        RegionConfiguration re = new RegionConfiguration(ctx, new 
Hashtable<String, Object>());
+        RegionConfiguration re = new RegionConfiguration(ctx);
         assertEquals(1, re.regionPackageMap.size());
         assertEquals(new HashSet<>(Arrays.asList("xyz", "a.b.c", "d.e.f", 
"test")),
                 re.regionPackageMap.get("global"));
@@ -174,7 +169,7 @@ public class RegionConfigurationTest {
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + 
REGION_PACKAGE_FILENAME)).
             
thenReturn(getClass().getResource("/regions1.properties").getFile());
 
-        RegionConfiguration re = new RegionConfiguration(ctx, new 
Hashtable<String, Object>());
+        RegionConfiguration re = new RegionConfiguration(ctx);
         assertTrue(re.bsnVerMap.size() > 0);
         assertTrue(re.bundleFeatureMap.size() > 0);
         assertTrue(re.featureRegionMap.size() > 0);
@@ -194,7 +189,7 @@ public class RegionConfigurationTest {
                 getFile()).getParentFile().toURI().toString();
         
Mockito.when(ctx.getProperty(PROPERTIES_FILE_LOCATION)).thenReturn(location);
 
-        RegionConfiguration re = new RegionConfiguration(ctx, new 
Hashtable<String, Object>());
+        RegionConfiguration re = new RegionConfiguration(ctx);
         assertTrue(re.bsnVerMap.size() > 0);
         assertTrue(re.bundleFeatureMap.size() > 0);
         assertTrue(re.featureRegionMap.size() > 0);
@@ -207,7 +202,7 @@ public class RegionConfigurationTest {
         Mockito.when(ctx.getProperty(PROPERTIES_FILE_LOCATION)).
             thenReturn("classloader://props1");
 
-        RegionConfiguration re = new RegionConfiguration(ctx, new 
Hashtable<String, Object>());
+        RegionConfiguration re = new RegionConfiguration(ctx);
         assertTrue(re.bsnVerMap.size() > 0);
         assertTrue(re.bundleFeatureMap.size() > 0);
         assertTrue(re.featureRegionMap.size() > 0);
@@ -220,7 +215,7 @@ public class RegionConfigurationTest {
         Mockito.when(ctx.getProperty(PROPERTIES_FILE_LOCATION)).
             thenReturn("classloader://props2");
 
-        RegionConfiguration re = new RegionConfiguration(ctx, new 
Hashtable<String, Object>());
+        RegionConfiguration re = new RegionConfiguration(ctx);
         assertEquals(Arrays.asList("r0", "r1", "r2", "r3"),
                 new 
ArrayList<>(re.featureRegionMap.get("org.sling:something:1.2.3")));
     }
@@ -231,7 +226,7 @@ public class RegionConfigurationTest {
         Mockito.when(ctx.getProperty(PROPERTIES_FILE_LOCATION)).
             thenReturn("classloader://props1");
 
-        RegionConfiguration re = new RegionConfiguration(ctx, new 
Hashtable<String, Object>());
+        RegionConfiguration re = new RegionConfiguration(ctx);
         assertTrue(re.bsnVerMap.size() > 0);
         assertBSNVerMapUnmodifiable(re.bsnVerMap);
         assertTrue(re.bundleFeatureMap.size() > 0);
@@ -257,7 +252,7 @@ public class RegionConfigurationTest {
         Mockito.when(ctx.getProperty(PROPERTIES_FILE_LOCATION)).
         thenReturn("classloader://props1");
 
-        RegionConfiguration re = new RegionConfiguration(ctx, new 
Hashtable<String, Object>());
+        RegionConfiguration re = new RegionConfiguration(ctx);
         ResolverHook hook = new 
RegionEnforcer(re).begin(Collections.emptySet());
         Field f = ResolverHookImpl.class.getDeclaredField("configuration");
         f.setAccessible(true);

Reply via email to