Repository: karaf
Updated Branches:
  refs/heads/master 2831b0f87 -> 1996fca45


KARAF-4254 - Prevent NPE in deployer and subsystem resolver


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/1996fca4
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/1996fca4
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/1996fca4

Branch: refs/heads/master
Commit: 1996fca4587053dc4ef7b135e64ae3c62559aa6b
Parents: 2831b0f
Author: Jean-Baptiste Onofré <[email protected]>
Authored: Fri Jan 8 15:27:29 2016 +0100
Committer: Jean-Baptiste Onofré <[email protected]>
Committed: Fri Jan 8 15:27:29 2016 +0100

----------------------------------------------------------------------
 .../internal/region/SubsystemResolver.java      | 100 ++++++++++---------
 .../features/internal/service/Deployer.java     |  38 ++++---
 2 files changed, 75 insertions(+), 63 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/1996fca4/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
index 0be2ee0..d162e9e 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
@@ -21,14 +21,7 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import org.apache.felix.utils.collections.DictionaryAsMap;
 import org.apache.karaf.features.BundleInfo;
@@ -172,7 +165,10 @@ public class SubsystemResolver {
     }
 
     public Set<String> collectPrerequisites() throws Exception {
-        return root.collectPrerequisites();
+        if (root != null) {
+            return root.collectPrerequisites();
+        }
+        return new HashSet<String>();
     }
 
     public Map<Resource, List<Wire>> resolve(
@@ -279,15 +275,17 @@ public class SubsystemResolver {
     }
 
     private void addBundleInfos(Subsystem subsystem) {
-        String region = getFlatSubsystemsMap().get(subsystem.getName());
-        Map<String, BundleInfo> bis = bundleInfos.get(region);
-        if (bis == null) {
-            bis = new HashMap<>();
-            bundleInfos.put(region, bis);
-        }
-        bis.putAll(subsystem.getBundleInfos());
-        for (Subsystem child : subsystem.getChildren()) {
-            addBundleInfos(child);
+        if (subsystem != null) {
+            String region = getFlatSubsystemsMap().get(subsystem.getName());
+            Map<String, BundleInfo> bis = bundleInfos.get(region);
+            if (bis == null) {
+                bis = new HashMap<>();
+                bundleInfos.put(region, bis);
+            }
+            bis.putAll(subsystem.getBundleInfos());
+            for (Subsystem child : subsystem.getChildren()) {
+                addBundleInfos(child);
+            }
         }
     }
 
@@ -303,28 +301,30 @@ public class SubsystemResolver {
         if (flatDigraph == null) {
             flatDigraph = new StandardRegionDigraph(null, null);
             Map<String, String> flats = getFlatSubsystemsMap();
-            for (Region r : digraph.getRegions()) {
-                if (r.getName().equals(flats.get(r.getName()))) {
-                    flatDigraph.createRegion(r.getName());
+            if (digraph != null) {
+                for (Region r : digraph.getRegions()) {
+                    if (r.getName().equals(flats.get(r.getName()))) {
+                        flatDigraph.createRegion(r.getName());
+                    }
                 }
-            }
-            for (Region r : digraph.getRegions()) {
-                for (RegionDigraph.FilteredRegion fr : digraph.getEdges(r)) {
-                    String rt = flats.get(r.getName());
-                    String rh = flats.get(fr.getRegion().getName());
-                    if (!rh.equals(rt)) {
-                        Region tail = flatDigraph.getRegion(rt);
-                        Region head = flatDigraph.getRegion(rh);
-                        RegionFilterBuilder rfb = 
flatDigraph.createRegionFilterBuilder();
-                        for (Map.Entry<String, Collection<String>> entry : 
fr.getFilter().getSharingPolicy().entrySet()) {
-                            // Discard osgi.identity namespace
-                            if (!IDENTITY_NAMESPACE.equals(entry.getKey())) {
-                                for (String f : entry.getValue()) {
-                                    rfb.allow(entry.getKey(), f);
+                for (Region r : digraph.getRegions()) {
+                    for (RegionDigraph.FilteredRegion fr : 
digraph.getEdges(r)) {
+                        String rt = flats.get(r.getName());
+                        String rh = flats.get(fr.getRegion().getName());
+                        if (!rh.equals(rt)) {
+                            Region tail = flatDigraph.getRegion(rt);
+                            Region head = flatDigraph.getRegion(rh);
+                            RegionFilterBuilder rfb = 
flatDigraph.createRegionFilterBuilder();
+                            for (Map.Entry<String, Collection<String>> entry : 
fr.getFilter().getSharingPolicy().entrySet()) {
+                                // Discard osgi.identity namespace
+                                if 
(!IDENTITY_NAMESPACE.equals(entry.getKey())) {
+                                    for (String f : entry.getValue()) {
+                                        rfb.allow(entry.getKey(), f);
+                                    }
                                 }
                             }
+                            flatDigraph.connect(tail, rfb.build(), head);
                         }
-                        flatDigraph.connect(tail, rfb.build(), head);
                     }
                 }
             }
@@ -390,14 +390,16 @@ public class SubsystemResolver {
         Map<Resource, String> resources = new HashMap<>();
         SimpleFilter sf = createFilter(IDENTITY_NAMESPACE, "*",
                 CAPABILITY_TYPE_ATTRIBUTE, TYPE_SUBSYSTEM);
-        for (Resource resource : wiring.keySet()) {
-            if (findMatchingCapability(resourceFilter, 
resource.getCapabilities(null)) != null) {
-                // Find the subsystem where this feature is installed
-                Wire wire = findMatchingWire(sf, wiring.get(resource));
-                if (wire != null) {
-                    String region = (String) 
wire.getCapability().getAttributes().get(IDENTITY_NAMESPACE);
-                    region = flats.get(region);
-                    resources.put(resource, region);
+        if (wiring != null) {
+            for (Resource resource : wiring.keySet()) {
+                if (findMatchingCapability(resourceFilter, 
resource.getCapabilities(null)) != null) {
+                    // Find the subsystem where this feature is installed
+                    Wire wire = findMatchingWire(sf, wiring.get(resource));
+                    if (wire != null) {
+                        String region = (String) 
wire.getCapability().getAttributes().get(IDENTITY_NAMESPACE);
+                        region = flats.get(region);
+                        resources.put(resource, region);
+                    }
                 }
             }
         }
@@ -483,13 +485,17 @@ public class SubsystemResolver {
         while (isFlat(nonFlat)) {
             nonFlat = nonFlat.getParent();
         }
-        toFlatten.put(subsystem.getName(), nonFlat.getName());
-        for (Subsystem child : subsystem.getChildren()) {
-            findSubsystemsToFlatten(child, toFlatten);
+        if (subsystem != null) {
+            toFlatten.put(subsystem.getName(), nonFlat.getName());
+            for (Subsystem child : subsystem.getChildren()) {
+                findSubsystemsToFlatten(child, toFlatten);
+            }
         }
     }
 
     private boolean isFlat(Subsystem subsystem) {
+        if (subsystem == null || subsystem.getFeature() == null)
+            return false;
         return subsystem.getFeature() != null && 
subsystem.getFeature().getScoping() == null;
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/1996fca4/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
index 16b2235..1414b70 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
@@ -345,20 +345,24 @@ public class Deployer {
             Set<? extends Resource> unmanaged = 
apply(flatten(unmanagedBundles), adapt(BundleRevision.class));
             Set<Resource> requested = new HashSet<>();
             // Gather bundles required by a feature
-            for (List<Wire> wires : resolver.getWiring().values()) {
-                for (Wire wire : wires) {
-                    if (features.contains(wire.getRequirer()) && 
unmanaged.contains(wire.getProvider())) {
-                        requested.add(wire.getProvider());
+            if (resolver != null && resolver.getWiring() != null) {
+                for (List<Wire> wires : resolver.getWiring().values()) {
+                    for (Wire wire : wires) {
+                        if (features.contains(wire.getRequirer()) && 
unmanaged.contains(wire.getProvider())) {
+                            requested.add(wire.getProvider());
+                        }
                     }
                 }
             }
             // Now, we know which bundles are completely unmanaged
             unmanaged.removeAll(requested);
             // Check if bundles have wires from really unmanaged bundles
-            for (List<Wire> wires : resolver.getWiring().values()) {
-                for (Wire wire : wires) {
-                    if (requested.contains(wire.getProvider()) && 
unmanaged.contains(wire.getRequirer())) {
-                        requested.remove(wire.getProvider());
+            if (resolver != null && resolver.getWiring() != null) {
+                for (List<Wire> wires : resolver.getWiring().values()) {
+                    for (Wire wire : wires) {
+                        if (requested.contains(wire.getProvider()) && 
unmanaged.contains(wire.getRequirer())) {
+                            requested.remove(wire.getProvider());
+                        }
                     }
                 }
             }
@@ -919,14 +923,16 @@ public class Deployer {
         for (Bundle bundle : bundles) {
             newFragments.put(bundle, new HashSet<Resource>());
         }
-        for (Resource res : resolution.keySet()) {
-            for (Wire wire : resolution.get(res)) {
-                if 
(HOST_NAMESPACE.equals(wire.getCapability().getNamespace())) {
-                    Bundle bundle = resources.get(wire.getProvider());
-                    if (bundle != null) {
-                        Bundle b = resources.get(wire.getRequirer());
-                        Resource r = b != null ? b.adapt(BundleRevision.class) 
: wire.getRequirer();
-                        newFragments.get(bundle).add(r);
+        if (resolution != null) {
+            for (Resource res : resolution.keySet()) {
+                for (Wire wire : resolution.get(res)) {
+                    if 
(HOST_NAMESPACE.equals(wire.getCapability().getNamespace())) {
+                        Bundle bundle = resources.get(wire.getProvider());
+                        if (bundle != null) {
+                            Bundle b = resources.get(wire.getRequirer());
+                            Resource r = b != null ? 
b.adapt(BundleRevision.class) : wire.getRequirer();
+                            newFragments.get(bundle).add(r);
+                        }
                     }
                 }
             }

Reply via email to