Author: davsclaus
Date: Thu Oct 18 19:31:46 2012
New Revision: 1399809

URL: http://svn.apache.org/viewvc?rev=1399809&view=rev
Log:
CAMEL-5712: Fixed camel-blueprint to use a service listener to defer starting 
BlueprintCamelContext until after the BlueprintContainer is fully finished and 
has enlisted itself as service. This fixes among others using packageScan with 
blueprint.

Added:
    
camel/branches/camel-2.10.x/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/BlueprintPackageScanTest.java
      - copied unchanged from r1399808, 
camel/trunk/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/BlueprintPackageScanTest.java
    
camel/branches/camel-2.10.x/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/scan/
      - copied from r1399808, 
camel/trunk/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/scan/
    
camel/branches/camel-2.10.x/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/packagescan.xml
      - copied unchanged from r1399808, 
camel/trunk/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/packagescan.xml
Modified:
    camel/branches/camel-2.10.x/   (props changed)
    
camel/branches/camel-2.10.x/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
    
camel/branches/camel-2.10.x/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java

Propchange: camel/branches/camel-2.10.x/
------------------------------------------------------------------------------
  Merged /camel/trunk:r1399808

Propchange: camel/branches/camel-2.10.x/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: 
camel/branches/camel-2.10.x/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
URL: 
http://svn.apache.org/viewvc/camel/branches/camel-2.10.x/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java?rev=1399809&r1=1399808&r2=1399809&view=diff
==============================================================================
--- 
camel/branches/camel-2.10.x/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
 (original)
+++ 
camel/branches/camel-2.10.x/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
 Thu Oct 18 19:31:46 2012
@@ -26,11 +26,13 @@ import org.apache.camel.impl.DefaultCame
 import org.apache.camel.spi.FactoryFinder;
 import org.apache.camel.spi.Registry;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
 import org.osgi.service.blueprint.container.BlueprintContainer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class BlueprintCamelContext extends DefaultCamelContext {
+public class BlueprintCamelContext extends DefaultCamelContext implements 
ServiceListener {
 
     private static final transient Logger LOG = 
LoggerFactory.getLogger(BlueprintCamelContext.class);
 
@@ -71,30 +73,34 @@ public class BlueprintCamelContext exten
     }
 
     public void init() throws Exception {
-        final ClassLoader original = 
Thread.currentThread().getContextClassLoader();
-        try {
-            // let's set a more suitable TCCL while starting the context
-            
Thread.currentThread().setContextClassLoader(getApplicationContextClassLoader());
-            maybeStart();
-        } finally {
-            Thread.currentThread().setContextClassLoader(original);
-        }
-    }
-
-    private void maybeStart() throws Exception {
-        if (!isStarted() && !isStarting()) {
-            start();
-        } else {
-            // ignore as Camel is already started
-            LOG.trace("Ignoring maybeStart() as Apache Camel is already 
started");
-        }
+        // add service listener so we can be notified when blueprint container 
is done
+        // and we would be ready to start CamelContext
+        bundleContext.addServiceListener(this);
     }
 
     public void destroy() throws Exception {
+        // remove listener and stop this CamelContext
+        bundleContext.removeServiceListener(this);
         stop();
     }
 
     @Override
+    public void serviceChanged(ServiceEvent event) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Service {} changed to {}", event, event.getType());
+        }
+        // look for blueprint container to be registered, and then we can 
start the CamelContext
+        if (event.getType() == ServiceEvent.REGISTERED && 
event.getServiceReference().isAssignableTo(bundleContext.getBundle(),
+                "org.osgi.service.blueprint.container.BlueprintContainer")) {
+            try {
+                maybeStart();
+            } catch (Exception e) {
+                LOG.warn("Error occurred during starting " + this, e);
+            }
+        }
+    }
+
+    @Override
     protected TypeConverter createTypeConverter() {
         // CAMEL-3614: make sure we use a bundle context which imports 
org.apache.camel.impl.converter package
         BundleContext ctx = BundleContextUtils.getBundleContext(getClass());
@@ -111,4 +117,20 @@ public class BlueprintCamelContext exten
         return OsgiCamelContextHelper.wrapRegistry(this, reg, bundleContext);
     }
 
+    private void maybeStart() throws Exception {
+        if (!isStarted() && !isStarting()) {
+            final ClassLoader original = 
Thread.currentThread().getContextClassLoader();
+            try {
+                // let's set a more suitable TCCL while starting the context
+                
Thread.currentThread().setContextClassLoader(getApplicationContextClassLoader());
+                LOG.debug("Starting {}", this);
+                start();
+            } finally {
+                Thread.currentThread().setContextClassLoader(original);
+            }
+        } else {
+            // ignore as Camel is already started
+            LOG.trace("Ignoring maybeStart() as {} is already started", this);
+        }
+    }
 }

Modified: 
camel/branches/camel-2.10.x/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
URL: 
http://svn.apache.org/viewvc/camel/branches/camel-2.10.x/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java?rev=1399809&r1=1399808&r2=1399809&view=diff
==============================================================================
--- 
camel/branches/camel-2.10.x/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
 (original)
+++ 
camel/branches/camel-2.10.x/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
 Thu Oct 18 19:31:46 2012
@@ -261,7 +261,7 @@ public class CamelContextFactoryBean ext
         getContext().getPackageScanClassResolver().addFilter(filter);
         ClassLoader classLoader = new 
BundleDelegatingClassLoader(((ExtendedBlueprintContainer) 
blueprintContainer).getBundleContext().getBundle());
         PackageScanRouteBuilderFinder finder = new 
PackageScanRouteBuilderFinder(getContext(), packages, classLoader,
-                                                                               
  /*getBeanPostProcessor(),*/ getContext().getPackageScanClassResolver());
+                                                                               
  getContext().getPackageScanClassResolver());
         finder.appendBuilders(builders);
 
         // and remove the filter


Reply via email to