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);