This is an automated email from the ASF dual-hosted git repository. davidb pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-apiregions.git
commit 379d1d8b2a6aec7114d4d1a3be89bf5701e22fd7 Author: David Bosschaert <[email protected]> AuthorDate: Mon Nov 5 13:46:46 2018 +0000 Rename whitelisting to apiregions Also register resolver hook service with properties that point at the properties files used --- .../sling/feature/apiregions/impl/Activator.java | 8 +++- .../feature/apiregions/impl/RegionEnforcer.java | 50 +++++++++++++++------- .../feature/apiregions/impl/ResolverHookImpl.java | 28 ++++++------ .../feature/apiregions/impl/ActivatorTest.java | 31 +++++++++++++- .../apiregions/impl/RegionEnforcerTest.java | 21 ++++++--- 5 files changed, 100 insertions(+), 38 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 7d77d5e..6ced921 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 @@ -22,11 +22,15 @@ import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.hooks.resolver.ResolverHookFactory; +import java.util.Dictionary; +import java.util.Hashtable; + public class Activator implements BundleActivator { @Override public synchronized void start(BundleContext context) throws Exception { - RegionEnforcer enforcer = new RegionEnforcer(); - context.registerService(ResolverHookFactory.class, enforcer, null); + Dictionary<String, Object> props = new Hashtable<>(); + RegionEnforcer enforcer = new RegionEnforcer(props); + context.registerService(ResolverHookFactory.class, enforcer, props); } @Override 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 fe30277..56a5b74 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 @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Dictionary; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -42,7 +43,7 @@ import java.util.Set; class RegionEnforcer implements ResolverHookFactory { public static String GLOBAL_REGION = "global"; - static final String PROPERTIES_FILE_PREFIX = "whitelisting."; + static final String PROPERTIES_FILE_PREFIX = "apiregions."; static final String IDBSNVER_FILENAME = "idbsnver.properties"; static final String BUNDLE_FEATURE_FILENAME = "bundles.properties"; static final String FEATURE_REGION_FILENAME = "features.properties"; @@ -53,15 +54,33 @@ class RegionEnforcer implements ResolverHookFactory { final Map<String, Set<String>> featureRegionMap; final Map<String, Set<String>> regionPackageMap; - public RegionEnforcer() throws IOException { - bsnVerMap = populateBSNVerMap(); - bundleFeatureMap = populateBundleFeatureMap(); - featureRegionMap = populateFeatureRegionMap(); - regionPackageMap = populateRegionPackageMap(); + public RegionEnforcer(Dictionary<String, Object> regProps) throws IOException { + File idbsnverFile = getDataFile(IDBSNVER_FILENAME); + bsnVerMap = populateBSNVerMap(idbsnverFile); + if (idbsnverFile != null) { + regProps.put(IDBSNVER_FILENAME, idbsnverFile.getAbsolutePath()); + } + + File bundlesFile = getDataFile(BUNDLE_FEATURE_FILENAME); + bundleFeatureMap = populateBundleFeatureMap(bundlesFile); + if (bundlesFile != null) { + regProps.put(BUNDLE_FEATURE_FILENAME, bundlesFile.getAbsolutePath()); + } + + File featuresFile = getDataFile(FEATURE_REGION_FILENAME); + featureRegionMap = populateFeatureRegionMap(featuresFile); + if (featuresFile != null) { + regProps.put(FEATURE_REGION_FILENAME, featuresFile.getAbsolutePath()); + } + + File regionsFile = getDataFile(REGION_PACKAGE_FILENAME); + regionPackageMap = populateRegionPackageMap(regionsFile); + if (regionsFile != null) { + regProps.put(REGION_PACKAGE_FILENAME, regionsFile.getAbsolutePath()); + } } - private Map<Map.Entry<String, Version>, List<String>> populateBSNVerMap() throws IOException { - File idbsnverFile = getDataFile(IDBSNVER_FILENAME); + private Map<Map.Entry<String, Version>, List<String>> populateBSNVerMap(File idbsnverFile) throws IOException { if (idbsnverFile != null && idbsnverFile.exists()) { Map<Map.Entry<String, Version>, List<String>> m = new HashMap<>(); @@ -93,22 +112,21 @@ class RegionEnforcer implements ResolverHookFactory { } } - private Map<String, Set<String>> populateBundleFeatureMap() throws IOException { - return loadMap(BUNDLE_FEATURE_FILENAME); + private Map<String, Set<String>> populateBundleFeatureMap(File bundlesFile) throws IOException { + return loadMap(bundlesFile); } - private Map<String, Set<String>> populateFeatureRegionMap() throws IOException { - return loadMap(FEATURE_REGION_FILENAME); + private Map<String, Set<String>> populateFeatureRegionMap(File featuresFile) throws IOException { + return loadMap(featuresFile); } - private Map<String, Set<String>> populateRegionPackageMap() throws IOException { - return loadMap(REGION_PACKAGE_FILENAME); + private Map<String, Set<String>> populateRegionPackageMap(File regionsFile) throws IOException { + return loadMap(regionsFile); } - private Map<String, Set<String>> loadMap(String fileName) throws IOException { + private Map<String, Set<String>> loadMap(File propsFile) throws IOException { Map<String, Set<String>> m = new HashMap<>(); - File propsFile = getDataFile(fileName); if (propsFile != null && propsFile.exists()) { Properties p = new Properties(); try (InputStream is = new FileInputStream(propsFile)) { 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 caecb76..4939961 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 @@ -75,22 +75,24 @@ class ResolverHookImpl implements ResolverHook { String reqBundleName = reqBundle.getSymbolicName(); Version reqBundleVersion = reqBundle.getVersion(); - List<String> aids = bsnVerMap.get(new AbstractMap.SimpleEntry<String, Version>(reqBundleName, reqBundleVersion)); - if (aids == null) - return; // TODO what to do? List<String> reqFeatures = new ArrayList<>(); - for (String aid : aids) { - Set<String> fid = bundleFeatureMap.get(aid); - if (fid != null) - reqFeatures.addAll(fid); - } - Set<String> reqRegions = new HashSet<>(); - for (String feature : reqFeatures) { - Set<String> fr = featureRegionMap.get(feature); - if (fr != null) { - reqRegions.addAll(fr); + List<String> aids = bsnVerMap.get(new AbstractMap.SimpleEntry<String, Version>(reqBundleName, reqBundleVersion)); + if (aids != null) { + for (String aid : aids) { + Set<String> fid = bundleFeatureMap.get(aid); + if (fid != null) + reqFeatures.addAll(fid); + } + + for (String feature : reqFeatures) { + Set<String> fr = featureRegionMap.get(feature); + if (fr != null) { + reqRegions.addAll(fr); + } } + } else { + // Bundle is not coming from a feature } Set<BundleCapability> coveredCaps = new HashSet<>(); 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 3577535..fc19bc5 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,14 +18,43 @@ */ package org.apache.sling.feature.apiregions.impl; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.osgi.framework.BundleContext; import org.osgi.framework.hooks.resolver.ResolverHookFactory; +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Properties; + +import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.FEATURE_REGION_FILENAME; +import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.PROPERTIES_FILE_PREFIX; + public class ActivatorTest { + private Properties savedProps; + + @Before + public void setup() { + savedProps = new Properties(); // note that new Properties(props) doesn't copy + savedProps.putAll(System.getProperties()); + } + + @After + public void teardown() { + System.setProperties(savedProps); + savedProps = null; + } + @Test public void testStart() throws Exception { + String f = getClass().getResource("/features1.properties").getFile(); + System.setProperty(PROPERTIES_FILE_PREFIX + FEATURE_REGION_FILENAME, f); + + Dictionary<String, Object> expectedProps = new Hashtable<>(); + expectedProps.put(FEATURE_REGION_FILENAME, f); + BundleContext bc = Mockito.mock(BundleContext.class); Activator a = new Activator(); @@ -34,6 +63,6 @@ public class ActivatorTest { Mockito.verify(bc, Mockito.times(1)).registerService( Mockito.eq(ResolverHookFactory.class), Mockito.isA(RegionEnforcer.class), - Mockito.isNull()); + Mockito.eq(expectedProps)); } } diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java index 3e33075..96d33b3 100644 --- a/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java +++ b/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java @@ -27,6 +27,7 @@ import java.util.AbstractMap; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; +import java.util.Hashtable; import java.util.Properties; import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.BUNDLE_FEATURE_FILENAME; @@ -54,7 +55,7 @@ public class RegionEnforcerTest { @Test public void testRegionEnforcerNoConfiguration() throws Exception { - RegionEnforcer re = new RegionEnforcer(); + RegionEnforcer re = new RegionEnforcer(new Hashtable<>()); assertEquals(0, re.bsnVerMap.size()); assertEquals(0, re.bundleFeatureMap.size()); assertEquals(0, re.featureRegionMap.size()); @@ -66,12 +67,14 @@ public class RegionEnforcerTest { String f = getClass().getResource("/idbsnver1.properties").getFile(); System.setProperty(PROPERTIES_FILE_PREFIX + IDBSNVER_FILENAME, f); - RegionEnforcer re = new RegionEnforcer(); + Hashtable<String, Object> props = new Hashtable<>(); + RegionEnforcer re = new RegionEnforcer(props); 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(f, props.get(IDBSNVER_FILENAME)); } @Test @@ -79,7 +82,8 @@ public class RegionEnforcerTest { String f = getClass().getResource("/bundles1.properties").getFile(); System.setProperty(PROPERTIES_FILE_PREFIX + BUNDLE_FEATURE_FILENAME, f); - RegionEnforcer re = new RegionEnforcer(); + Hashtable<String, Object> props = new Hashtable<>(); + RegionEnforcer re = new RegionEnforcer(props); assertEquals(3, re.bundleFeatureMap.size()); assertEquals(Collections.singleton("org.sling:something:1.2.3:slingosgifeature:myclassifier"), re.bundleFeatureMap.get("org.sling:b1:1")); @@ -87,6 +91,7 @@ public class RegionEnforcerTest { 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(f, props.get(BUNDLE_FEATURE_FILENAME)); } @Test @@ -94,12 +99,14 @@ public class RegionEnforcerTest { String f = getClass().getResource("/features1.properties").getFile(); System.setProperty(PROPERTIES_FILE_PREFIX + FEATURE_REGION_FILENAME, f); - RegionEnforcer re = new RegionEnforcer(); + Hashtable<String, Object> props = new Hashtable<>(); + RegionEnforcer re = new RegionEnforcer(props); 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(f, props.get(FEATURE_REGION_FILENAME)); } @Test @@ -107,12 +114,14 @@ public class RegionEnforcerTest { String f = getClass().getResource("/regions1.properties").getFile(); System.setProperty(PROPERTIES_FILE_PREFIX + REGION_PACKAGE_FILENAME, f); - RegionEnforcer re = new RegionEnforcer(); + Hashtable<String, Object> props = new Hashtable<>(); + RegionEnforcer re = new RegionEnforcer(props); 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(f, props.get(REGION_PACKAGE_FILENAME)); } @Test @@ -126,7 +135,7 @@ public class RegionEnforcerTest { System.setProperty(PROPERTIES_FILE_PREFIX + REGION_PACKAGE_FILENAME, getClass().getResource("/regions1.properties").getFile()); - RegionEnforcer re = new RegionEnforcer(); + RegionEnforcer re = new RegionEnforcer(new Hashtable<>()); assertTrue(re.bsnVerMap.size() > 0); assertTrue(re.bundleFeatureMap.size() > 0); assertTrue(re.featureRegionMap.size() > 0);
