Author: davsclaus Date: Sun Jun 26 09:33:49 2011 New Revision: 1139747 URL: http://svn.apache.org/viewvc?rev=1139747&view=rev Log: CAMEL-4155: addService will inject CamelContext if service is context aware
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java?rev=1139747&r1=1139746&r2=1139747&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java Sun Jun 26 09:33:49 2011 @@ -140,9 +140,12 @@ public interface CamelContext extends Su //----------------------------------------------------------------------- /** - * Adds a service, starting it so that it will be stopped with this context + * Adds a service to this context, which allows this context to control the lifecycle, ensuring + * the service is stopped when the context stops. * <p/> - * The added service will also be enlisted in JMX for management (if JMX is enabled) + * The service will also have {@link CamelContext} injected if its {@link CamelContextAware}. + * The service will also be enlisted in JMX for management (if JMX is enabled). + * The service will be started, if its not already started. * * @param object the service * @throws Exception can be thrown when starting the service @@ -150,7 +153,7 @@ public interface CamelContext extends Su void addService(Object object) throws Exception; /** - * Has the given service already been added? + * Has the given service already been added to this context? * * @param object the service * @return <tt>true</tt> if already added, <tt>false</tt> if not. Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=1139747&r1=1139746&r2=1139747&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Sun Jun 26 09:33:49 2011 @@ -865,6 +865,13 @@ public class DefaultCamelContext extends } public void addService(Object object) throws Exception { + + // inject CamelContext + if (object instanceof CamelContextAware) { + CamelContextAware aware = (CamelContextAware) object; + aware.setCamelContext(this); + } + if (object instanceof Service) { Service service = (Service) object; @@ -885,9 +892,14 @@ public class DefaultCamelContext extends } // do not add endpoints as they have their own list if (singleton && !(service instanceof Endpoint)) { - servicesToClose.add(service); + // only add to list of services to close if its not already there + if (!hasService(service)) { + servicesToClose.add(service); + } } } + + // and then ensure service is started (as stated in the javadoc) startServices(object); } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java?rev=1139747&r1=1139746&r2=1139747&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java Sun Jun 26 09:33:49 2011 @@ -21,6 +21,8 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; import org.apache.camel.Component; import org.apache.camel.Endpoint; import org.apache.camel.NoSuchEndpointException; @@ -324,4 +326,41 @@ public class DefaultCamelContextTest ext assertEquals(false, ctx.isStarted()); assertEquals(false, ctx.isSuspended()); } + + public void testAddServiceInjectCamelContext() throws Exception { + MyService my = new MyService(); + + DefaultCamelContext ctx = new DefaultCamelContext(); + ctx.addService(my); + + assertEquals(ctx, my.getCamelContext()); + assertEquals("Started", my.getStatus().name()); + + ctx.stop(); + assertEquals("Stopped", my.getStatus().name()); + } + + private class MyService extends ServiceSupport implements CamelContextAware { + + private CamelContext camelContext; + + public CamelContext getCamelContext() { + return camelContext; + } + + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + + @Override + protected void doStart() throws Exception { + // noop + } + + @Override + protected void doStop() throws Exception { + // noop + } + } + }