Repository: camel
Updated Branches:
  refs/heads/master 9c2c1405c -> aa02daeb8


CAMEL-9798: Add support for injecting default ProducerTemplate in Camel CDI


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

Branch: refs/heads/master
Commit: 34664d5cbf230c1b26fe710b779a2e07ea40cb39
Parents: 9c2c140
Author: Antonin Stefanutti <anto...@stefanutti.fr>
Authored: Mon Apr 4 10:24:52 2016 +0200
Committer: Antonin Stefanutti <anto...@stefanutti.fr>
Committed: Mon Apr 4 10:24:52 2016 +0200

----------------------------------------------------------------------
 .../org/apache/camel/cdi/CdiCamelFactory.java   |  25 +++-
 .../cdi/test/DefaultProducerTemplateTest.java   |  68 +++++++++
 .../test/MultiContextProducerTemplateTest.java  | 137 +++++++++++++++++++
 3 files changed, 227 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/34664d5c/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java 
b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
index cdb2336..ecd309c 100755
--- 
a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
+++ 
b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
@@ -28,6 +28,7 @@ import java.util.Iterator;
 import java.util.Set;
 import javax.enterprise.event.Event;
 import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Default;
 import javax.enterprise.inject.InjectionException;
 import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.Produces;
@@ -49,15 +50,24 @@ final class CdiCamelFactory {
         return selectContext(ip, instance, extension).getTypeConverter();
     }
 
-    @Uri("")
     @Produces
+    @Default @Uri("")
     // Qualifiers are dynamically added in CdiCamelExtension
     private static ProducerTemplate producerTemplate(InjectionPoint ip, @Any 
Instance<CamelContext> instance, CdiCamelExtension extension) {
         Uri uri = CdiSpiHelper.getQualifierByType(ip, Uri.class);
+        if (uri != null) {
+            return producerTemplateFromUri(ip, instance, extension, uri);
+        } else {
+            return defaultProducerTemplate(ip, instance, extension);
+        }
+    }
+
+    private static ProducerTemplate producerTemplateFromUri(InjectionPoint ip, 
@Any Instance<CamelContext> instance, CdiCamelExtension extension, Uri uri) {
         try {
-            CamelContext context = uri.context().isEmpty() ? selectContext(ip, 
instance, extension) : selectContext(uri.context(), instance);
+            CamelContext context = uri.context().isEmpty()
+                ? selectContext(ip, instance, extension)
+                : selectContext(uri.context(), instance);
             ProducerTemplate producerTemplate = 
context.createProducerTemplate();
-            // FIXME: avoid NPE caused by missing @Uri qualifier when 
injection point is @ContextName qualified
             Endpoint endpoint = context.getEndpoint(uri.value(), 
Endpoint.class);
             producerTemplate.setDefaultEndpoint(endpoint);
             return producerTemplate;
@@ -66,6 +76,15 @@ final class CdiCamelFactory {
         }
     }
 
+    private static ProducerTemplate defaultProducerTemplate(InjectionPoint ip, 
@Any Instance<CamelContext> instance, CdiCamelExtension extension) {
+        try {
+            CamelContext context = selectContext(ip, instance, extension);
+            return context.createProducerTemplate();
+        } catch (Exception cause) {
+            throw new InjectionException("Error injecting producer template 
into " + ip, cause);
+        }
+    }
+
     @Produces
     @Typed(MockEndpoint.class)
     // Qualifiers are dynamically added in CdiCamelExtension

http://git-wip-us.apache.org/repos/asf/camel/blob/34664d5c/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultProducerTemplateTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultProducerTemplateTest.java
 
b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultProducerTemplateTest.java
new file mode 100644
index 0000000..6191b8d
--- /dev/null
+++ 
b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultProducerTemplateTest.java
@@ -0,0 +1,68 @@
+/**
+ * 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.UriEndpointRoute;
+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 DefaultProducerTemplateTest {
+
+    @Inject
+    private ProducerTemplate producer;
+
+    @Inject
+    @Uri("mock:outbound")
+    private MockEndpoint out;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClass(UriEndpointRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void sendMessageToInbound() throws InterruptedException {
+        out.expectedMessageCount(1);
+        out.expectedBodiesReceived("test");
+        
+        producer.sendBody("direct:inbound", "test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, out);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/34664d5c/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextProducerTemplateTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextProducerTemplateTest.java
 
b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextProducerTemplateTest.java
new file mode 100644
index 0000000..03550fc
--- /dev/null
+++ 
b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextProducerTemplateTest.java
@@ -0,0 +1,137 @@
+/**
+ * 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.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.ContextName;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.DefaultCamelContextBean;
+import org.apache.camel.cdi.bean.EndpointInjectRoute;
+import org.apache.camel.cdi.bean.FirstCamelContextBean;
+import org.apache.camel.cdi.bean.FirstCamelContextEndpointInjectRoute;
+import org.apache.camel.cdi.bean.SecondCamelContextBean;
+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.arquillian.junit.InSequence;
+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.cdi.expression.ExchangeExpression.fromCamelContext;
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+
+@RunWith(Arquillian.class)
+public class MultiContextProducerTemplateTest {
+
+    @Inject
+    private CamelContext defaultCamelContext;
+
+    @Inject
+    private ProducerTemplate defaultInbound;
+
+    @Inject @Uri("mock:outbound")
+    private MockEndpoint defaultOutbound;
+
+    @Inject @ContextName("first")
+    private CamelContext firstCamelContext;
+
+    @Inject @ContextName("first")
+    private ProducerTemplate firstInbound;
+
+    @Inject @ContextName("first") @Uri("mock:outbound")
+    private MockEndpoint firstOutbound;
+
+    @Inject @ContextName("second")
+    private CamelContext secondCamelContext;
+
+    @Inject @ContextName("second")
+    private ProducerTemplate secondInbound;
+
+    @Inject @ContextName("second") @Uri("mock:outbound")
+    private MockEndpoint secondOutbound;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(
+                DefaultCamelContextBean.class,
+                EndpointInjectRoute.class,
+                FirstCamelContextBean.class,
+                FirstCamelContextEndpointInjectRoute.class,
+                SecondCamelContextBean.class,
+                SecondCamelContextEndpointInjectRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    @InSequence(1)
+    public void configureCamelContexts() throws Exception {
+        secondCamelContext.startAllRoutes();
+    }
+
+    @Test
+    @InSequence(2)
+    public void sendMessageToDefaultCamelContextInbound() throws 
InterruptedException {
+        defaultOutbound.expectedMessageCount(1);
+        defaultOutbound.expectedBodiesReceived("test-default");
+        
defaultOutbound.message(0).exchange().matches(fromCamelContext("camel-cdi"));
+
+        defaultInbound.sendBody("direct:inbound", "test-default");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, defaultOutbound);
+    }
+
+    @Test
+    @InSequence(3)
+    public void sendMessageToFirstCamelContextInbound() throws 
InterruptedException {
+        firstOutbound.expectedMessageCount(1);
+        firstOutbound.expectedBodiesReceived("test-first");
+        firstOutbound.expectedHeaderReceived("context", "first");
+        firstOutbound.message(0).exchange().matches(fromCamelContext("first"));
+
+        firstInbound.sendBody("direct:inbound", "test-first");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, firstOutbound);
+    }
+
+    @Test
+    @InSequence(4)
+    public void sendMessageToSecondCamelContextInbound() throws 
InterruptedException {
+        secondOutbound.expectedMessageCount(1);
+        secondOutbound.expectedBodiesReceived("test-second");
+        secondOutbound.expectedHeaderReceived("context", "second");
+        
secondOutbound.message(0).exchange().matches(fromCamelContext("second"));
+
+        secondInbound.sendBody("direct:inbound", "test-second");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, secondOutbound);
+    }
+}

Reply via email to