Automatically deploy @ContextName Camel context beans

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

Branch: refs/heads/master
Commit: 3c0bc162088ca183aa992514999a868f2b8b218d
Parents: 861a097
Author: Antonin Stefanutti <anto...@stefanutti.fr>
Authored: Thu Jan 21 17:45:39 2016 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Fri Jan 22 15:57:18 2016 +0100

----------------------------------------------------------------------
 .../apache/camel/cdi/CdiCamelContextBean.java   |  7 +-
 .../org/apache/camel/cdi/CdiCamelExtension.java | 43 +++++++++---
 .../FirstCamelContextEndpointInjectRoute.java   |  8 ++-
 .../test/RouteBuilderWithContextNameTest.java   | 73 ++++++++++++++++++++
 .../apache/camel/itest/cdi/CamelContextA.java   | 28 --------
 .../apache/camel/itest/cdi/CamelContextB.java   | 28 --------
 .../apache/camel/itest/cdi/CamelContextC.java   | 28 --------
 .../apache/camel/itest/cdi/CamelContextD.java   | 28 --------
 .../apache/camel/itest/cdi/RoutesContextB.java  |  2 +-
 .../apache/camel/itest/cdi/RoutesContextC.java  |  2 +-
 .../apache/camel/itest/cdi/CamelCdiTest.java    |  9 +--
 11 files changed, 123 insertions(+), 133 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContextBean.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContextBean.java
 
b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContextBean.java
index 6f4dc10..63db497 100644
--- 
a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContextBean.java
+++ 
b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContextBean.java
@@ -37,10 +37,13 @@ final class CdiCamelContextBean implements 
Bean<DefaultCamelContext>, Passivatio
 
     private final InjectionTarget<DefaultCamelContext> target;
 
+    private final String name;
+
     CdiCamelContextBean(CdiCamelContextAnnotated annotated, 
InjectionTarget<DefaultCamelContext> target) {
         this.qualifiers = annotated.getAnnotations();
         this.types = annotated.getTypeClosure();
         this.target = target;
+        this.name = annotated.isAnnotationPresent(ContextName.class) ? 
annotated.getAnnotation(ContextName.class).value() : "Default";
     }
 
     @Override
@@ -87,7 +90,7 @@ final class CdiCamelContextBean implements 
Bean<DefaultCamelContext>, Passivatio
 
     @Override
     public String toString() {
-        return "Default CDI Camel Context";
+        return "Camel context bean [" + name + "]";
     }
 
     @Override
@@ -112,6 +115,6 @@ final class CdiCamelContextBean implements 
Bean<DefaultCamelContext>, Passivatio
 
     @Override
     public String getId() {
-        return getClass().getName();
+        return getClass().getName() + "[" + name + "]";
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
 
b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
index e052206..6177370 100755
--- 
a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
+++ 
b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
@@ -93,6 +93,8 @@ public class CdiCamelExtension implements Extension {
 
     private final Map<Method, Set<Annotation>> producerQualifiers = new 
ConcurrentHashMap<>();
 
+    private final Set<ContextName> contextNames = newSetFromMap(new 
ConcurrentHashMap<ContextName, Boolean>());
+
     ForwardingObserverMethod<?> getObserverMethod(InjectionPoint ip) {
         return cdiEventEndpoints.get(ip);
     }
@@ -189,6 +191,12 @@ public class CdiCamelExtension implements Extension {
         }
     }
 
+    private <T extends RoutesBuilder> void routeBuilderBeans(@Observes 
ProcessBean<T> pb) {
+        if (pb.getAnnotated().isAnnotationPresent(ContextName.class)) {
+            
contextNames.add(pb.getAnnotated().getAnnotation(ContextName.class));
+        }
+    }
+
     private <T extends CamelContext> void camelContextBeans(@Observes 
ProcessBean<T> pb) {
         contextQualifiers.addAll(pb.getBean().getQualifiers());
     }
@@ -201,7 +209,22 @@ public class CdiCamelExtension implements Extension {
         contextQualifiers.addAll(pb.getBean().getQualifiers());
     }
 
-    private void cdiCamelFactoryProducers(@Observes AfterBeanDiscovery abd) {
+    private void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, 
BeanManager manager) {
+        // Add @ContextName Camel context beans if missing
+        contextNames.removeAll(contextQualifiers);
+        for (ContextName name : contextNames) {
+            abd.addBean(camelContextBean(manager, AnyLiteral.INSTANCE, name));
+        }
+
+        // Add a default Camel context bean if any
+        if (contextQualifiers.isEmpty() && contextNames.isEmpty()) {
+            abd.addBean(camelContextBean(manager, AnyLiteral.INSTANCE, 
DefaultLiteral.INSTANCE));
+        }
+
+        // Update @ContextName Camel context qualifiers
+        contextQualifiers.addAll(contextNames);
+
+        // Then update the Camel producer beans
         for (Map.Entry<Method, Bean<?>> producer : producerBeans.entrySet()) {
             Bean<?> bean = producer.getValue();
             Set<Annotation> qualifiers = new 
HashSet<>(producerQualifiers.get(producer.getKey()));
@@ -218,22 +241,19 @@ public class CdiCamelExtension implements Extension {
             // TODO: would be more correct to add a bean for each Camel 
context bean
             abd.addBean(new BeanDelegate<>(bean, qualifiers));
         }
-    }
 
-    private void addDefaultCamelContext(@Observes AfterBeanDiscovery abd, 
BeanManager manager) {
-        if (contextQualifiers.isEmpty()) {
-            CdiCamelContextAnnotated annotated = new 
CdiCamelContextAnnotated(manager, AnyLiteral.INSTANCE, DefaultLiteral.INSTANCE);
-            abd.addBean(new CdiCamelContextBean(annotated, 
environment.camelContextInjectionTarget(new CamelContextDefaultProducer(), 
annotated, manager, this)));
-        }
-    }
-
-    private void addCdiEventObserverMethods(@Observes AfterBeanDiscovery abd) {
+        // Add CDI event endpoint observer methods
         for (ObserverMethod method : cdiEventEndpoints.values()) {
             abd.addObserverMethod(method);
         }
     }
 
-    private void createCamelContexts(@Observes AfterDeploymentValidation adv, 
BeanManager manager) {
+    private Bean<?> camelContextBean(BeanManager manager, Annotation... 
qualifiers) {
+        CdiCamelContextAnnotated annotated = new 
CdiCamelContextAnnotated(manager, qualifiers);
+        return new CdiCamelContextBean(annotated, 
environment.camelContextInjectionTarget(new CamelContextDefaultProducer(), 
annotated, manager, this));
+    }
+
+    private void afterDeploymentValidation(@Observes AfterDeploymentValidation 
adv, BeanManager manager) {
         Collection<CamelContext> contexts = new ArrayList<>();
         for (Bean<?> context : manager.getBeans(CamelContext.class, 
AnyLiteral.INSTANCE)) {
             contexts.add(BeanManagerHelper.getReference(manager, 
CamelContext.class, context));
@@ -290,6 +310,7 @@ public class CdiCamelExtension implements Extension {
         eagerBeans.clear();
         producerBeans.clear();
         producerQualifiers.clear();
+        contextNames.clear();
     }
 
     private boolean addRouteToContext(Bean<?> routeBean, Bean<?> contextBean, 
BeanManager manager, AfterDeploymentValidation adv) {

http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/components/camel-cdi/src/test/java/org/apache/camel/cdi/bean/FirstCamelContextEndpointInjectRoute.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cdi/src/test/java/org/apache/camel/cdi/bean/FirstCamelContextEndpointInjectRoute.java
 
b/components/camel-cdi/src/test/java/org/apache/camel/cdi/bean/FirstCamelContextEndpointInjectRoute.java
index a85e8e5..1d68f95 100644
--- 
a/components/camel-cdi/src/test/java/org/apache/camel/cdi/bean/FirstCamelContextEndpointInjectRoute.java
+++ 
b/components/camel-cdi/src/test/java/org/apache/camel/cdi/bean/FirstCamelContextEndpointInjectRoute.java
@@ -16,15 +16,19 @@
  */
 package org.apache.camel.cdi.bean;
 
+import javax.inject.Inject;
+
 import org.apache.camel.Endpoint;
-import org.apache.camel.EndpointInject;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.cdi.ContextName;
+import org.apache.camel.cdi.Uri;
 
 @ContextName("first")
 public class FirstCamelContextEndpointInjectRoute extends RouteBuilder {
 
-    @EndpointInject(uri = "direct:inbound", context = "first")
+    @Inject
+    @ContextName("first")
+    @Uri("direct:inbound")
     private Endpoint inbound;
     
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/RouteBuilderWithContextNameTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/RouteBuilderWithContextNameTest.java
 
b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/RouteBuilderWithContextNameTest.java
new file mode 100644
index 0000000..6aa84e3
--- /dev/null
+++ 
b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/RouteBuilderWithContextNameTest.java
@@ -0,0 +1,73 @@
+/**
+ * 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.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.FirstCamelContextEndpointInjectRoute;
+import org.apache.camel.cdi.bean.SecondCamelContextEndpointInjectRoute;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+
+@RunWith(Arquillian.class)
+public class RouteBuilderWithContextNameTest {
+
+    @Inject
+    @Uri(value = "direct:inbound", context = "first")
+    private ProducerTemplate inbound;
+
+    @Inject
+    @Uri(value = "mock:outbound", context = "first")
+    private MockEndpoint outbound;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClasses(
+                FirstCamelContextEndpointInjectRoute.class,
+                SecondCamelContextEndpointInjectRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void sendMessageToInbound() throws InterruptedException {
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("test");
+        outbound.expectedHeaderReceived("context", "first");
+
+        inbound.sendBody("test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, outbound);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextA.java
----------------------------------------------------------------------
diff --git 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextA.java
 
b/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextA.java
deleted file mode 100644
index 3ca839c..0000000
--- 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextA.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * 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.itest.cdi;
-
-import javax.enterprise.context.ApplicationScoped;
-
-import org.apache.camel.cdi.CdiCamelContext;
-import org.apache.camel.cdi.ContextName;
-
-@ApplicationScoped
-@ContextName("contextA")
-public class CamelContextA extends CdiCamelContext {
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextB.java
----------------------------------------------------------------------
diff --git 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextB.java
 
b/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextB.java
deleted file mode 100644
index 2889cbd..0000000
--- 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextB.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * 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.itest.cdi;
-
-import javax.enterprise.context.ApplicationScoped;
-
-import org.apache.camel.cdi.CdiCamelContext;
-import org.apache.camel.cdi.ContextName;
-
-@ApplicationScoped
-@ContextName("contextB")
-public class CamelContextB extends CdiCamelContext {
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextC.java
----------------------------------------------------------------------
diff --git 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextC.java
 
b/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextC.java
deleted file mode 100644
index d4de27d..0000000
--- 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextC.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * 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.itest.cdi;
-
-import javax.enterprise.context.ApplicationScoped;
-
-import org.apache.camel.cdi.CdiCamelContext;
-import org.apache.camel.cdi.ContextName;
-
-@ApplicationScoped
-@ContextName("contextC")
-public class CamelContextC extends CdiCamelContext {
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextD.java
----------------------------------------------------------------------
diff --git 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextD.java
 
b/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextD.java
deleted file mode 100644
index 0934241..0000000
--- 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/CamelContextD.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * 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.itest.cdi;
-
-import javax.enterprise.context.ApplicationScoped;
-
-import org.apache.camel.cdi.CdiCamelContext;
-import org.apache.camel.cdi.ContextName;
-
-@ApplicationScoped
-@ContextName("contextD")
-public class CamelContextD extends CdiCamelContext {
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/RoutesContextB.java
----------------------------------------------------------------------
diff --git 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/RoutesContextB.java
 
b/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/RoutesContextB.java
index 89e0933..5e44dbf 100644
--- 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/RoutesContextB.java
+++ 
b/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/RoutesContextB.java
@@ -47,7 +47,7 @@ public class RoutesContextB extends RouteBuilder {
     ProducerTemplate producer;
 
     @Override
-    public void configure() throws Exception {
+    public void configure() {
         LOG.info("Adding route from " + a + " to " + b);
         from(a).to(b);
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/RoutesContextC.java
----------------------------------------------------------------------
diff --git 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/RoutesContextC.java
 
b/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/RoutesContextC.java
index 507a1d4..e3a9e2b 100644
--- 
a/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/RoutesContextC.java
+++ 
b/tests/camel-itest-cdi/src/main/java/org/apache/camel/itest/cdi/RoutesContextC.java
@@ -47,7 +47,7 @@ public class RoutesContextC extends RouteBuilder {
     ProducerTemplate producer;
 
     @Override
-    public void configure() throws Exception {
+    public void configure() {
         from(a).to(b);
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/3c0bc162/tests/camel-itest-cdi/src/test/java/org/apache/camel/itest/cdi/CamelCdiTest.java
----------------------------------------------------------------------
diff --git 
a/tests/camel-itest-cdi/src/test/java/org/apache/camel/itest/cdi/CamelCdiTest.java
 
b/tests/camel-itest-cdi/src/test/java/org/apache/camel/itest/cdi/CamelCdiTest.java
index 23261ad..bee1905 100644
--- 
a/tests/camel-itest-cdi/src/test/java/org/apache/camel/itest/cdi/CamelCdiTest.java
+++ 
b/tests/camel-itest-cdi/src/test/java/org/apache/camel/itest/cdi/CamelCdiTest.java
@@ -73,10 +73,11 @@ public class CamelCdiTest {
     public static JavaArchive createDeployment() {
         return ShrinkWrap.create(JavaArchive.class)
             .addPackage(CdiCamelExtension.class.getPackage())
-            .addClasses(CamelContextA.class, RoutesContextA.class,
-                        CamelContextB.class, RoutesContextB.class,
-                        CamelContextC.class, RoutesContextC.class,
-                        CamelContextD.class, RoutesContextD.class)
+            .addClasses(
+                RoutesContextA.class,
+                RoutesContextB.class,
+                RoutesContextC.class,
+                RoutesContextD.class)
             .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
     }
 

Reply via email to