Repository: karaf
Updated Branches:
  refs/heads/master 5e050de5e -> 45fed9365


[KARAF-5435] BundleException when installing a bundle by API when the 
FeatureService install a feature


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

Branch: refs/heads/master
Commit: 45fed936553e464a0575e61d94fe67128c089a31
Parents: 5e050de
Author: Guillaume Nodet <[email protected]>
Authored: Fri Oct 20 15:52:43 2017 +0200
Committer: Guillaume Nodet <[email protected]>
Committed: Fri Oct 20 15:59:03 2017 +0200

----------------------------------------------------------------------
 .../karaf/features/internal/osgi/Activator.java |  1 +
 .../internal/service/BundleInstallSupport.java  |  2 ++
 .../service/BundleInstallSupportImpl.java       | 30 ++++++++++++++++----
 .../internal/service/FeaturesServiceImpl.java   |  2 +-
 .../internal/service/StaticInstallSupport.java  |  4 +++
 5 files changed, 33 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/45fed936/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
index 1ac72b6..6881d47 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
@@ -321,6 +321,7 @@ public class Activator extends BaseActivator {
             featuresService = null;
         }
         if (installSupport != null) {
+            installSupport.unregister();
             installSupport.saveDigraph();
         }
     }

http://git-wip-us.apache.org/repos/asf/karaf/blob/45fed936/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupport.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupport.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupport.java
index 8b0ffc4..5865592 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupport.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupport.java
@@ -69,6 +69,8 @@ public interface BundleInstallSupport {
     File getDataFile(String name);
     
     FrameworkInfo getInfo();
+
+    void unregister();
     
     class FrameworkInfo {
         public Bundle ourBundle;

http://git-wip-us.apache.org/repos/asf/karaf/blob/45fed936/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java
index 4463465..232c57b 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java
@@ -27,6 +27,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
 
 import org.apache.karaf.features.Feature;
@@ -73,7 +74,10 @@ public class BundleInstallSupportImpl implements 
BundleInstallSupport {
      * take place.
      */
     private final BundleContext systemBundleContext;
-    
+
+    private Map<Thread, ResolverHook> hooks = new ConcurrentHashMap<>();
+    private ServiceRegistration<ResolverHookFactory> hookRegistration;
+
     public BundleInstallSupportImpl(Bundle ourBundle,
                    BundleContext ourBundleContext,
                    BundleContext systemBundleContext,
@@ -84,6 +88,17 @@ public class BundleInstallSupportImpl implements 
BundleInstallSupport {
         this.systemBundleContext = systemBundleContext;
         this.configInstaller = configInstaller;
         this.digraph = digraph;
+        if (systemBundleContext != null) {
+            hookRegistration = 
systemBundleContext.registerService(ResolverHookFactory.class,
+                    triggers -> hooks.get(Thread.currentThread()), null);
+        }
+
+    }
+
+    public void unregister() {
+        if (hookRegistration != null) {
+            hookRegistration.unregister();
+        }
     }
     
     public void print(String message, boolean verbose) {
@@ -176,10 +191,16 @@ public class BundleInstallSupportImpl implements 
BundleInstallSupport {
                     }
                     Bundle sourceBundle = 
requirement.getRevision().getBundle();
                     Resource sourceResource = bndToRes.get(sourceBundle);
+                    List<Wire> wires = wiring.get(sourceResource);
+                    if (sourceBundle == null || wires == null) {
+                        // This could be a bundle external to this resolution 
which
+                        // is being resolve at the same time, so do not 
interfere
+                        return;
+                    }
                     Set<Resource> wired = new HashSet<>();
                     // Get a list of allowed wired resources
                     wired.add(sourceResource);
-                    for (Wire wire : wiring.get(sourceResource)) {
+                    for (Wire wire : wires) {
                         wired.add(wire.getProvider());
                         if 
(HostNamespace.HOST_NAMESPACE.equals(wire.getRequirement().getNamespace())) {
                             for (Wire hostWire : 
wiring.get(wire.getProvider())) {
@@ -205,13 +226,12 @@ public class BundleInstallSupportImpl implements 
BundleInstallSupport {
             public void end() {
             }
         };
-        ResolverHookFactory factory = triggers -> hook;
-        ServiceRegistration<ResolverHookFactory> registration = 
systemBundleContext.registerService(ResolverHookFactory.class, factory, null);
+        hooks.put(Thread.currentThread(), hook);
         try {
             FrameworkWiring frameworkWiring = 
systemBundleContext.getBundle().adapt(FrameworkWiring.class);
             frameworkWiring.resolveBundles(bundles);
         } finally {
-            registration.unregister();
+            hooks.remove(Thread.currentThread());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/45fed936/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
index cf01a8f..4301448 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
@@ -155,7 +155,7 @@ public class FeaturesServiceImpl implements 
FeaturesService, Deployer.DeployCall
     }
 
     public void stop() {
-      this.executor.shutdown();
+        this.executor.shutdown();
     }
 
     @SuppressWarnings({"unchecked", "rawtypes"})

http://git-wip-us.apache.org/repos/asf/karaf/blob/45fed936/features/core/src/main/java/org/apache/karaf/features/internal/service/StaticInstallSupport.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/StaticInstallSupport.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/StaticInstallSupport.java
index eaecccb..30471a4 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/StaticInstallSupport.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/StaticInstallSupport.java
@@ -92,4 +92,8 @@ public abstract class StaticInstallSupport implements 
BundleInstallSupport {
         return new FrameworkInfo();
     }
 
+    @Override
+    public void unregister() {
+    }
+
 }

Reply via email to