You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by da...@apache.org on 2019/03/12 12:51:05 UTC

[sling-org-apache-sling-feature-apiregions] branch master updated: Fix the region reporting on removed candidates.

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


The following commit(s) were added to refs/heads/master by this push:
     new e30351b  Fix the region reporting on removed candidates.
e30351b is described below

commit e30351b395b94a0a9f6f4823ed82a407a9f1fb08
Author: David Bosschaert <bo...@adobe.com>
AuthorDate: Tue Mar 12 12:50:37 2019 +0000

    Fix the region reporting on removed candidates.
---
 .../feature/apiregions/impl/ResolverHookImpl.java  | 38 +++++++++++++++++++---
 .../apiregions/impl/ResolverHookImplTest.java      | 26 +++++++++++++++
 2 files changed, 59 insertions(+), 5 deletions(-)

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 0bdda79..0ec8c16 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
@@ -95,7 +95,8 @@ class ResolverHookImpl implements ResolverHook {
 
         Set<BundleCapability> coveredCaps = new HashSet<>();
 
-        Map<BundleCapability, Set<String>> bcRegionMap = new HashMap<>();
+        Map<BundleCapability, String> bcFeatureMap = new HashMap<>();
+        String packageName = null;
         nextCapability:
         for (BundleCapability bc : candidates) {
             BundleRevision rev = bc.getRevision();
@@ -153,7 +154,7 @@ class ResolverHookImpl implements ResolverHook {
                     coveredCaps.add(bc);
                     continue nextCapability;
                 }
-                bcRegionMap.put(bc, capRegions);
+                bcFeatureMap.put(bc, capFeat);
 
                 List<String> sharedRegions = new ArrayList<>(reqRegions);
                 sharedRegions.retainAll(capRegions);
@@ -177,9 +178,9 @@ class ResolverHookImpl implements ResolverHook {
 
                 Object pkg = bc.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE);
                 if (pkg instanceof String) {
-                    String packageName = (String) pkg;
+                    packageName = (String) pkg;
 
-                    Set<String> globalPackages = regionPackageMap.get("global");
+                    Set<String> globalPackages = regionPackageMap.get(RegionEnforcer.GLOBAL_REGION);
                     if (globalPackages != null && globalPackages.contains(packageName)) {
                         // If the export is in the global region everyone can access
                         coveredCaps.add(bc);
@@ -215,7 +216,7 @@ class ResolverHookImpl implements ResolverHook {
 
                 sb.append(bc.toString());
                 sb.append("[Regions: ");
-                sb.append(bcRegionMap.get(bc));
+                sb.append(getRegionsForPackage(packageName, bcFeatureMap.get(bc)));
                 sb.append("]");
             }
 
@@ -225,6 +226,33 @@ class ResolverHookImpl implements ResolverHook {
         }
     }
 
+    List<String> getRegionsForPackage(String packageName, String feature) {
+        if (packageName == null)
+            return Collections.emptyList();
+
+        Set<String> regions = featureRegionMap.get(feature);
+        if (regions == null)
+            return Collections.emptyList();
+
+        List<String> res = new ArrayList<>();
+        boolean found = false;
+        for (String region : regions) {
+            Set<String> packages = regionPackageMap.get(region);
+            if (packages == null)
+                continue;
+
+            if (found) {
+                // Since later regions inherit from earlier ones, if the package has been found before
+                // it also applies to this region.
+                res.add(region);
+            } else if (packages.contains(packageName)) {
+                res.add(region);
+                found = true;
+            }
+        }
+        return res;
+    }
+
     @Override
     public void end() {
         // Nothing to do
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 f22c212..2315267 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
@@ -272,6 +272,32 @@ public class ResolverHookImplTest {
         assertEquals(Collections.singletonList(bc13), c13);
     }
 
+    @Test
+    public void testGetRegionsForPackage() {
+        Set<String> regions = new HashSet<>(Arrays.asList("r1", "r2", "r3"));
+        Map<String, Set<String>> featureRegionMap = Collections.singletonMap("f2", regions);
+        Map<String, Set<String>> regionPackageMap = new HashMap<>();
+
+        regionPackageMap.put("r2", Collections.singleton("a.b.c"));
+        Set<String> pkgs = new HashSet<>();
+        pkgs.add("org.foo.bar");
+        pkgs.add("org.foo.zar");
+        regionPackageMap.put("r3", pkgs);
+
+        ResolverHookImpl rh = new ResolverHookImpl(
+                Collections.<Map.Entry<String, Version>, List<String>>emptyMap(),
+                Collections.<String, Set<String>>emptyMap(), featureRegionMap, regionPackageMap);
+
+        assertEquals(Collections.emptyList(), rh.getRegionsForPackage(null, "f1"));
+        assertEquals(Collections.emptyList(), rh.getRegionsForPackage("org.foo", "f1"));
+        assertEquals(Collections.emptyList(), rh.getRegionsForPackage(null, "f2"));
+
+        assertEquals(Collections.singletonList("r3"),
+            rh.getRegionsForPackage("org.foo.bar", "f2"));
+        assertEquals(Arrays.asList("r2", "r3"),
+            rh.getRegionsForPackage("a.b.c", "f2"));
+    }
+
     private BundleCapability mockCapability(String pkgName, String bid, Map<Entry<String, Version>, List<String>> bsnvermap) {
         for (Map.Entry<Map.Entry<String, Version>, List<String>> entry : bsnvermap.entrySet()) {
             if (entry.getValue().contains(bid)) {