You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by js...@apache.org on 2012/09/04 20:28:28 UTC

svn commit: r1380791 - in /camel/trunk: components/camel-cdi/ components/camel-cdi/src/main/java/org/apache/camel/cdi/ components/camel-cdi/src/main/java/org/apache/camel/component/cdi/ components/camel-cdi/src/main/java/org/apache/camel/component/cdi/...

Author: jstrachan
Date: Tue Sep  4 18:28:27 2012
New Revision: 1380791

URL: http://svn.apache.org/viewvc?rev=1380791&view=rev
Log:
added a fix for CAMEL-5566 along the lines of Romain's use of @CamelContextId though preferred the name @CamelStartup which makes it really easy to startup a RouteBuilder on a CamelContext. Also patched the injection code to support @Inject @Uri, @EndpointInject, @Produce, @Consume to support multiple CamelContext instances too (needs testing though ;)

Added:
    camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelStartup.java   (with props)
    camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRoutes.java   (contents, props changed)
      - copied, changed from r1380669, camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRouteConfig.java
Removed:
    camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRouteConfig.java
Modified:
    camel/trunk/components/camel-cdi/pom.xml
    camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java
    camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/BeanAdapter.java
    camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java
    camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelExtension.java
    camel/trunk/examples/camel-example-cdi/src/test/java/org/apache/camel/example/cdi/IntegrationTest.java

Modified: camel/trunk/components/camel-cdi/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/pom.xml?rev=1380791&r1=1380790&r2=1380791&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/pom.xml (original)
+++ camel/trunk/components/camel-cdi/pom.xml Tue Sep  4 18:28:27 2012
@@ -79,11 +79,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-ejb_3.1_spec</artifactId>
-            <version>${geronimo-ejb_3.1_spec.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-jcdi_1.0_spec</artifactId>
             <version>${geronimo-jcdi-1.0-spec.version}</version>
         </dependency>

Added: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelStartup.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelStartup.java?rev=1380791&view=auto
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelStartup.java (added)
+++ camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelStartup.java Tue Sep  4 18:28:27 2012
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.enterprise.util.Nonbinding;
+import javax.inject.Qualifier;
+
+/**
+ * Used to annotate a {@link RouteBuilder} class to bind it to a
+ * {@link CamelContext} instance on startup so that it can startup automatically
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
+public @interface CamelStartup {
+
+    /**
+     * Returns the name of the CamelContext to add the routes to.
+     * If no value is specified then the default CamelContext is used.
+     */
+    String contextName() default "";
+}

Propchange: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelStartup.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java?rev=1380791&r1=1380790&r2=1380791&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java (original)
+++ camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java Tue Sep  4 18:28:27 2012
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.cdi;
 
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.enterprise.inject.Instance;
 import javax.inject.Inject;
 
@@ -51,4 +53,15 @@ public class CdiCamelContext extends Def
         return !instance.isUnsatisfied() && !instance.isAmbiguous();
     }
 
+    @PostConstruct
+    @Override
+    public void start() throws Exception {
+        super.start();
+    }
+
+    @PreDestroy
+    @Override
+    public void stop() throws Exception {
+        super.stop();
+    }
 }

Modified: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/BeanAdapter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/BeanAdapter.java?rev=1380791&r1=1380790&r2=1380791&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/BeanAdapter.java (original)
+++ camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/BeanAdapter.java Tue Sep  4 18:28:27 2012
@@ -21,6 +21,7 @@ import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.camel.Consume;
 import org.apache.camel.EndpointInject;
 import org.apache.camel.Produce;
 import org.apache.camel.impl.CamelPostProcessorHelper;
@@ -67,38 +68,61 @@ public class BeanAdapter {
     /**
      * Perform injections
      */
-    public void inject(DefaultCamelBeanPostProcessor postProcessor, Object reference,
+    public void inject(CamelExtension camelExtension, Object reference,
                                 String beanName) {
-        CamelPostProcessorHelper postProcessorHelper = postProcessor.getPostProcessorHelper();
         for (Method method : consumeMethods) {
-            postProcessorHelper.consumerInjection(method, reference, beanName);
+            Consume consume = method.getAnnotation(Consume.class);
+            if (consume != null) {
+                DefaultCamelBeanPostProcessor postProcessor = camelExtension.getPostProcessor(
+                        consume.context());
+                if (postProcessor != null) {
+                    postProcessor.getPostProcessorHelper().consumerInjection(method, reference, beanName);
+                }
+            }
         }
         for (Method method : produceMethods) {
             Produce annotation = method.getAnnotation(Produce.class);
-            if (annotation != null && postProcessorHelper.matchContext(annotation.context())) {
-                postProcessor.setterInjection(method, reference, beanName, annotation.uri(), annotation.ref(),
-                        annotation.property());
-
+            if (annotation != null) {
+                String contextName = annotation.context();
+                DefaultCamelBeanPostProcessor postProcessor = camelExtension.getPostProcessor(
+                        contextName);
+                if (postProcessor != null && postProcessor.getPostProcessorHelper().matchContext(contextName)) {
+                    postProcessor.setterInjection(method, reference, beanName, annotation.uri(), annotation.ref(),
+                            annotation.property());
+                }
             }
         }
         for (Method method : endpointMethods) {
             EndpointInject annotation = method.getAnnotation(EndpointInject.class);
-            if (annotation != null && postProcessorHelper.matchContext(annotation.context())) {
-                postProcessor.setterInjection(method, reference, beanName, annotation.uri(), annotation.ref(),
-                        annotation.property());
+            if (annotation != null) {
+                String contextName = annotation.context();
+                DefaultCamelBeanPostProcessor postProcessor = camelExtension.getPostProcessor(
+                        contextName);
+                if (postProcessor != null && postProcessor.getPostProcessorHelper().matchContext(contextName)) {
+                    postProcessor.setterInjection(method, reference, beanName, annotation.uri(), annotation.ref(),
+                            annotation.property());
 
+                }
             }
         }
         for (Field field : produceFields) {
             Produce annotation = field.getAnnotation(Produce.class);
-            if (annotation != null && postProcessorHelper.matchContext(annotation.context())) {
-                postProcessor.injectField(field, annotation.uri(), annotation.ref(),
-                        annotation.property(), reference, beanName);
+            if (annotation != null) {
+                String contextName = annotation.context();
+                DefaultCamelBeanPostProcessor postProcessor = camelExtension.getPostProcessor(
+                        contextName);
+                if (postProcessor != null && postProcessor.getPostProcessorHelper().matchContext(contextName)) {
+                    postProcessor.injectField(field, annotation.uri(), annotation.ref(),
+                            annotation.property(), reference, beanName);
+                }
             }
         }
         for (Field field : endpointFields) {
             EndpointInject annotation = field.getAnnotation(EndpointInject.class);
-            if (annotation != null && postProcessorHelper.matchContext(annotation.context())) {
+            String contextName = annotation.context();
+            DefaultCamelBeanPostProcessor postProcessor = camelExtension.getPostProcessor(
+                    contextName);
+            if (postProcessor != null && postProcessor.getPostProcessorHelper().matchContext(contextName)) {
                 postProcessor.injectField(field, annotation.uri(), annotation.ref(),
                         annotation.property(), reference, beanName);
             }

Modified: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java?rev=1380791&r1=1380790&r2=1380791&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java (original)
+++ camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java Tue Sep  4 18:28:27 2012
@@ -19,17 +19,23 @@ package org.apache.camel.component.cdi.i
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.InjectionTarget;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.cdi.CdiCamelContext;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.deltaspike.core.api.literal.AnyLiteral;
 import org.apache.deltaspike.core.api.literal.DefaultLiteral;
 
@@ -39,10 +45,23 @@ import org.apache.deltaspike.core.api.li
 @SuppressWarnings("unchecked")
 public class CamelContextBean implements Bean<CdiCamelContext> {
 
+    private final BeanManager beanManager;
+    private final String name;
+    private final String camelContextName;
+    private final List<Bean<?>> routeBuilderBeans;
     private final InjectionTarget<CdiCamelContext> target;
 
-    public CamelContextBean(InjectionTarget<CdiCamelContext> injectionTarget) {
-        this.target = injectionTarget;
+    public CamelContextBean(BeanManager beanManager) {
+        this(beanManager, "CamelContext", "", Collections.EMPTY_LIST);
+    }
+
+    public CamelContextBean(BeanManager beanManager, String name, String camelContextName,
+                            List<Bean<?>> routeBuilderBeans) {
+        this.beanManager = beanManager;
+        this.name = name;
+        this.camelContextName = camelContextName;
+        this.routeBuilderBeans = routeBuilderBeans;
+        this.target = beanManager.createInjectionTarget(beanManager.createAnnotatedType(CdiCamelContext.class));
     }
 
     @Override
@@ -77,7 +96,7 @@ public class CamelContextBean implements
 
     @Override
     public String getName() {
-        return "CamelContext";
+        return name;
     }
 
     @Override
@@ -105,4 +124,29 @@ public class CamelContextBean implements
         return false;
     }
 
+    public String getCamelContextName() {
+        return camelContextName;
+    }
+
+    protected void configureCamelContext(CdiCamelContext camelContext) {
+        if (ObjectHelper.isNotEmpty(camelContextName)) {
+            camelContext.setName(camelContextName);
+        }
+        for (Bean<?> bean : routeBuilderBeans) {
+            CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean);
+            RouteBuilder routeBuilder = (RouteBuilder)beanManager.getReference(bean, RouteBuilder.class, creationalContext);
+            try {
+                camelContext.addRoutes(routeBuilder);
+            } catch (Exception e) {
+                throw new RuntimeCamelException("Could not add route builder " + routeBuilder + ". Reason: " + e, e);
+            }
+        }
+    }
+
+    public CdiCamelContext configure() {
+        CreationalContext<CdiCamelContext> creationalContext = beanManager.createCreationalContext(this);
+        CdiCamelContext cdiCamelContext = create(creationalContext);
+        configureCamelContext(cdiCamelContext);
+        return cdiCamelContext;
+    }
 }

Modified: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelExtension.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelExtension.java?rev=1380791&r1=1380790&r2=1380791&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelExtension.java (original)
+++ camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelExtension.java Tue Sep  4 18:28:27 2012
@@ -18,10 +18,11 @@ package org.apache.camel.component.cdi.i
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.ejb.Startup;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.event.Observes;
@@ -30,7 +31,6 @@ import javax.enterprise.inject.spi.After
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.inject.spi.BeforeShutdown;
 import javax.enterprise.inject.spi.Extension;
 import javax.enterprise.inject.spi.InjectionTarget;
 import javax.enterprise.inject.spi.ProcessAnnotatedType;
@@ -44,9 +44,10 @@ import org.apache.camel.CamelContextAwar
 import org.apache.camel.Consume;
 import org.apache.camel.EndpointInject;
 import org.apache.camel.Produce;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.cdi.CamelStartup;
 import org.apache.camel.component.cdi.CdiCamelContext;
 import org.apache.camel.impl.DefaultCamelBeanPostProcessor;
-import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.ReflectionHelper;
 import org.apache.deltaspike.core.api.provider.BeanProvider;
 import org.apache.deltaspike.core.util.metadata.builder.AnnotatedTypeBuilder;
@@ -56,13 +57,10 @@ import org.apache.deltaspike.core.util.m
  */
 public class CamelExtension implements Extension {
 
-    /**
-     * Context instance.
-     */
-    private CamelContext camelContext;
-    private DefaultCamelBeanPostProcessor postProcessor;
-
     private Map<Bean<?>, BeanAdapter> eagerBeans = new HashMap<Bean<?>, BeanAdapter>();
+    private Map<String, List<Bean<?>>> namedCamelContexts = new HashMap<String, List<Bean<?>>>();
+    private List<CamelContextBean> camelContextBeans = new ArrayList<CamelContextBean>();
+    private Map<String, CamelContext> camelContexts = new HashMap<String, CamelContext>();
 
     public CamelExtension() {
     }
@@ -103,34 +101,25 @@ public class CamelExtension implements E
      * @param manager Bean manager.
      */
     protected void registerManagedCamelContext(@Observes AfterBeanDiscovery abd, BeanManager manager) {
-        abd.addBean(new CamelContextBean(
-                manager.createInjectionTarget(manager.createAnnotatedType(CdiCamelContext.class))));
-    }
-
-    /**
-     * Start up camel context.
-     *
-     * @param adv After deployment validation event.
-     * @throws Exception In case of failures.
-     */
-    protected void validate(@Observes AfterDeploymentValidation adv) throws Exception {
-        getCamelContext().start();
-    }
-
-    /**
-     * Shutdown camel context.
-     *
-     * @param bsd Shutdown event.
-     * @throws Exception In case of failures.
-     */
-    protected void shutdown(@Observes BeforeShutdown bsd) throws Exception {
-        if (camelContext != null) {
-            camelContext.stop();
+        // lets ensure we have at least one camel context
+        if (namedCamelContexts.isEmpty()) {
+            abd.addBean(new CamelContextBean(manager));
+        } else {
+            Set<Map.Entry<String, List<Bean<?>>>> entries = namedCamelContexts.entrySet();
+            for (Map.Entry<String, List<Bean<?>>> entry : entries) {
+                String name = entry.getKey();
+                List<Bean<?>> beans = entry.getValue();
+                CamelContextBean camelContextBean = new CamelContextBean(manager, "CamelContext:" + name, name, beans);
+                camelContextBeans.add(camelContextBean);
+                abd.addBean(camelContextBean);
+            }
         }
     }
 
     /**
-     * Lets detect all beans annotated with @Consume
+     * Lets detect all beans annotated with @Consume and
+     * beans of type {@link RouteBuilder} which are annotated with {@link org.apache.camel.cdi.CamelStartup}
+     * so they can be auto-registered
      */
     public void detectConsumeBeans(@Observes ProcessBean<?> event) {
         final Bean<?> bean = event.getBean();
@@ -145,30 +134,38 @@ public class CamelExtension implements E
             }
         });
 
-        // lets force singletons and application scoped objects
-        // to be created eagerly to ensure they startup
-        if (eagerlyCreateSingletonsOnStartup() && isApplicationScopeOrSingleton(beanClass) && beanClass.getAnnotation(Startup.class) != null) {
-            eagerlyCreate(bean);
+        // detect all RouteBuilder instances
+        if (RouteBuilder.class.isAssignableFrom(beanClass)) {
+            CamelStartup annotation = beanClass.getAnnotation(CamelStartup.class);
+            if (annotation != null) {
+                String contextName = annotation.contextName();
+                List<Bean<?>> beans = namedCamelContexts.get(contextName);
+                if (beans == null) {
+                    beans = new ArrayList<Bean<?>>();
+                    namedCamelContexts.put(contextName, beans);
+                }
+                beans.add(bean);
+            }
         }
     }
 
     /**
-     * Should we eagerly startup @Singleton and @ApplicationScoped beans annotated with @Startup?
-     * Defaults to true which enables us to start camel contexts on startup
-     */
-    protected boolean eagerlyCreateSingletonsOnStartup() {
-        return true;
-    }
-
-
-    /**
      * Lets force the CDI container to create all beans annotated with @Consume so that the consumer becomes active
      */
-    public void startConsumeBeans(@Observes AfterDeploymentValidation event, BeanManager beanManager) {
-        ObjectHelper.notNull(getCamelContext(), "camelContext");
+    public void startConsumeBeans(@Observes AfterDeploymentValidation event, BeanManager beanManager) throws Exception {
+        if (camelContextBeans.isEmpty()) {
+            CamelContext camelContext = BeanProvider.getContextualReference(CamelContext.class);
+            camelContexts.put("", camelContext);
+        }
+        for (CamelContextBean camelContextBean : camelContextBeans) {
+            CdiCamelContext context = camelContextBean.configure();
+            camelContexts.put(camelContextBean.getCamelContextName(), context);
+        }
+
         Set<Map.Entry<Bean<?>, BeanAdapter>> entries = eagerBeans.entrySet();
         for (Map.Entry<Bean<?>, BeanAdapter> entry : entries) {
             Bean<?> bean = entry.getKey();
+            BeanAdapter adapter = entry.getValue();
             CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean);
 
             // force lazy creation
@@ -180,9 +177,10 @@ public class CamelExtension implements E
     /**
      * Lets perform injection of all beans which use Camel annotations
      */
-    public void onInjectionTarget(@Observes ProcessInjectionTarget<Object> event) {
-        final InjectionTarget<Object> injectionTarget = event.getInjectionTarget();
-        final Class<?> beanClass = event.getAnnotatedType().getJavaClass();
+    @SuppressWarnings("unchecked")
+    public void onInjectionTarget(@Observes ProcessInjectionTarget event) {
+        final InjectionTarget injectionTarget = event.getInjectionTarget();
+        final Class beanClass = event.getAnnotatedType().getJavaClass();
         // TODO this is a bit of a hack - what should the bean name be?
         final String beanName = event.getInjectionTarget().toString();
         final BeanAdapter adapter = createBeanAdapter(beanClass);
@@ -194,7 +192,7 @@ public class CamelExtension implements E
                     super.postConstruct(instance);
 
                     // now lets do the post instruct to inject our Camel injections
-                    adapter.inject(getPostProcessor(), instance, beanName);
+                    adapter.inject(CamelExtension.this, instance, beanName);
                 }
             };
             event.setInjectionTarget(newTarget);
@@ -212,11 +210,11 @@ public class CamelExtension implements E
         if (!adapter.isEmpty()) {
             // TODO this is a bit of a hack - what should the bean name be?
             final String beanName = bean.toString();
-            adapter.inject(getPostProcessor(), bean, beanName);
+            adapter.inject(this, bean, beanName);
         }
     }
 
-    private BeanAdapter createBeanAdapter(Class<?> beanClass) {
+    private BeanAdapter createBeanAdapter(Class beanClass) {
         final BeanAdapter adapter = new BeanAdapter();
         ReflectionHelper.doWithFields(beanClass, new ReflectionHelper.FieldCallback() {
             @Override
@@ -251,11 +249,13 @@ public class CamelExtension implements E
         return adapter;
     }
 
-    protected DefaultCamelBeanPostProcessor getPostProcessor() {
-        if (postProcessor == null) {
-            postProcessor = new DefaultCamelBeanPostProcessor(getCamelContext());
+    protected DefaultCamelBeanPostProcessor getPostProcessor(String context) {
+        CamelContext camelContext = camelContexts.get(context);
+        if (camelContext != null) {
+            return new DefaultCamelBeanPostProcessor(camelContext);
+        } else {
+            throw new IllegalArgumentException("No such CamelContext '" + context + "' available!");
         }
-        return postProcessor;
     }
 
     protected BeanAdapter eagerlyCreate(Bean<?> bean) {
@@ -267,14 +267,6 @@ public class CamelExtension implements E
         return beanAdapter;
     }
 
-    public CamelContext getCamelContext() {
-        if (camelContext == null) {
-            camelContext = BeanProvider.getContextualReference(CamelContext.class);
-        }
-        return camelContext;
-    }
-
-
     /**
      * Returns true if this field is annotated with @Inject
      */
@@ -285,7 +277,7 @@ public class CamelExtension implements E
     /**
      * Returns true for singletons or application scoped beans
      */
-    private boolean isApplicationScopeOrSingleton(Class<?> aClass) {
+    protected boolean isApplicationScopeOrSingleton(Class<?> aClass) {
         return aClass.getAnnotation(Singleton.class) != null || aClass.getAnnotation(ApplicationScoped.class) != null;
     }
 }

Copied: camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRoutes.java (from r1380669, camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRouteConfig.java)
URL: http://svn.apache.org/viewvc/camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRoutes.java?p2=camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRoutes.java&p1=camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRouteConfig.java&r1=1380669&r2=1380791&rev=1380791&view=diff
==============================================================================
--- camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRouteConfig.java (original)
+++ camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRoutes.java Tue Sep  4 18:28:27 2012
@@ -18,9 +18,6 @@
 package org.apache.camel.example.cdi;
 
 import javax.annotation.PostConstruct;
-import javax.ejb.Startup;
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.Produces;
 import javax.inject.Inject;
 import javax.inject.Named;
 
@@ -28,17 +25,14 @@ import org.apache.activemq.camel.compone
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.cdi.CamelStartup;
 import org.apache.camel.cdi.Uri;
 
 /**
- * Configures all our Camel components, endpoints and beans and create the Camel routes
+ * Configures all our Camel routes, components, endpoints and beans
  */
-@ApplicationScoped
-@Startup
-public class MyRouteConfig {
-
-    @Inject
-    private CamelContext camelContext;
+@CamelStartup
+public class MyRoutes extends RouteBuilder {
 
     @Inject
     //@Uri("activemq:test.MyQueue")
@@ -49,22 +43,19 @@ public class MyRouteConfig {
     @Uri("file://target/testdata/result?noop=true")
     private Endpoint resultEndpoint;
 
-    @Produces
-    public RouteBuilder createRoutes() {
-        return new RouteBuilder() {
-            public void configure() {
-                // you can configure the route rule with Java DSL here
-
-                // populate the message queue with some messages
-                from("file:src/data?noop=true").
-                        to(queueEndpoint);
-
-                // consume from message queue to a result endpoint and process with a bean
-                from(queueEndpoint).
-                        to(resultEndpoint).
-                        bean(new SomeBean());
-            }
-        };
+
+    @Override
+    public void configure() throws Exception {
+        // you can configure the route rule with Java DSL here
+
+        // populate the message queue with some messages
+        from("file:src/data?noop=true").
+                to(queueEndpoint);
+
+        // consume from message queue to a result endpoint and process with a bean
+        from(queueEndpoint).
+                to(resultEndpoint).
+                bean(new SomeBean());
     }
 
     /**
@@ -77,14 +68,6 @@ public class MyRouteConfig {
         return answer;
     }
 
-    /**
-     * TODO can we avoid this bit and get CDI to automatically create a CamelContext and add its routes?
-     */
-    @PostConstruct
-    public void start() throws Exception {
-        camelContext.addRoutes(createRoutes());
-    }
-
     public Endpoint getResultEndpoint() {
         return resultEndpoint;
     }

Propchange: camel/trunk/examples/camel-example-cdi/src/main/java/org/apache/camel/example/cdi/MyRoutes.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: camel/trunk/examples/camel-example-cdi/src/test/java/org/apache/camel/example/cdi/IntegrationTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/examples/camel-example-cdi/src/test/java/org/apache/camel/example/cdi/IntegrationTest.java?rev=1380791&r1=1380790&r2=1380791&view=diff
==============================================================================
--- camel/trunk/examples/camel-example-cdi/src/test/java/org/apache/camel/example/cdi/IntegrationTest.java (original)
+++ camel/trunk/examples/camel-example-cdi/src/test/java/org/apache/camel/example/cdi/IntegrationTest.java Tue Sep  4 18:28:27 2012
@@ -33,6 +33,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 /**
  */
@@ -40,7 +41,7 @@ import static org.junit.Assert.assertNot
 public class IntegrationTest {
 
     @Inject
-    MyRouteConfig config;
+    MyRoutes config;
 
     @Inject
     CamelContext camelContext;
@@ -61,6 +62,8 @@ public class IntegrationTest {
     @Test
     public void integrationTest() throws Exception {
         assertNotNull("CamelContext not injected!", camelContext);
+        assertTrue("CamelContext is started", camelContext.getStatus().isStarted());
+
         assertNotNull("config not injected!", config);
         assertNotNull("MockEndpoint result not injected!", result);
 
@@ -77,7 +80,7 @@ public class IntegrationTest {
     public static JavaArchive createDeployment() {
         return ShrinkWrap.create(JavaArchive.class)
                 .addPackage(CamelExtension.class.getPackage())
-                .addPackage(MyRouteConfig.class.getPackage())
+                .addPackage(MyRoutes.class.getPackage())
                 .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
     }
 }