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