Repository: camel
Updated Branches:
  refs/heads/master 96cfe14c9 -> a5a0cd7e7


CAMEL-8647: Make Camel OSGI Extender Subsystem-Aware - With thanks to Manuel 
Holzleitner


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

Branch: refs/heads/master
Commit: a5a0cd7e7dcc9b3c41ee96f5da0975f48c98ca7b
Parents: 96cfe14
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Fri Apr 17 15:42:33 2015 +0200
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Fri Apr 17 16:52:16 2015 +0200

----------------------------------------------------------------------
 .../org/apache/camel/impl/osgi/Activator.java   | 48 ++++++++++++++++----
 parent/pom.xml                                  |  3 +-
 2 files changed, 40 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/a5a0cd7e/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java 
b/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java
index d73f6c6..2eddc25 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java
@@ -64,6 +64,8 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.wiring.BundleWire;
+import org.osgi.framework.wiring.BundleWiring;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -75,15 +77,20 @@ public class Activator implements BundleActivator, 
BundleTrackerCustomizer {
     public static final String META_INF_DATAFORMAT = 
"META-INF/services/org/apache/camel/dataformat/";
     public static final String META_INF_TYPE_CONVERTER = 
"META-INF/services/org/apache/camel/TypeConverter";
     public static final String META_INF_FALLBACK_TYPE_CONVERTER = 
"META-INF/services/org/apache/camel/FallbackTypeConverter";
+    public static final String EXTENDER_NAMESPACE = "osgi.extender";
+    public static final String CAMEL_EXTENDER = "org.apache.camel";
 
     private static final Logger LOG = LoggerFactory.getLogger(Activator.class);
 
     private BundleTracker tracker;
     private Map<Long, List<BaseService>> resolvers = new 
ConcurrentHashMap<Long, List<BaseService>>();
+    private long bundleId;
 
     public void start(BundleContext context) throws Exception {
         LOG.info("Camel activator starting");
-        tracker = new BundleTracker(context, Bundle.ACTIVE, this);
+        bundleId = context.getBundle().getBundleId();
+        BundleContext systemBundleContext = 
context.getBundle(Constants.SYSTEM_BUNDLE_LOCATION).getBundleContext();
+        tracker = new BundleTracker(systemBundleContext, Bundle.ACTIVE, this);
         tracker.open();
         LOG.info("Camel activator started");
     }
@@ -96,18 +103,38 @@ public class Activator implements BundleActivator, 
BundleTrackerCustomizer {
 
     public Object addingBundle(Bundle bundle, BundleEvent event) {
         LOG.debug("Bundle started: {}", bundle.getSymbolicName());
-        List<BaseService> r = new ArrayList<BaseService>();
-        registerComponents(bundle, r);
-        registerLanguages(bundle, r);
-        registerDataFormats(bundle, r);
-        registerTypeConverterLoader(bundle, r);
-        for (BaseService service : r) {
-            service.register();
-        }
-        resolvers.put(bundle.getBundleId(), r);
+        if (extenderCapabilityWired(bundle)) {
+            List<BaseService> r = new ArrayList<BaseService>();
+            registerComponents(bundle, r);
+            registerLanguages(bundle, r);
+            registerDataFormats(bundle, r);
+            registerTypeConverterLoader(bundle, r);
+            for (BaseService service : r) {
+                service.register();
+            }
+            resolvers.put(bundle.getBundleId(), r);
+        }
+
         return bundle;
     }
 
+    private boolean extenderCapabilityWired(Bundle bundle) {
+        BundleWiring wiring = bundle.adapt(BundleWiring.class);
+        List<BundleWire> requiredWires = 
wiring.getRequiredWires(EXTENDER_NAMESPACE);
+        for (BundleWire requiredWire : requiredWires) {
+            if 
(CAMEL_EXTENDER.equals(requiredWire.getCapability().getAttributes().get(EXTENDER_NAMESPACE)))
 {
+                if (this.bundleId == 
requiredWire.getProviderWiring().getBundle().getBundleId()) {
+                    LOG.debug("Camel extender requirement of bundle {} 
correctly wired to this implementation", bundle.getBundleId());
+                    return true;
+                } else {
+                    LOG.info("Not processing bundle {} as it requires a camel 
extender but is not wired to the this implementation", bundle.getBundleId());
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
     public void modifiedBundle(Bundle bundle, BundleEvent event, Object 
object) {
     }
 
@@ -537,3 +564,4 @@ public class Activator implements BundleActivator, 
BundleTrackerCustomizer {
 
 }
 
+

http://git-wip-us.apache.org/repos/asf/camel/blob/a5a0cd7e/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 530371f..877c6ba 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -521,7 +521,8 @@
     
<camel.osgi.import.strict.version>version="[$(version;===;${camel.osgi.version.clean}),$(version;==+;${camel.osgi.version.clean}))"</camel.osgi.import.strict.version>
     
<camel.osgi.import.default.version>[$(version;==;$(@)),$(version;+;$(@)))</camel.osgi.import.default.version>
     <camel.osgi.import.defaults>
-      org.osgi.framework*;version="[1.5,2)",
+      org.osgi.framework;version="[1.5,2)",
+      org.osgi.framework.wiring;version="[1.0,2)",
       org.springframework.ws.*;version="[2,3)",
       org.springframework.xml.*;version="[2,3)",
       org.springframework.*;version="${spring-version-range}",

Reply via email to