Repository: camel Updated Branches: refs/heads/master 0d14485d0 -> 1c70401e9
camel-cdi - Add support for injecting FluentProducerTemplate Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1c70401e Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1c70401e Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1c70401e Branch: refs/heads/master Commit: 1c70401e99669482231571d826caebf32ad853ed Parents: 0d14485 Author: Claus Ibsen <davscl...@apache.org> Authored: Tue Aug 30 11:20:55 2016 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Tue Aug 30 11:20:55 2016 +0200 ---------------------------------------------------------------------- components/camel-cdi/src/main/docs/cdi.adoc | 19 ++++- .../org/apache/camel/cdi/CdiCamelExtension.java | 5 ++ .../org/apache/camel/cdi/CdiCamelFactory.java | 33 +++++++++ .../cdi/bean/FluentProduceTemplateBean.java | 30 ++++++++ .../cdi/test/FluentProduceTemplateTest.java | 76 ++++++++++++++++++++ 5 files changed, 162 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/1c70401e/components/camel-cdi/src/main/docs/cdi.adoc ---------------------------------------------------------------------- diff --git a/components/camel-cdi/src/main/docs/cdi.adoc b/components/camel-cdi/src/main/docs/cdi.adoc index 0a68714..05832d1 100644 --- a/components/camel-cdi/src/main/docs/cdi.adoc +++ b/components/camel-cdi/src/main/docs/cdi.adoc @@ -14,7 +14,7 @@ The Camel CDI component provides auto-configuration for Apache Camel using CDI as dependency injection framework based on _convention-over-configuration_. It auto-detects Camel routes available in the application and provides beans for common Camel -primitives like `Endpoint`, `ProducerTemplate` or `TypeConverter`. It +primitives like `Endpoint`, `FluentProducerTemplate`, `ProducerTemplate` or `TypeConverter`. It implements standard link:bean-integration.html[Camel bean integration] so that Camel annotations like `@Consume`, `@Produce` and `@PropertyInject` can be used seamlessly in CDI beans. Besides, it @@ -92,6 +92,10 @@ injected in any CDI beans, e.g.: ProducerTemplate producerTemplate; @Inject +@Uri("direct:inbound") +FluentProducerTemplate fluentProducerTemplate; + +@Inject MockEndpoint outbound; // URI defaults to the member name, i.e. mock:outbound @Inject @@ -286,6 +290,11 @@ bind the corresponding Camel primitives, e.g.: ProducerTemplate producerTemplate; @Inject +@ContextName("foo") +@Uri("direct:inbound") +FluentProducerTemplate fluentProducerTemplate; + +@Inject @BarContextQualifier MockEndpoint outbound; // URI defaults to the member name, i.e. mock:outbound @@ -412,6 +421,10 @@ See link:cdi.html[configuration properties] for more details. ---- @Produce(uri = "mock:outbound") ProducerTemplate producer; + +// or using fluent template +@Produce(uri = "mock:outbound") +FluentProducerTemplate producer; ---- a| @@ -420,6 +433,10 @@ ProducerTemplate producer; @Inject @Uri("direct:outbound") ProducerTemplate producer; + +// or using fluent template +@Produce(uri = "direct:outbound") +FluentProducerTemplate producer; ---- |Endpoint injection (default Camel context) a| http://git-wip-us.apache.org/repos/asf/camel/blob/1c70401e/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 4803ef3..f4bb9bb 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 @@ -66,6 +66,7 @@ import org.apache.camel.ConsumerTemplate; import org.apache.camel.Converter; import org.apache.camel.Endpoint; import org.apache.camel.EndpointInject; +import org.apache.camel.FluentProducerTemplate; import org.apache.camel.Produce; import org.apache.camel.ProducerTemplate; import org.apache.camel.PropertyInject; @@ -179,6 +180,10 @@ public class CdiCamelExtension implements Extension { producerBeans.put(ppm.getAnnotatedProducerMethod().getJavaMember(), ppm.getBean()); } + private void fluentProducerTemplateBeans(@Observes ProcessProducerMethod<FluentProducerTemplate, CdiCamelFactory> ppm) { + producerBeans.put(ppm.getAnnotatedProducerMethod().getJavaMember(), ppm.getBean()); + } + private void camelFactoryProducers(@Observes ProcessAnnotatedType<CdiCamelFactory> pat, BeanManager manager) { pat.setAnnotatedType( new AnnotatedTypeDelegate<>( http://git-wip-us.apache.org/repos/asf/camel/blob/1c70401e/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 b0e87aa..8c4c0f3 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 @@ -36,6 +36,7 @@ import javax.enterprise.inject.spi.InjectionPoint; import org.apache.camel.CamelContext; import org.apache.camel.ConsumerTemplate; import org.apache.camel.Endpoint; +import org.apache.camel.FluentProducerTemplate; import org.apache.camel.ProducerTemplate; import org.apache.camel.TypeConverter; import org.apache.camel.component.mock.MockEndpoint; @@ -90,6 +91,38 @@ final class CdiCamelFactory { } @Produces + @Default @Uri("") + // Qualifiers are dynamically added in CdiCamelExtension + private static FluentProducerTemplate fluentProducerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) { + return getQualifierByType(ip, Uri.class) + .map(uri -> fluentProducerTemplateFromUri(ip, instance, extension, uri)) + .orElseGet(() -> defaultFluentProducerTemplate(ip, instance, extension)); + } + + private static FluentProducerTemplate fluentProducerTemplateFromUri(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension, Uri uri) { + try { + CamelContext context = uri.context().isEmpty() + ? selectContext(ip, instance, extension) + : selectContext(uri.context(), instance); + FluentProducerTemplate producerTemplate = context.createFluentProducerTemplate(); + Endpoint endpoint = context.getEndpoint(uri.value(), Endpoint.class); + producerTemplate.setDefaultEndpoint(endpoint); + return producerTemplate; + } catch (Exception cause) { + throw new InjectionException("Error injecting fluent producer template annotated with " + uri + " into " + ip, cause); + } + } + + private static FluentProducerTemplate defaultFluentProducerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) { + try { + CamelContext context = selectContext(ip, instance, extension); + return context.createFluentProducerTemplate(); + } catch (Exception cause) { + throw new InjectionException("Error injecting fluent producer template into " + ip, cause); + } + } + + @Produces @Typed(MockEndpoint.class) // Qualifiers are dynamically added in CdiCamelExtension private static MockEndpoint mockEndpointFromMember(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) { http://git-wip-us.apache.org/repos/asf/camel/blob/1c70401e/components/camel-cdi/src/test/java/org/apache/camel/cdi/bean/FluentProduceTemplateBean.java ---------------------------------------------------------------------- diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/bean/FluentProduceTemplateBean.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/bean/FluentProduceTemplateBean.java new file mode 100644 index 0000000..929a669 --- /dev/null +++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/bean/FluentProduceTemplateBean.java @@ -0,0 +1,30 @@ +/** + * 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.bean; + +import org.apache.camel.FluentProducerTemplate; +import org.apache.camel.Produce; + +public class FluentProduceTemplateBean { + + @Produce(uri = "mock:outbound") + private FluentProducerTemplate producer; + + public void sendToProducer(String body) { + producer.withBody(body + "-processed").send(); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/1c70401e/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/FluentProduceTemplateTest.java ---------------------------------------------------------------------- diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/FluentProduceTemplateTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/FluentProduceTemplateTest.java new file mode 100644 index 0000000..4864c57 --- /dev/null +++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/FluentProduceTemplateTest.java @@ -0,0 +1,76 @@ +/** + * 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 org.apache.camel.CamelContext; +import org.apache.camel.FluentProducerTemplate; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.cdi.CdiCamelExtension; +import org.apache.camel.cdi.Uri; +import org.apache.camel.cdi.bean.FluentProduceTemplateBean; +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.component.mock.MockEndpoint.assertIsSatisfied; + +@RunWith(Arquillian.class) +public class FluentProduceTemplateTest { + + @Deployment + public static Archive<?> deployment() { + return ShrinkWrap.create(JavaArchive.class) + // Camel CDI + .addPackage(CdiCamelExtension.class.getPackage()) + // Test class + .addClass(FluentProduceTemplateBean.class) + // Bean archive deployment descriptor + .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); + } + + @Test + @InSequence(1) + public void configureCamelContext(CamelContext context) throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() { + from("direct:inbound").bean(FluentProduceTemplateBean.class); + } + }); + } + + @Test + @InSequence(2) + public void sendMessageToInbound(@Uri("direct:inbound") FluentProducerTemplate in, + @Uri("mock:outbound") MockEndpoint out) throws InterruptedException { + out.expectedMessageCount(1); + out.expectedBodiesReceived("test-processed"); + + in.withBody("test").send(); + + assertIsSatisfied(2L, TimeUnit.SECONDS, out); + } +}