CAMEL-9789: Avoid starting services to soon during CamelContext startup, that 
can trigger circular dependencies issue with Spring and similar IoC frameworks.


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

Branch: refs/heads/master
Commit: 596d1a13fb60d3c739bda443953b09ca4d41a61b
Parents: cbc64df
Author: Claus Ibsen <davscl...@apache.org>
Authored: Fri Apr 1 13:47:25 2016 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Thu Apr 7 09:39:40 2016 +0200

----------------------------------------------------------------------
 .../apache/camel/component/ref/RefEndpoint.java |   4 +-
 .../apache/camel/impl/DefaultCamelContext.java  | 114 +++++++++++--------
 .../camel/impl/DeferServiceStartupListener.java |  32 +++++-
 .../org/apache/camel/impl/RouteService.java     |  12 +-
 .../component/dataset/DataSetConsumerTest.java  |   2 -
 ...edaQueueMultipleConsumersDifferenceTest.java |   6 +-
 .../validator/ValidatorIllegalImportTest.java   |   5 +-
 .../component/xslt/InvalidXsltFileTest.java     |   4 +-
 .../component/xslt/XsltFileNotFoundTest.java    |   5 +-
 .../xslt/XsltReferenceParameterTest.java        |   4 +-
 .../camel/component/xslt/XsltSaxonTest.java     |   3 +-
 .../camel/impl/DefaultCamelContextTest.java     |   1 +
 ...ducerTemplateWithCustomCacheMaxSizeTest.java |   3 +
 ...EventDrivenPollingConsumerQueueSizeTest.java |   3 +
 ...tartupListenerComponentFromRegistryTest.java |  10 +-
 .../impl/StartupListenerComponentTest.java      |  10 +-
 .../apache/camel/impl/StartupListenerTest.java  |  15 ++-
 .../ManagedRouteLoadstatisticsTest.java         |  34 ++++--
 .../processor/FileIdempotentTrunkStoreTest.java |  30 +++--
 .../WeightedRandomLoadBalanceTest.java          |   6 +-
 .../WeightedRoundRobinLoadBalanceTest.java      |   6 +-
 21 files changed, 208 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/main/java/org/apache/camel/component/ref/RefEndpoint.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/component/ref/RefEndpoint.java 
b/camel-core/src/main/java/org/apache/camel/component/ref/RefEndpoint.java
index d1ca0b6..5400ad6 100644
--- a/camel-core/src/main/java/org/apache/camel/component/ref/RefEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/ref/RefEndpoint.java
@@ -77,8 +77,8 @@ public class RefEndpoint extends DefaultEndpoint implements 
DelegateEndpoint {
     @Override
     protected void doStart() throws Exception {
         endpoint = CamelContextHelper.mandatoryLookup(getCamelContext(), name, 
Endpoint.class);
-        // add the endpoint as a service so Camel can manage the endpoint and 
enlist the endpoint in JMX etc.
-        getCamelContext().addService(endpoint);
+        // add the endpoint to the endpoint registry
+        getCamelContext().addEndpoint(endpoint.getEndpointUri(), endpoint);
         super.doStart();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java 
b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index 65deba6..7e7dce1 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -157,6 +157,7 @@ import org.apache.camel.util.IntrospectionSupport;
 import org.apache.camel.util.JsonSchemaHelper;
 import org.apache.camel.util.LoadPropertiesException;
 import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.OrderedComparator;
 import org.apache.camel.util.ServiceHelper;
 import org.apache.camel.util.StopWatch;
 import org.apache.camel.util.StringHelper;
@@ -185,7 +186,7 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
     private final Map<String, Component> components = new HashMap<String, 
Component>();
     private final Set<Route> routes = new LinkedHashSet<Route>();
     private final List<Service> servicesToStop = new 
CopyOnWriteArrayList<Service>();
-    private final Set<StartupListener> startupListeners = new 
LinkedHashSet<StartupListener>();
+    private final List<StartupListener> startupListeners = new 
CopyOnWriteArrayList<StartupListener>();
     private final DeferServiceStartupListener deferStartupListener = new 
DeferServiceStartupListener();
     private TypeConverter typeConverter;
     private TypeConverterRegistry typeConverterRegistry;
@@ -276,7 +277,7 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
         // create endpoint registry at first since end users may access 
endpoints before CamelContext is started
         this.endpoints = new DefaultEndpointRegistry(this);
 
-        // add the derfer service startup listener
+        // add the defer service startup listener
         this.startupListeners.add(deferStartupListener);
 
         // use WebSphere specific resolver if running on WebSphere
@@ -1221,6 +1222,11 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
     }
 
     private void doAddService(Object object, boolean stopOnShutdown) throws 
Exception {
+        doAddService(object, stopOnShutdown, false);
+    }
+
+    private void doAddService(Object object, boolean stopOnShutdown, boolean 
forceStart) throws Exception {
+
         // inject CamelContext
         if (object instanceof CamelContextAware) {
             CamelContextAware aware = (CamelContextAware) object;
@@ -1239,27 +1245,26 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
                 }
             }
 
-            // only add to services to close if its a singleton
-            // otherwise we could for example end up with a lot of prototype 
scope endpoints
-            boolean singleton = true; // assume singleton by default
-            if (service instanceof IsSingleton) {
-                singleton = ((IsSingleton) service).isSingleton();
-            }
-            // do not add endpoints as they have their own list
-            if (singleton && !(service instanceof Endpoint)) {
-                // only add to list of services to stop if its not already 
there
-                if (stopOnShutdown && !hasService(service)) {
-                    servicesToStop.add(service);
+            if (!forceStart) {
+                // now start the service (and defer starting if CamelContext 
is starting up itself)
+                deferStartService(object, stopOnShutdown);
+            } else {
+                // only add to services to close if its a singleton
+                // otherwise we could for example end up with a lot of 
prototype scope endpoints
+                boolean singleton = true; // assume singleton by default
+                if (object instanceof IsSingleton) {
+                    singleton = ((IsSingleton) service).isSingleton();
                 }
+                // do not add endpoints as they have their own list
+                if (singleton && !(service instanceof Endpoint)) {
+                    // only add to list of services to stop if its not already 
there
+                    if (stopOnShutdown && !hasService(service)) {
+                        servicesToStop.add(service);
+                    }
+                }
+                ServiceHelper.startService(service);
             }
         }
-
-        // and then ensure service is started (as stated in the javadoc)
-        if (object instanceof Service) {
-            startService((Service)object);
-        } else if (object instanceof Collection<?>) {
-            startServices((Collection<?>)object);
-        }
     }
 
     public boolean removeService(Object object) throws Exception {
@@ -2338,8 +2343,8 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
                 // of the camel context (its the container)
                 typeConverter = createTypeConverter();
                 try {
-                    // must add service eager
-                    addService(typeConverter);
+                    // must add service eager and force start it
+                    doAddService(typeConverter, true, true);
                 } catch (Exception e) {
                     throw ObjectHelper.wrapRuntimeCamelException(e);
                 }
@@ -2352,7 +2357,7 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
         this.typeConverter = typeConverter;
         try {
             // must add service eager
-            addService(typeConverter);
+            doAddService(typeConverter, true, true);
         } catch (Exception e) {
             throw ObjectHelper.wrapRuntimeCamelException(e);
         }
@@ -2995,23 +3000,24 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
         // re-create endpoint registry as the cache size limit may be set 
after the constructor of this instance was called.
         // and we needed to create endpoints up-front as it may be accessed 
before this context is started
         endpoints = new DefaultEndpointRegistry(this, endpoints);
-        addService(endpoints);
+        // add this as service and force pre-start them
+        doAddService(endpoints, true, true);
         // special for executorServiceManager as want to stop it manually
-        doAddService(executorServiceManager, false);
-        addService(producerServicePool);
-        addService(pollingConsumerServicePool);
-        addService(inflightRepository);
-        addService(asyncProcessorAwaitManager);
-        addService(shutdownStrategy);
-        addService(packageScanClassResolver);
-        addService(restRegistry);
-        addService(messageHistoryFactory);
+        doAddService(executorServiceManager, false, true);
+        doAddService(producerServicePool, true, true);
+        doAddService(pollingConsumerServicePool, true, true);
+        doAddService(inflightRepository, true, true);
+        doAddService(asyncProcessorAwaitManager, true, true);
+        doAddService(shutdownStrategy, true, true);
+        doAddService(packageScanClassResolver, true, true);
+        doAddService(restRegistry, true, true);
+        doAddService(messageHistoryFactory, true, true);
 
         if (runtimeEndpointRegistry != null) {
             if (runtimeEndpointRegistry instanceof EventNotifier) {
                 getManagementStrategy().addEventNotifier((EventNotifier) 
runtimeEndpointRegistry);
             }
-            addService(runtimeEndpointRegistry);
+            doAddService(runtimeEndpointRegistry, true, true);
         }
 
         // eager lookup any configured properties component to avoid 
subsequent lookup attempts which may impact performance
@@ -3053,7 +3059,7 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
         if (streamCachingInUse) {
             // stream caching is in use so enable the strategy
             getStreamCachingStrategy().setEnabled(true);
-            addService(getStreamCachingStrategy());
+            doAddService(getStreamCachingStrategy(), true, true);
         } else {
             // log if stream caching is not in use as this can help people to 
enable it if they use streams
             log.info("StreamCaching is not in use. If using streams then its 
recommended to enable stream caching."
@@ -3207,20 +3213,9 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
                 }
             }
 
-            if (!filtered.isEmpty()) {
-                // the context is now considered started (i.e. isStarted() == 
true))
-                // starting routes is done after, not during context startup
-                safelyStartRouteServices(checkClash, startConsumer, 
resumeConsumer, addingRoutes, filtered.values());
-            }
-
-            // we are finished starting routes, so remove flag before we emit 
the startup listeners below
-            isStartingRoutes.remove();
+            // the context is in last phase of staring, so lets start the 
routes
+            safelyStartRouteServices(checkClash, startConsumer, 
resumeConsumer, addingRoutes, filtered.values());
 
-            // now notify any startup aware listeners as all the routes etc 
has been started,
-            // allowing the listeners to do custom work after routes has been 
started
-            for (StartupListener startup : startupListeners) {
-                startup.onCamelContextStarted(this, isStarted());
-            }
         } finally {
             isStartingRoutes.remove();
         }
@@ -3435,6 +3430,19 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
         // warm up routes before we start them
         doWarmUpRoutes(inputs, startConsumer);
 
+        // sort the startup listeners so they are started in the right order
+        Collections.sort(startupListeners, new OrderedComparator());
+        // now call the startup listeners where the routes has been warmed up
+        // (only the actual route consumer has not yet been started)
+        for (StartupListener startup : startupListeners) {
+            startup.onCamelContextStarted(this, isStarted());
+        }
+        // because the consumers may also register startup listeners we need 
to reset
+        // the already started listeners
+        List<StartupListener> backup = new ArrayList<>(startupListeners);
+        startupListeners.clear();
+
+        // now start the consumers
         if (startConsumer) {
             if (resumeConsumer) {
                 // and now resume the routes
@@ -3446,6 +3454,16 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
             }
         }
 
+        // sort the startup listeners so they are started in the right order
+        Collections.sort(startupListeners, new OrderedComparator());
+        // now the consumers that was just started may also add new 
StartupListeners (such as timer)
+        // so we need to ensure they get started as well
+        for (StartupListener startup : startupListeners) {
+            startup.onCamelContextStarted(this, isStarted());
+        }
+        // and add the previous started startup listeners to the list so we 
have them all
+        startupListeners.addAll(0, backup);
+
         // inputs no longer needed
         inputs.clear();
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/main/java/org/apache/camel/impl/DeferServiceStartupListener.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/impl/DeferServiceStartupListener.java
 
b/camel-core/src/main/java/org/apache/camel/impl/DeferServiceStartupListener.java
index a78bdd8..5a533db 100644
--- 
a/camel-core/src/main/java/org/apache/camel/impl/DeferServiceStartupListener.java
+++ 
b/camel-core/src/main/java/org/apache/camel/impl/DeferServiceStartupListener.java
@@ -20,14 +20,18 @@ import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Ordered;
+import org.apache.camel.ResolveEndpointFailedException;
 import org.apache.camel.Service;
 import org.apache.camel.StartupListener;
 import org.apache.camel.util.ServiceHelper;
 
 /**
- * A {@link org.apache.camel.StartupListener} that defers starting {@link 
Service}s.
+ * A {@link org.apache.camel.StartupListener} that defers starting {@link 
Service}s, until as late as possible during
+ * the startup process of {@link CamelContext}.
  */
-public class DeferServiceStartupListener implements StartupListener {
+public class DeferServiceStartupListener implements StartupListener, Ordered {
 
     private final Set<Service> services = new CopyOnWriteArraySet<Service>();
 
@@ -37,9 +41,27 @@ public class DeferServiceStartupListener implements 
StartupListener {
 
     @Override
     public void onCamelContextStarted(CamelContext context, boolean 
alreadyStarted) throws Exception {
-        for (Service service : services) {
-            ServiceHelper.startService(service);
+        // new services may be added while starting a service
+        // so use a while loop to get the newly added services as well
+        while (!services.isEmpty()) {
+            Service service = services.iterator().next();
+            try {
+                ServiceHelper.startService(service);
+            } catch (Exception e) {
+                if (service instanceof Endpoint) {
+                    Endpoint endpoint = (Endpoint) service;
+                    throw new 
ResolveEndpointFailedException(endpoint.getEndpointUri(), e);
+                } else {
+                    throw e;
+                }
+            } finally {
+                services.remove(service);
+            }
         }
-        services.clear();
+    }
+
+    public int getOrder() {
+        // we want to be last, so the other startup listeners run first
+        return Ordered.LOWEST;
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/RouteService.java 
b/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
index 2139d5c..d0ff6d0 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
@@ -30,6 +30,7 @@ import org.apache.camel.Channel;
 import org.apache.camel.Consumer;
 import org.apache.camel.Endpoint;
 import org.apache.camel.EndpointAware;
+import org.apache.camel.FailedToCreateRouteException;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.RouteAware;
@@ -135,7 +136,15 @@ public class RouteService extends ChildServiceSupport {
         this.removingRoutes = removingRoutes;
     }
 
-    public synchronized void warmUp() throws Exception {
+    public void warmUp() throws Exception {
+        try {
+            doWarmUp();
+        } catch (Exception e) {
+            throw new FailedToCreateRouteException(routeDefinition.getId(), 
routeDefinition.toString(), e);
+        }
+    }
+
+    protected synchronized void doWarmUp() throws Exception {
         if (endpointDone.compareAndSet(false, true)) {
             // endpoints should only be started once as they can be reused on 
other routes
             // and whatnot, thus their lifecycle is to start once, and only to 
stop when Camel shutdown
@@ -196,7 +205,6 @@ public class RouteService extends ChildServiceSupport {
     }
 
     protected void doStart() throws Exception {
-        // ensure we are warmed up before starting the route
         warmUp();
 
         for (Route route : routes) {

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/component/dataset/DataSetConsumerTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/dataset/DataSetConsumerTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/dataset/DataSetConsumerTest.java
index c98acc8..5311330 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/dataset/DataSetConsumerTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/dataset/DataSetConsumerTest.java
@@ -166,7 +166,5 @@ public class DataSetConsumerTest extends ContextTestSupport 
{
 
         Thread.sleep(100);
         assertMockEndpointsSatisfied();
-
-        System.out.println("Place for Breakpoint");
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/component/seda/SameSedaQueueMultipleConsumersDifferenceTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/seda/SameSedaQueueMultipleConsumersDifferenceTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/seda/SameSedaQueueMultipleConsumersDifferenceTest.java
index 9f39d15..19baaf6 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/seda/SameSedaQueueMultipleConsumersDifferenceTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/seda/SameSedaQueueMultipleConsumersDifferenceTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.seda;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.FailedToCreateRouteException;
 import org.apache.camel.builder.RouteBuilder;
 
 /**
@@ -51,8 +52,9 @@ public class SameSedaQueueMultipleConsumersDifferenceTest 
extends ContextTestSup
                 }
             });
             fail("Should have thrown exception");
-        } catch (IllegalArgumentException e) {
-            assertEquals("Cannot use existing queue seda://foo as the existing 
queue multiple consumers true does not match given multiple consumers false", 
e.getMessage());
+        } catch (FailedToCreateRouteException e) {
+            assertEquals("fail", e.getRouteId());
+            assertEquals("Cannot use existing queue seda://foo as the existing 
queue multiple consumers true does not match given multiple consumers false", 
e.getCause().getMessage());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorIllegalImportTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorIllegalImportTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorIllegalImportTest.java
index e6b2085..f71d857 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorIllegalImportTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorIllegalImportTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.validator;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.FailedToCreateProducerException;
+import org.apache.camel.FailedToCreateRouteException;
 import org.apache.camel.builder.RouteBuilder;
 
 /**
@@ -79,8 +80,8 @@ public class ValidatorIllegalImportTest extends 
ContextTestSupport {
         try {
             context.start();
             fail("Should have thrown exception");
-        } catch (FailedToCreateProducerException e) {
-            IllegalArgumentException iae = 
assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
+        } catch (FailedToCreateRouteException e) {
+            IllegalArgumentException iae = 
assertIsInstanceOf(IllegalArgumentException.class, e.getCause().getCause());
             assertTrue(iae.getMessage().startsWith("Resource: 
org/apache/camel/component/validator/BroadcastMonitor.xsd refers an invalid 
resource without SystemId."));
         }
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/component/xslt/InvalidXsltFileTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/xslt/InvalidXsltFileTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/xslt/InvalidXsltFileTest.java
index b6cf791..226fa9d 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/xslt/InvalidXsltFileTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/xslt/InvalidXsltFileTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.xslt;
 
+import javax.xml.transform.TransformerConfigurationException;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.FailedToCreateRouteException;
 import org.apache.camel.ResolveEndpointFailedException;
@@ -38,7 +40,7 @@ public class InvalidXsltFileTest extends TestSupport {
             fail("Should have thrown an exception due XSL compilation error");
         } catch (FailedToCreateRouteException e) {
             // expected
-            assertIsInstanceOf(ResolveEndpointFailedException.class, 
e.getCause());
+            assertIsInstanceOf(TransformerConfigurationException.class, 
e.getCause());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/component/xslt/XsltFileNotFoundTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/xslt/XsltFileNotFoundTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/xslt/XsltFileNotFoundTest.java
index 4d04905..5e0d476 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/xslt/XsltFileNotFoundTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/xslt/XsltFileNotFoundTest.java
@@ -40,9 +40,8 @@ public class XsltFileNotFoundTest extends TestSupport {
 
             fail("Should have thrown an exception due XSLT file not found");
         } catch (FailedToCreateRouteException e) {
-            assertIsInstanceOf(ResolveEndpointFailedException.class, 
e.getCause());
-            assertIsInstanceOf(TransformerException.class, 
e.getCause().getCause());
-            assertIsInstanceOf(FileNotFoundException.class, 
e.getCause().getCause().getCause());
+            assertIsInstanceOf(TransformerException.class, e.getCause());
+            assertIsInstanceOf(FileNotFoundException.class, 
e.getCause().getCause());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/component/xslt/XsltReferenceParameterTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/xslt/XsltReferenceParameterTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/xslt/XsltReferenceParameterTest.java
index fd7b7f8..a8b3311 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/xslt/XsltReferenceParameterTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/xslt/XsltReferenceParameterTest.java
@@ -54,10 +54,10 @@ public class XsltReferenceParameterTest extends TestSupport 
{
 
         ProcessorEndpoint pep1 = context.getEndpoint(TEST_URI_1, 
ProcessorEndpoint.class);
 
-        builder1 = (XsltBuilder)pep1.getProcessor();
-
         context.addRoutes(builder);
         context.start();
+
+        builder1 = (XsltBuilder)pep1.getProcessor();
     }
 
     public void testConverterReference() {

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/component/xslt/XsltSaxonTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/xslt/XsltSaxonTest.java 
b/camel-core/src/test/java/org/apache/camel/component/xslt/XsltSaxonTest.java
index 3225b45..f1f7c43 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/xslt/XsltSaxonTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/xslt/XsltSaxonTest.java
@@ -37,8 +37,7 @@ public class XsltSaxonTest extends TestSupport {
 
             fail("Should have thrown an exception due XSLT saxon not on 
classpath");
         } catch (FailedToCreateRouteException e) {
-            assertIsInstanceOf(ResolveEndpointFailedException.class, 
e.getCause());
-            assertIsInstanceOf(ClassNotFoundException.class, 
e.getCause().getCause());
+            assertIsInstanceOf(ClassNotFoundException.class, e.getCause());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java 
b/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java
index 42327e0..b0fc1c4 100644
--- 
a/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java
@@ -351,6 +351,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
         DefaultCamelContext ctx = new DefaultCamelContext();
         ctx.addService(my);
+        ctx.start();
 
         assertEquals(ctx, my.getCamelContext());
         assertEquals("Started", my.getStatus().name());

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerTemplateWithCustomCacheMaxSizeTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerTemplateWithCustomCacheMaxSizeTest.java
 
b/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerTemplateWithCustomCacheMaxSizeTest.java
index 3c717fa..0d89c65 100644
--- 
a/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerTemplateWithCustomCacheMaxSizeTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerTemplateWithCustomCacheMaxSizeTest.java
@@ -45,6 +45,9 @@ public class 
DefaultProducerTemplateWithCustomCacheMaxSizeTest extends ContextTe
             template.sendBody(e, "Hello");
         }
 
+        // the eviction is async so force cleanup
+        template.cleanUp();
+
         assertEquals("Size should be 200", 200, 
template.getCurrentCacheSize());
         template.stop();
 

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/impl/EventDrivenPollingConsumerQueueSizeTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/EventDrivenPollingConsumerQueueSizeTest.java
 
b/camel-core/src/test/java/org/apache/camel/impl/EventDrivenPollingConsumerQueueSizeTest.java
index 06649a2..d687678 100644
--- 
a/camel-core/src/test/java/org/apache/camel/impl/EventDrivenPollingConsumerQueueSizeTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/impl/EventDrivenPollingConsumerQueueSizeTest.java
@@ -40,6 +40,9 @@ public class EventDrivenPollingConsumerQueueSizeTest extends 
ContextTestSupport
     }
 
     public void testQueueSize() throws Exception {
+        // must start context as we do not use route builder that auto-start
+        context.start();
+
         PollingConsumer consumer = 
context.getEndpoint(uri).createPollingConsumer();
         consumer.start();
 

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/impl/StartupListenerComponentFromRegistryTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/StartupListenerComponentFromRegistryTest.java
 
b/camel-core/src/test/java/org/apache/camel/impl/StartupListenerComponentFromRegistryTest.java
index 70b2897..0d6c41c 100644
--- 
a/camel-core/src/test/java/org/apache/camel/impl/StartupListenerComponentFromRegistryTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/impl/StartupListenerComponentFromRegistryTest.java
@@ -39,6 +39,10 @@ public class StartupListenerComponentFromRegistryTest 
extends ContextTestSupport
     }
 
     public void testStartupListenerComponent() throws Exception {
+        // and now the routes are started
+        assertTrue(context.getRouteStatus("foo").isStarted());
+        assertTrue(context.getRouteStatus("bar").isStarted());
+
         getMockEndpoint("mock:result").expectedMessageCount(1);
 
         template.sendBody("direct:foo", "Hello World");
@@ -55,9 +59,9 @@ public class StartupListenerComponentFromRegistryTest extends 
ContextTestSupport
         public void onCamelContextStarted(CamelContext context, boolean 
alreadyStarted) throws Exception {
             invoked++;
 
-            // the routes should have been started
-            assertTrue(context.getRouteStatus("foo").isStarted());
-            assertTrue(context.getRouteStatus("bar").isStarted());
+            // the routes should not have been started as they start afterwards
+            assertTrue(context.getRouteStatus("foo").isStopped());
+            assertTrue(context.getRouteStatus("bar").isStopped());
         }
 
         public int getInvoked() {

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/impl/StartupListenerComponentTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/StartupListenerComponentTest.java
 
b/camel-core/src/test/java/org/apache/camel/impl/StartupListenerComponentTest.java
index 15c0e11..d32b2e6 100644
--- 
a/camel-core/src/test/java/org/apache/camel/impl/StartupListenerComponentTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/impl/StartupListenerComponentTest.java
@@ -30,6 +30,10 @@ public class StartupListenerComponentTest extends 
ContextTestSupport {
     private MyComponent my;
 
     public void testStartupListenerComponent() throws Exception {
+        // and now the routes are started
+        assertTrue(context.getRouteStatus("foo").isStarted());
+        assertTrue(context.getRouteStatus("bar").isStarted());
+
         getMockEndpoint("mock:result").expectedMessageCount(1);
 
         template.sendBody("direct:foo", "Hello World");
@@ -46,9 +50,9 @@ public class StartupListenerComponentTest extends 
ContextTestSupport {
         public void onCamelContextStarted(CamelContext context, boolean 
alreadyStarted) throws Exception {
             invoked++;
 
-            // the routes should have been started
-            assertTrue(context.getRouteStatus("foo").isStarted());
-            assertTrue(context.getRouteStatus("bar").isStarted());
+            // the routes should not have been started as they start afterwards
+            assertTrue(context.getRouteStatus("foo").isStopped());
+            assertTrue(context.getRouteStatus("bar").isStopped());
         }
 
         public int getInvoked() {

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/impl/StartupListenerTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/StartupListenerTest.java 
b/camel-core/src/test/java/org/apache/camel/impl/StartupListenerTest.java
index 9372725..ed291bd 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/StartupListenerTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/StartupListenerTest.java
@@ -44,8 +44,13 @@ public class StartupListenerTest extends ContextTestSupport {
             invoked++;
             this.alreadyStarted = alreadyStarted;
 
-            // the route should have been started
-            assertTrue(context.getRouteStatus("foo").isStarted());
+            if (alreadyStarted) {
+                // the routes should already been started as we add the 
listener afterwards
+                assertTrue(context.getRouteStatus("foo").isStarted());
+            } else {
+                // the routes should not have been started as they start 
afterwards
+                assertTrue(context.getRouteStatus("foo").isStopped());
+            }
         }
 
         public int getInvoked() {
@@ -58,6 +63,9 @@ public class StartupListenerTest extends ContextTestSupport {
     }
 
     public void testStartupListenerComponent() throws Exception {
+        // and now the routes are started
+        assertTrue(context.getRouteStatus("foo").isStarted());
+
         getMockEndpoint("mock:result").expectedMessageCount(1);
 
         template.sendBody("direct:foo", "Hello World");
@@ -69,6 +77,9 @@ public class StartupListenerTest extends ContextTestSupport {
     }
 
     public void testStartupListenerComponentAlreadyStarted() throws Exception {
+        // and now the routes are started
+        assertTrue(context.getRouteStatus("foo").isStarted());
+
         MyStartupListener other = new MyStartupListener();
         context.addStartupListener(other);
 

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/management/ManagedRouteLoadstatisticsTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/management/ManagedRouteLoadstatisticsTest.java
 
b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteLoadstatisticsTest.java
index 6d1d9a3..5c39897 100644
--- 
a/camel-core/src/test/java/org/apache/camel/management/ManagedRouteLoadstatisticsTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteLoadstatisticsTest.java
@@ -26,12 +26,25 @@ import org.apache.camel.builder.RouteBuilder;
  */
 public class ManagedRouteLoadstatisticsTest extends ManagementTestSupport {
 
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
     public void testLoadStatisticsAreDisabledByDefault() throws Exception {
         // JMX tests dont work well on AIX CI servers (hangs them)
         if (isPlatform("aix")) {
             return;
         }
 
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                
from("direct:start").to("log:foo").delay(2000).to("mock:result");
+            }
+        });
+        context.start();
+
         boolean load = 
context.getManagementStrategy().getManagementAgent().getLoadStatisticsEnabled() 
!= null
                 && 
context.getManagementStrategy().getManagementAgent().getLoadStatisticsEnabled();
         assertFalse(load);
@@ -57,9 +70,17 @@ public class ManagedRouteLoadstatisticsTest extends 
ManagementTestSupport {
         if (isPlatform("aix")) {
             return;
         }
+
         
context.getManagementStrategy().getManagementAgent().setLoadStatisticsEnabled(true);
-        context.stop();
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                
from("direct:start").to("log:foo").delay(2000).to("mock:result");
+            }
+        });
         context.start();
+
         // get the stats for the route
         MBeanServer mbeanServer = getMBeanServer();
         ObjectName on = 
ObjectName.getInstance("org.apache.camel:context=camel-1,type=routes,name=\"route1\"");
@@ -69,6 +90,7 @@ public class ManagedRouteLoadstatisticsTest extends 
ManagementTestSupport {
         template.asyncSendBody("direct:start", "Hello World");
 
         assertMockEndpointsSatisfied();
+
         Thread.sleep(2000);
         String load01 = (String)mbeanServer.getAttribute(on, "Load01");
         String load05 = (String)mbeanServer.getAttribute(on, "Load05");
@@ -81,14 +103,4 @@ public class ManagedRouteLoadstatisticsTest extends 
ManagementTestSupport {
         assertTrue(Double.parseDouble(load15.replace(',', '.')) >= 0);
     }
 
-    @Override
-    protected RouteBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                
from("direct:start").to("log:foo").delay(2000).to("mock:result");
-            }
-        };
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/processor/FileIdempotentTrunkStoreTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/processor/FileIdempotentTrunkStoreTest.java
 
b/camel-core/src/test/java/org/apache/camel/processor/FileIdempotentTrunkStoreTest.java
index f0807a2..f6cb148 100644
--- 
a/camel-core/src/test/java/org/apache/camel/processor/FileIdempotentTrunkStoreTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/processor/FileIdempotentTrunkStoreTest.java
@@ -58,18 +58,34 @@ public class FileIdempotentTrunkStoreTest extends 
ContextTestSupport {
         // load in new store and verify we only have the last 5 elements
         IdempotentRepository<String> repo2 = 
FileIdempotentRepository.fileIdempotentRepository(store);
         repo2.start();
-        assertFalse(repo2.contains("AAAAAAAAAA"));
-        assertTrue(repo2.contains("BBBBBBBBBB"));
-        assertTrue(repo2.contains("CCCCCCCCCC"));
-        assertTrue(repo2.contains("DDDDDDDDDD"));
-        assertTrue(repo2.contains("EEEEEEEEEE"));
-        assertTrue(repo2.contains("ZZZZZZZZZZ"));
+
+        // should be 5
+        int size = 0;
+        if (repo2.contains("AAAAAAAAAA")) {
+            size++;
+        }
+        if (repo2.contains("BBBBBBBBBB")) {
+            size++;
+        }
+        if (repo2.contains("CCCCCCCCCC")) {
+            size++;
+        }
+        if (repo2.contains("DDDDDDDDDD")) {
+            size++;
+        }
+        if (repo2.contains("EEEEEEEEEE")) {
+            size++;
+        }
+        if (repo2.contains("ZZZZZZZZZZ")) {
+            size++;
+        }
+        assertEquals(5, size);
 
         // should trunk the file store
         sendMessage("XXXXXXXXXX", "X");
 
         resultEndpoint.assertIsSatisfied();
-        assertFalse(repo.contains("BBBBBBBBBB"));
+
         assertTrue(repo.contains("XXXXXXXXXX"));
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/processor/WeightedRandomLoadBalanceTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/processor/WeightedRandomLoadBalanceTest.java
 
b/camel-core/src/test/java/org/apache/camel/processor/WeightedRandomLoadBalanceTest.java
index e66cffd..2ebe50a 100644
--- 
a/camel-core/src/test/java/org/apache/camel/processor/WeightedRandomLoadBalanceTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/processor/WeightedRandomLoadBalanceTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.processor;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.FailedToCreateRouteException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 
@@ -117,8 +118,9 @@ public class WeightedRandomLoadBalanceTest extends 
ContextTestSupport {
             });
             context.start();
             fail("Should have thrown exception");
-        } catch (IllegalArgumentException e) {
-            assertEquals("Loadbalacing with 3 should match number of 
distributions 2", e.getMessage());
+        } catch (FailedToCreateRouteException e) {
+            IllegalArgumentException iae = 
assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
+            assertEquals("Loadbalacing with 3 should match number of 
distributions 2", iae.getMessage());
         }
     }
     

http://git-wip-us.apache.org/repos/asf/camel/blob/596d1a13/camel-core/src/test/java/org/apache/camel/processor/WeightedRoundRobinLoadBalanceTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/processor/WeightedRoundRobinLoadBalanceTest.java
 
b/camel-core/src/test/java/org/apache/camel/processor/WeightedRoundRobinLoadBalanceTest.java
index 655446f..a3b8cec 100644
--- 
a/camel-core/src/test/java/org/apache/camel/processor/WeightedRoundRobinLoadBalanceTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/processor/WeightedRoundRobinLoadBalanceTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.processor;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.FailedToCreateRouteException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 
@@ -123,8 +124,9 @@ public class WeightedRoundRobinLoadBalanceTest extends 
ContextTestSupport {
             });
             context.start();
             fail("Should have thrown exception");
-        } catch (IllegalArgumentException e) {
-            assertEquals("Loadbalacing with 3 should match number of 
distributions 2", e.getMessage());
+        } catch (FailedToCreateRouteException e) {
+            IllegalArgumentException iae = 
assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
+            assertEquals("Loadbalacing with 3 should match number of 
distributions 2", iae.getMessage());
         }
     }
     

Reply via email to