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/03 12:39:22 UTC
svn commit: r1380193 - in /camel/trunk:
camel-core/src/main/java/org/apache/camel/impl/
components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/
components/camel-cdi/src/test/java/org/apache/camel/cdi/
components/camel-cdi/src/test/j...
Author: jstrachan
Date: Mon Sep 3 10:39:21 2012
New Revision: 1380193
URL: http://svn.apache.org/viewvc?rev=1380193&view=rev
Log:
initial spike of supporting naked @Produce annotations on CDI for CAMEL-5553
Added:
camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/ProduceInjectTest.java (with props)
camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/support/ProduceInjectedBean.java (with props)
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelBeanPostProcessor.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/CamelExtension.java
camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiContextTestSupport.java
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelBeanPostProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelBeanPostProcessor.java?rev=1380193&r1=1380192&r2=1380193&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelBeanPostProcessor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelBeanPostProcessor.java Mon Sep 3 10:39:21 2012
@@ -131,7 +131,7 @@ public class DefaultCamelBeanPostProcess
/**
* Strategy to get the {@link CamelPostProcessorHelper}
*/
- protected CamelPostProcessorHelper getPostProcessorHelper() {
+ public CamelPostProcessorHelper getPostProcessorHelper() {
if (camelPostProcessorHelper == null) {
camelPostProcessorHelper = new CamelPostProcessorHelper(getOrLookupCamelContext());
}
@@ -178,7 +178,7 @@ public class DefaultCamelBeanPostProcess
});
}
- protected void injectField(Field field, String endpointUri, String endpointRef, String endpointProperty,
+ public void injectField(Field field, String endpointUri, String endpointRef, String endpointProperty,
Object bean, String beanName) {
ReflectionHelper.setField(field, bean,
getPostProcessorHelper().getInjectionValue(field.getType(), endpointUri, endpointRef, endpointProperty,
@@ -206,7 +206,7 @@ public class DefaultCamelBeanPostProcess
}
}
- protected void setterInjection(Method method, Object bean, String beanName, String endpointUri, String endpointRef, String endpointProperty) {
+ public void setterInjection(Method method, Object bean, String beanName, String endpointUri, String endpointRef, String endpointProperty) {
Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes != null) {
if (parameterTypes.length != 1) {
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=1380193&r1=1380192&r2=1380193&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 Mon Sep 3 10:39:21 2012
@@ -17,17 +17,24 @@
*/
package org.apache.camel.component.cdi.internal;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.inject.spi.Bean;
+import org.apache.camel.Produce;
+import org.apache.camel.impl.CamelPostProcessorHelper;
+import org.apache.camel.impl.DefaultCamelBeanPostProcessor;
+
/**
* Contains the bean and the consume methods
*/
public class BeanAdapter {
private final Bean<?> bean;
private final List<Method> consumeMethods = new ArrayList<Method>();
+ private final List<Method> produceMethods = new ArrayList<Method>();
+ private final List<Field> produceFields = new ArrayList<Field>();
public BeanAdapter(Bean<?> bean) {
this.bean = bean;
@@ -41,7 +48,50 @@ public class BeanAdapter {
return consumeMethods;
}
+ public List<Method> getProduceMethods() {
+ return produceMethods;
+ }
+
+ public List<Field> getProduceFields() {
+ return produceFields;
+ }
+
public void addConsumeMethod(Method method) {
consumeMethods.add(method);
}
+
+ public void addProduceMethod(Method method) {
+ produceMethods.add(method);
+ }
+
+ public void addProduceField(Field field) {
+ produceFields.add(field);
+ }
+
+ /**
+ * Perform processing of the various @Consume, @Produce methods on the given bean reference
+ */
+ public void initialiseBean(DefaultCamelBeanPostProcessor postProcessor, Object reference,
+ String beanName) {
+ CamelPostProcessorHelper postProcessorHelper = postProcessor.getPostProcessorHelper();
+ for (Method method : consumeMethods) {
+ postProcessorHelper.consumerInjection(method, reference, beanName);
+ }
+ for (Method method : produceMethods) {
+ Produce produce = method.getAnnotation(Produce.class);
+ if (produce != null && postProcessorHelper.matchContext(produce.context())) {
+ postProcessor.setterInjection(method, bean, beanName, produce.uri(), produce.ref(),
+ produce.property());
+
+ }
+ }
+ for (Field field : produceFields) {
+ Produce produce = field.getAnnotation(Produce.class);
+ if (produce != null && postProcessorHelper.matchContext(produce.context())) {
+ postProcessor.injectField(field, produce.uri(), produce.ref(),
+ produce.property(), reference, beanName);
+ }
+ }
+ }
+
}
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=1380193&r1=1380192&r2=1380193&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 Mon Sep 3 10:39:21 2012
@@ -16,6 +16,7 @@
*/
package org.apache.camel.component.cdi.internal;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
@@ -32,12 +33,15 @@ import javax.enterprise.inject.spi.Befor
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessAnnotatedType;
import javax.enterprise.inject.spi.ProcessBean;
+import javax.inject.Inject;
import org.apache.camel.CamelContext;
import org.apache.camel.CamelContextAware;
import org.apache.camel.Consume;
+import org.apache.camel.Produce;
import org.apache.camel.component.cdi.CdiCamelContext;
import org.apache.camel.impl.CamelPostProcessorHelper;
+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;
@@ -125,13 +129,35 @@ public class CamelExtension implements E
BeanAdapter beanAdapter = getBeanAdapter(bean);
beanAdapter.addConsumeMethod(method);
}
+ Produce produce = method.getAnnotation(Produce.class);
+ if (produce != null) {
+ BeanAdapter beanAdapter = getBeanAdapter(bean);
+ beanAdapter.addProduceMethod(method);
+ }
+ }
+ });
+ ReflectionHelper.doWithFields(bean.getBeanClass(), new ReflectionHelper.FieldCallback() {
+ @Override
+ public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
+ Produce produce = field.getAnnotation(Produce.class);
+ if (produce != null && !injectAnnotatedField(field)) {
+ BeanAdapter beanAdapter = getBeanAdapter(bean);
+ beanAdapter.addProduceField(field);
+ }
}
});
}
+ /**
+ * Returns true if this field is annotated with @Inject
+ */
+ protected static boolean injectAnnotatedField(Field field) {
+ return field.getAnnotation(Inject.class) != null;
+ }
+
public void initializeBeans(@Observes AfterDeploymentValidation event, BeanManager beanManager) {
ObjectHelper.notNull(getCamelContext(), "camelContext");
- CamelPostProcessorHelper postProcessor = new CamelPostProcessorHelper(getCamelContext());
+ DefaultCamelBeanPostProcessor postProcessor = new DefaultCamelBeanPostProcessor(getCamelContext());
Collection<BeanAdapter> adapters = beanAdapters.values();
for (BeanAdapter adapter : adapters) {
Bean<?> bean = adapter.getBean();
@@ -140,10 +166,7 @@ public class CamelExtension implements E
Object reference = beanManager.getReference(bean, Object.class, creationalContext);
String beanName = bean.getName();
- List<Method> consumeMethods = adapter.getConsumeMethods();
- for (Method method : consumeMethods) {
- postProcessor.consumerInjection(method, reference, beanName);
- }
+ adapter.initialiseBean(postProcessor, reference, beanName);
}
}
Modified: camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiContextTestSupport.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiContextTestSupport.java?rev=1380193&r1=1380192&r2=1380193&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiContextTestSupport.java (original)
+++ camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiContextTestSupport.java Mon Sep 3 10:39:21 2012
@@ -67,5 +67,15 @@ public abstract class CdiContextTestSupp
protected CamelContext createCamelContext() throws Exception {
return BeanProvider.getContextualReference(CamelContext.class);
}
+
+ @Override
+ protected void applyCamelPostProcessor() throws Exception {
+ // lets do nothing and let CDI do all the injection on this
+
+ // TODO as a workaround until we support backwards compatible injection
+ // on @Produce / @EndpointInject without the use of @Inject
+ // lets keep the old behaviour
+ super.applyCamelPostProcessor();
+ }
}
Added: camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/ProduceInjectTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/ProduceInjectTest.java?rev=1380193&view=auto
==============================================================================
--- camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/ProduceInjectTest.java (added)
+++ camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/ProduceInjectTest.java Mon Sep 3 10:39:21 2012
@@ -0,0 +1,45 @@
+/**
+ * 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 javax.inject.Inject;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.support.EndpointInjectedBean;
+import org.apache.camel.cdi.support.ProduceInjectedBean;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * Test endpoint injection
+ */
+public class ProduceInjectTest extends CdiTestSupport {
+
+ @Inject
+ private ProduceInjectedBean bean;
+
+ @Ignore
+ public void shouldInjectEndpoint() {
+ assertNotNull(bean);
+ ProducerTemplate producer = bean.getProducer();
+ assertNotNull("Could not find injected producer!", producer);
+ assertEquals("producer default URI", "mock://foo", producer.getDefaultEndpoint().getEndpointUri());
+ }
+
+}
Propchange: camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/ProduceInjectTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/support/ProduceInjectedBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/support/ProduceInjectedBean.java?rev=1380193&view=auto
==============================================================================
--- camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/support/ProduceInjectedBean.java (added)
+++ camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/support/ProduceInjectedBean.java Mon Sep 3 10:39:21 2012
@@ -0,0 +1,35 @@
+/**
+ * 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.support;
+
+import javax.inject.Inject;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.cdi.Mock;
+import org.apache.camel.component.mock.MockEndpoint;
+
+public class ProduceInjectedBean {
+
+ @Produce(uri = "mock:foo")
+ private ProducerTemplate producer;
+
+ public ProducerTemplate getProducer() {
+ return producer;
+ }
+}
Propchange: camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/support/ProduceInjectedBean.java
------------------------------------------------------------------------------
svn:eol-style = native