You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/01/15 14:44:17 UTC

[9/9] camel git commit: CAMEL-9201: Improved Camel CDI component

CAMEL-9201: Improved Camel CDI component


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

Branch: refs/heads/master
Commit: 0421c24dfcf992f3296ed746469771e3800200e3
Parents: d3d75d2
Author: Antonin Stefanutti <an...@stefanutti.fr>
Authored: Mon Aug 3 17:54:34 2015 +0200
Committer: Antonin Stefanutti <an...@stefanutti.fr>
Committed: Fri Jan 15 14:04:26 2016 +0100

----------------------------------------------------------------------
 components/camel-cdi/pom.xml                    | 320 ++++++++++++++---
 .../org/apache/camel/cdi/AnnotatedDelegate.java |  85 +++++
 .../camel/cdi/AnnotatedMemberDelegate.java      |  48 +++
 .../camel/cdi/AnnotatedMethodDelegate.java      |  44 +++
 .../apache/camel/cdi/AnnotatedTypeDelegate.java |  59 ++++
 .../org/apache/camel/cdi/AnnotatedWrapper.java  |  84 +++++
 .../java/org/apache/camel/cdi/AnyLiteral.java   |  31 ++
 .../java/org/apache/camel/cdi/BeanDelegate.java |  92 +++++
 .../org/apache/camel/cdi/BeanManagerHelper.java |  58 ++++
 .../camel/cdi/CamelBeanInjectionTarget.java     |  47 +++
 .../camel/cdi/CamelContextDefaultProducer.java  |  57 ++++
 .../camel/cdi/CamelContextInjectionTarget.java  |  35 ++
 .../camel/cdi/CamelContextOsgiProducer.java     |  62 ++++
 .../apache/camel/cdi/CamelContextProducer.java  | 129 +++++++
 .../apache/camel/cdi/CdiBeanManagerHelper.java  |  73 ----
 .../org/apache/camel/cdi/CdiBeanRegistry.java   | 119 -------
 .../camel/cdi/CdiCamelBeanPostProcessor.java    | 120 +++++++
 .../org/apache/camel/cdi/CdiCamelContext.java   |  80 +----
 .../apache/camel/cdi/CdiCamelContextBean.java   | 120 +++++++
 .../camel/cdi/CdiCamelContextNameStrategy.java  |  45 +++
 .../apache/camel/cdi/CdiCamelEnvironment.java   |  66 ++++
 .../org/apache/camel/cdi/CdiCamelExtension.java | 328 ++++++++++++++++++
 .../org/apache/camel/cdi/CdiCamelFactory.java   | 211 ++++++++++++
 .../org/apache/camel/cdi/CdiCamelInjector.java  |  48 +++
 .../org/apache/camel/cdi/CdiCamelRegistry.java  |  98 ++++++
 .../org/apache/camel/cdi/CdiEventComponent.java |  53 +++
 .../org/apache/camel/cdi/CdiEventConsumer.java  |  71 ++++
 .../org/apache/camel/cdi/CdiEventEndpoint.java  | 127 +++++++
 .../org/apache/camel/cdi/CdiEventNotifier.java  |  47 +++
 .../org/apache/camel/cdi/CdiEventProducer.java  |  47 +++
 .../java/org/apache/camel/cdi/CdiInjector.java  |  62 ----
 .../java/org/apache/camel/cdi/CdiSpiHelper.java | 143 ++++++++
 .../camel/cdi/CdiTypeConverterLoader.java       |  33 ++
 .../java/org/apache/camel/cdi/ContextName.java  | 131 ++++---
 .../org/apache/camel/cdi/DefaultLiteral.java    |  31 ++
 .../camel/cdi/DelegateInjectionTarget.java      |  51 +++
 .../org/apache/camel/cdi/DelegateProducer.java  |  51 +++
 .../java/org/apache/camel/cdi/Excluded.java     |  40 +++
 .../camel/cdi/ForwardingObserverMethod.java     |  78 +++++
 .../main/java/org/apache/camel/cdi/Main.java    |  65 ++--
 .../main/java/org/apache/camel/cdi/Mock.java    |  14 +-
 .../java/org/apache/camel/cdi/RoutesXml.java    |   2 +-
 .../src/main/java/org/apache/camel/cdi/Uri.java |  43 +--
 .../main/java/org/apache/camel/cdi/Vetoed.java  |  32 ++
 .../properties/CdiPropertiesComponent.java      |  33 --
 .../properties/CdiPropertiesParser.java         |  47 ---
 .../apache/camel/cdi/internal/BeanAdapter.java  | 133 --------
 .../camel/cdi/internal/CamelContextBean.java    | 138 --------
 .../camel/cdi/internal/CamelContextConfig.java  |  89 -----
 .../camel/cdi/internal/CamelContextMap.java     |  82 -----
 .../camel/cdi/internal/CamelExtension.java      | 342 -------------------
 .../apache/camel/cdi/internal/CamelFactory.java |  86 -----
 .../cdi/internal/DelegateInjectionTarget.java   |  63 ----
 .../src/main/resources/META-INF/LICENSE.txt     | 203 -----------
 .../src/main/resources/META-INF/NOTICE.txt      |  11 -
 .../src/main/resources/META-INF/beans.xml       |  32 +-
 .../javax.enterprise.inject.spi.Extension       |   3 +-
 .../apache/camel/cdi/CamelContextAwareTest.java |  38 ---
 .../camel/cdi/CamelEndpointInjectTest.java      |  46 ---
 .../apache/camel/cdi/CamelExtensionTest.java    |  39 ---
 .../apache/camel/cdi/CdiContextTestSupport.java |  79 -----
 .../org/apache/camel/cdi/CdiTestSupport.java    |  62 ----
 .../camel/cdi/ConsumeStubbedEndpointTest.java   |  55 ---
 .../java/org/apache/camel/cdi/ConsumeTest.java  |  54 ---
 .../EndpointDefinedUsingConfigPropertyTest.java |  79 -----
 .../apache/camel/cdi/EndpointInjectTest.java    |  43 ---
 .../camel/cdi/EndpointNamedInjectTest.java      |  39 ---
 .../camel/cdi/EndpointPropertyInjectTest.java   |  43 ---
 .../apache/camel/cdi/EndpointUriInjectTest.java |  47 ---
 .../camel/cdi/InjectCamelAnnotationsTest.java   |  78 -----
 .../camel/cdi/MockEndpointInjectTest.java       |  45 ---
 .../org/apache/camel/cdi/ProduceInjectTest.java |  45 ---
 .../cdi/RegistryLookupAndInjectorTest.java      |  94 -----
 .../camel/cdi/XmlRoutesFromClassPathTest.java   |  60 ----
 .../apache/camel/cdi/XmlRoutesFromURLTest.java  |  44 ---
 .../apache/camel/cdi/bean/BeanInjectBean.java   |  47 +++
 .../camel/cdi/bean/CamelContextAwareBean.java   |  38 +++
 .../cdi/bean/CamelContextProducerMethod.java    |  40 +++
 .../camel/cdi/bean/ConsumeMethodBean.java       |  38 +++
 .../cdi/bean/CustomLifecycleCamelContext.java   |  52 +++
 .../cdi/bean/CustomPropertiesCamelContext.java  |  32 ++
 .../camel/cdi/bean/DefaultCamelContextBean.java |  28 ++
 .../camel/cdi/bean/EndpointInjectRoute.java     |  35 ++
 .../bean/EndpointInjectWrongContextRoute.java   |  36 ++
 .../camel/cdi/bean/EventConsumingRoute.java     |  65 ++++
 .../cdi/bean/EventConsumingRouteCdi10.java      |  66 ++++
 .../camel/cdi/bean/EventProducingRoute.java     |  65 ++++
 .../cdi/bean/EventProducingRouteCdi10.java      |  66 ++++
 .../camel/cdi/bean/FirstCamelContextBean.java   |  28 ++
 .../FirstCamelContextEndpointInjectRoute.java   |  34 ++
 .../FirstCamelContextEventConsumingRoute.java   |  38 +++
 .../FirstCamelContextEventProducingRoute.java   |  38 +++
 .../FirstCamelContextProduceTemplateBean.java   |  30 ++
 .../FirstCamelContextPropertyInjectBean.java    |  38 +++
 .../camel/cdi/bean/FirstCamelContextRoute.java  |  29 ++
 .../cdi/bean/FirstNamedCamelContextBean.java    |  29 ++
 .../cdi/bean/FirstNamedCamelContextRoute.java   |  29 ++
 .../camel/cdi/bean/InjectedEndpointRoute.java   |  35 ++
 .../cdi/bean/InjectedTypeConverterRoute.java    |  28 ++
 .../apache/camel/cdi/bean/ManualCamelRoute.java |  29 ++
 .../cdi/bean/ManualStartupCamelContext.java     |  37 ++
 .../camel/cdi/bean/MockAnnotationRoute.java     |  41 +++
 .../apache/camel/cdi/bean/NamedCamelBean.java   |  27 ++
 .../camel/cdi/bean/ProduceTemplateBean.java     |  30 ++
 .../camel/cdi/bean/PropertyEndpointRoute.java   |  30 ++
 .../camel/cdi/bean/PropertyInjectBean.java      |  38 +++
 .../camel/cdi/bean/RecipientListMethodBean.java |  34 ++
 .../camel/cdi/bean/SecondCamelContextBean.java  |  33 ++
 .../SecondCamelContextEndpointInjectRoute.java  |  34 ++
 .../SecondCamelContextEventConsumingRoute.java  |  38 +++
 .../SecondCamelContextEventProducingRoute.java  |  38 +++
 .../SecondCamelContextProduceTemplateBean.java  |  30 ++
 .../SecondCamelContextPropertyInjectBean.java   |  38 +++
 .../cdi/bean/SecondNamedCamelContextBean.java   |  29 ++
 .../cdi/bean/SecondNamedCamelContextRoute.java  |  29 ++
 .../apache/camel/cdi/bean/SimpleCamelRoute.java |  40 +++
 .../apache/camel/cdi/bean/UriEndpointRoute.java |  30 ++
 .../properties/PropertiesComponentTest.java     |  53 ---
 .../cdi/converter/InjectedTypeConverter.java    |  42 +++
 .../cdi/expression/ExchangeExpression.java      |  37 ++
 .../org/apache/camel/cdi/pojo/EventPayload.java |  47 +++
 .../camel/cdi/pojo/EventPayloadInteger.java     |  24 ++
 .../camel/cdi/pojo/EventPayloadString.java      |  24 ++
 .../camel/cdi/pojo/TypeConverterInput.java      |  30 ++
 .../camel/cdi/pojo/TypeConverterOutput.java     |  30 ++
 .../camel/cdi/qualifier/BarQualifier.java       |  38 +++
 .../camel/cdi/qualifier/FooQualifier.java       |  38 +++
 .../org/apache/camel/cdi/qualifier/Manual.java  |  34 ++
 .../cdi/rule/ExpectedDeploymentException.java   | 105 ++++++
 .../org/apache/camel/cdi/rule/LogVerifier.java  |  75 ++++
 .../java/org/apache/camel/cdi/store/Item.java   |  85 -----
 .../org/apache/camel/cdi/store/Products.java    |  56 ---
 .../apache/camel/cdi/store/ShoppingBean.java    |  58 ----
 .../cdi/support/CamelEndpointInjectedBean.java  |  38 ---
 .../apache/camel/cdi/support/CdiConfigFile.java |  39 ---
 .../cdi/support/CheeseComponentFactory.java     |  35 --
 .../camel/cdi/support/ContextAwareBean.java     |  39 ---
 .../camel/cdi/support/EndpointInjectedBean.java |  36 --
 .../cdi/support/EndpointUriInjectedBean.java    |  49 ---
 .../EndpointUriPropertyInjectedBean.java        |  40 ---
 .../cdi/support/MockEndpointInjectedBean.java   |  39 ---
 .../camel/cdi/support/NamedEndpointBean.java    |  33 --
 .../camel/cdi/support/ProduceInjectedBean.java  |  40 ---
 .../test/AdvisedMockEndpointProducerTest.java   |  96 ++++++
 .../apache/camel/cdi/test/AdvisedRouteTest.java | 105 ++++++
 .../cdi/test/AmbiguousCamelContextTest.java     |  55 +++
 .../apache/camel/cdi/test/BeanInjectTest.java   |  88 +++++
 .../camel/cdi/test/CamelContextAwareTest.java   |  57 ++++
 .../cdi/test/CamelContextProducerFieldTest.java |  97 ++++++
 .../test/CamelContextProducerMethodTest.java    |  89 +++++
 .../camel/cdi/test/CamelEventEndpointTest.java  | 143 ++++++++
 .../camel/cdi/test/CamelEventNotifierTest.java  | 151 ++++++++
 .../camel/cdi/test/ConsumeMethodTest.java       |  69 ++++
 .../camel/cdi/test/ContextComponentTest.java    |  92 +++++
 .../camel/cdi/test/CustomCamelContextTest.java  |  90 +++++
 .../camel/cdi/test/DefaultCamelContextTest.java |  69 ++++
 .../camel/cdi/test/EndpointInjectTest.java      |  69 ++++
 .../camel/cdi/test/EventComponentTest.java      |  91 +++++
 .../camel/cdi/test/EventEndpointCdi12Test.java  | 277 +++++++++++++++
 .../camel/cdi/test/EventEndpointTest.java       | 282 +++++++++++++++
 .../camel/cdi/test/InjectedEndpointTest.java    |  68 ++++
 .../cdi/test/InjectedTypeConverterTest.java     | 103 ++++++
 .../camel/cdi/test/ManualCamelContextTest.java  | 117 +++++++
 .../apache/camel/cdi/test/MockEndpointTest.java |  84 +++++
 .../cdi/test/MultiCamelContextProducerTest.java | 168 +++++++++
 .../camel/cdi/test/MultiCamelContextTest.java   | 159 +++++++++
 .../test/MultiContextEndpointInjectTest.java    | 137 ++++++++
 .../cdi/test/MultiContextEventEndpointTest.java | 190 +++++++++++
 .../cdi/test/MultiContextEventNotifierTest.java | 300 ++++++++++++++++
 .../test/MultiContextProduceTemplateTest.java   | 157 +++++++++
 .../test/MultiContextPropertyInjectTest.java    | 193 +++++++++++
 .../camel/cdi/test/NamedCamelBeanTest.java      |  75 ++++
 .../camel/cdi/test/NamedCamelContextTest.java   | 114 +++++++
 .../camel/cdi/test/ProduceTemplateTest.java     |  76 +++++
 .../camel/cdi/test/PropertiesLocationTest.java  | 102 ++++++
 .../test/PropertiesMultipleLocationTest.java    |  55 +++
 .../camel/cdi/test/PropertyEndpointTest.java    |  88 +++++
 .../camel/cdi/test/PropertyInjectTest.java      | 101 ++++++
 .../cdi/test/QualifiedCamelContextTest.java     | 100 ++++++
 .../test/QualifiedMultiCamelContextTest.java    | 173 ++++++++++
 .../camel/cdi/test/RawEventEndpointTest.java    | 110 ++++++
 .../camel/cdi/test/RecipientListMethodTest.java |  77 +++++
 .../cdi/test/RouteDefinitionsFromXmlTest.java   |  78 +++++
 .../camel/cdi/test/UndefinedPropertyTest.java   |  83 +++++
 ...UnsatisfiedContextForEndpointInjectTest.java |  58 ++++
 .../cdi/test/UnstoppedCamelContextBeanTest.java |  87 +++++
 .../UnstoppedCamelContextProducerFieldTest.java |  82 +++++
 ...UnstoppedCamelContextProducerMethodTest.java |  88 +++++
 .../apache/camel/cdi/test/UriEndpointTest.java  |  69 ++++
 .../cdi/test/UriQualifierWithContextTest.java   |  90 +++++
 .../camel/cdi/test/UriWithWrongContextTest.java |  78 +++++
 .../src/test/resources/META-INF/beans.xml       |  18 -
 .../test/resources/META-INF/camel.properties    |   1 -
 .../camel-cdi/src/test/resources/bar.properties |  18 +
 .../camel-cdi/src/test/resources/foo.properties |  18 +
 .../src/test/resources/log4j.properties         |  23 +-
 .../src/test/resources/logging.properties       |  50 +++
 .../src/test/resources/placeholder.properties   |  18 +
 .../camel-cdi/src/test/resources/routes.xml     |  28 +-
 components/camel-sjms/pom.xml                   |   2 +-
 examples/camel-example-cdi/pom.xml              |  13 +-
 .../org/apache/camel/example/cdi/MyRoutes.java  |   4 +-
 parent/pom.xml                                  |  16 +-
 .../features/src/main/resources/features.xml    |   4 +-
 tests/camel-itest-cdi/pom.xml                   |  34 +-
 .../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/RoutesContextA.java  |  22 +-
 .../apache/camel/itest/cdi/RoutesContextB.java  |  20 +-
 .../apache/camel/itest/cdi/RoutesContextC.java  |  17 +-
 .../apache/camel/itest/cdi/RoutesContextD.java  |  19 +-
 .../itest/cdi/properties/Camel1Config.java      |  38 ---
 .../itest/cdi/properties/Camel2Config.java      |  38 ---
 .../apache/camel/itest/cdi/CamelCdiTest.java    |  60 ++--
 .../itest/cdi/PropertiesConfigurationTest.java  |  75 ++++
 .../properties/PropertiesConfigurationTest.java |  69 ----
 .../META-INF/maven/archetype-metadata.xml       |   4 +-
 .../main/resources/archetype-resources/pom.xml  |  11 +-
 .../src/main/java/MyRoutes.java                 |   3 +-
 221 files changed, 11054 insertions(+), 3626 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-cdi/pom.xml b/components/camel-cdi/pom.xml
index 74b8635..648670d 100644
--- a/components/camel-cdi/pom.xml
+++ b/components/camel-cdi/pom.xml
@@ -26,136 +26,354 @@
 
   <artifactId>camel-cdi</artifactId>
   <packaging>bundle</packaging>
-  <name>Camel :: CDI</name>
-  <description>Camel Contexts and Dependency Injection (JSR-299) support</description>
+  <name>Camel :: CDI Component</name>
+  <description>Camel Contexts and Dependency Injection Support</description>
 
   <properties>
     <camel.osgi.import>
       !org.apache.camel.cdi.*,
       !org.apache.deltaspike.cdise.api.*,
-      org.apache.deltaspike.core.api.*;resolution:=optional,
       ${camel.osgi.import.defaults},
       *
     </camel.osgi.import>
     <camel.osgi.export.pkg>
-      org.apache.camel.cdi;${camel.osgi.version},
-      org.apache.camel.cdi.internal;${camel.osgi.version},
-      org.apache.camel.cdi.component.*;${camel.osgi.version}
+      org.apache.camel.cdi;${camel.osgi.version}
     </camel.osgi.export.pkg>
     <camel.osgi.provide.capability>
       org.ops4j.pax.cdi.extension; extension=camel-cdi-extension
     </camel.osgi.provide.capability>
-    <camel.osgi.require.capability>
-      osgi.extender;filter:="(osgi.extender=pax.cdi)",
-      org.ops4j.pax.cdi.extension;filter:="(extension=deltaspike-core-api)"
-    </camel.osgi.require.capability>
   </properties>
 
+  <dependencyManagement>
+    <dependencies>
+
+      <!-- test dependencies -->
+
+      <dependency>
+        <groupId>org.jboss.shrinkwrap.descriptors</groupId>
+        <artifactId>shrinkwrap-descriptors-bom</artifactId>
+        <version>${shrinkwrap-descriptors-version}</version>
+        <scope>import</scope>
+        <type>pom</type>
+      </dependency>
+
+      <dependency>
+        <groupId>org.jboss.arquillian</groupId>
+        <artifactId>arquillian-bom</artifactId>
+        <version>${arquillian-version}</version>
+        <scope>import</scope>
+        <type>pom</type>
+      </dependency>
+
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
 
+    <!-- compile dependencies -->
+
     <dependency>
       <groupId>org.apache.camel</groupId>
       <artifactId>camel-core</artifactId>
     </dependency>
 
-    <!-- cdi api -->
-    <dependency>
-      <groupId>javax.enterprise</groupId>
-      <artifactId>cdi-api</artifactId>
-      <version>${cdi-api-version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <!-- DeltaSpike -->
+    <!-- DeltaSpike is only used to provide Main support thus optional -->
     <dependency>
       <groupId>org.apache.deltaspike.core</groupId>
       <artifactId>deltaspike-core-api</artifactId>
       <version>${deltaspike-version}</version>
+      <optional>true</optional>
     </dependency>
 
     <dependency>
-      <groupId>org.apache.deltaspike.core</groupId>
-      <artifactId>deltaspike-core-impl</artifactId>
+      <groupId>org.apache.deltaspike.cdictrl</groupId>
+      <artifactId>deltaspike-cdictrl-api</artifactId>
       <version>${deltaspike-version}</version>
-      <scope>runtime</scope>
+      <optional>true</optional>
     </dependency>
 
-    <!-- only required for the Main -->
+    <!-- provided dependencies -->
+
     <dependency>
-      <groupId>org.apache.deltaspike.cdictrl</groupId>
-      <artifactId>deltaspike-cdictrl-api</artifactId>
-      <version>${deltaspike-version}</version>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-core-osgi</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
       <optional>true</optional>
     </dependency>
 
-    <!-- logging -->
     <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <version>${osgi-version}</version>
+      <scope>provided</scope>
+      <optional>true</optional>
     </dependency>
+
+    <!-- test dependencies -->
+
     <dependency>
       <groupId>org.apache.camel</groupId>
-      <artifactId>camel-test</artifactId>
+      <artifactId>camel-context</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-library</artifactId>
+      <version>${hamcrest-version}</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
       <scope>test</scope>
     </dependency>
+
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>jul-to-slf4j</artifactId>
       <version>${slf4j-version}</version>
       <scope>test</scope>
     </dependency>
-  </dependencies>
 
+    <dependency>
+      <groupId>org.jboss.arquillian.junit</groupId>
+      <artifactId>arquillian-junit-container</artifactId>
+      <version>${arquillian-version}</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.jboss.shrinkwrap.descriptors</groupId>
+      <artifactId>shrinkwrap-descriptors-depchain</artifactId>
+      <type>pom</type>
+      <scope>test</scope>
+    </dependency>
+
+  </dependencies>
 
   <profiles>
     <profile>
-      <id>owb</id>
+      <id>weld-1.0</id>
       <activation>
         <activeByDefault>true</activeByDefault>
       </activation>
+
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <excludes>
+                <exclude>**/*Cdi12Test.java</exclude>
+                <!-- Weld does not resolve observer method based on the runtime type of the event object, e.g. @Observe Long for a Long object fired with Event<Object> -->
+                <exclude>**/RawEventEndpointTest.java</exclude>
+              </excludes>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+
       <dependencies>
+
+        <!-- provided dependencies -->
+
         <dependency>
-          <groupId>org.apache.geronimo.specs</groupId>
-          <artifactId>geronimo-servlet_3.0_spec</artifactId>
+          <groupId>javax.enterprise</groupId>
+          <artifactId>cdi-api</artifactId>
+          <version>${cdi-api-1.0-version}</version>
+          <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+          <groupId>javax.el</groupId>
+          <artifactId>javax.el-api</artifactId>
+          <version>${javax.el-api-version}</version>
+          <scope>provided</scope>
+        </dependency>
+
+        <!-- test dependencies -->
+
+        <dependency>
+          <groupId>org.jboss.weld</groupId>
+          <artifactId>weld-core</artifactId>
+          <version>${weld1-version}</version>
+          <scope>test</scope>
+        </dependency>
+
+        <dependency>
+          <groupId>org.jboss.arquillian.container</groupId>
+          <artifactId>arquillian-weld-se-embedded-1.1</artifactId>
+          <version>${arquillian-weld-se-embedded-version}</version>
+          <scope>test</scope>
+        </dependency>
+
+      </dependencies>
+    </profile>
+
+    <profile>
+      <id>weld-1.2</id>
+
+      <dependencies>
+
+        <!-- provided dependencies -->
+
+        <dependency>
+          <groupId>javax.enterprise</groupId>
+          <artifactId>cdi-api</artifactId>
+          <version>${cdi-api-1.2-version}</version>
+          <scope>provided</scope>
+        </dependency>
+
+        <!-- test dependencies -->
+
+        <dependency>
+          <groupId>org.jboss.weld</groupId>
+          <artifactId>weld-core-impl</artifactId>
+          <version>${weld2-version}</version>
           <scope>test</scope>
         </dependency>
+
         <dependency>
-          <groupId>org.apache.deltaspike.cdictrl</groupId>
-          <artifactId>deltaspike-cdictrl-owb</artifactId>
-          <version>${deltaspike-version}</version>
+          <groupId>org.jboss.arquillian.container</groupId>
+          <artifactId>arquillian-weld-se-embedded-1.1</artifactId>
+          <version>${arquillian-weld-se-embedded-version}</version>
           <scope>test</scope>
         </dependency>
+
+      </dependencies>
+    </profile>
+
+    <profile>
+      <id>owb-1.0</id>
+
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <excludes>
+                <exclude>**/*Cdi12Test.java</exclude>
+                <!-- OWB does not call the InjectionTarget#preDestroy method -->
+                <exclude>**/UnstoppedCamelContext*Test.java</exclude>
+              </excludes>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+
+      <dependencies>
+
+        <!-- provided dependencies -->
+
+        <dependency>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-jcdi_1.0_spec</artifactId>
+          <version>${geronimo-jcdi-1.0-spec-version}</version>
+          <scope>provided</scope>
+        </dependency>
+
         <dependency>
-          <groupId>org.apache.openwebbeans</groupId>
-          <artifactId>openwebbeans-impl</artifactId>
-          <version>${openwebbeans-version}</version>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-atinject_1.0_spec</artifactId>
+          <version>${geronimo-atinject-1.0-spec-version}</version>
+          <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-interceptor_1.1_spec</artifactId>
+          <version>${geronimo-interceptor-1.1-spec-version}</version>
+          <scope>provided</scope>
+        </dependency>
+
+        <!-- test dependencies -->
+
+        <dependency>
+          <groupId>org.apache.openwebbeans.arquillian</groupId>
+          <artifactId>owb-arquillian-standalone</artifactId>
+          <version>${openwebbeans1-version}</version>
           <scope>test</scope>
         </dependency>
+
         <dependency>
           <groupId>org.apache.openwebbeans</groupId>
-          <artifactId>openwebbeans-spi</artifactId>
-          <version>${openwebbeans-version}</version>
+          <artifactId>openwebbeans-impl</artifactId>
+          <version>${openwebbeans1-version}</version>
           <scope>test</scope>
         </dependency>
+
       </dependencies>
     </profile>
 
     <profile>
-      <id>weld2</id>
+      <id>owb-1.2</id>
+
       <dependencies>
+
+        <!-- provided dependencies -->
+
         <dependency>
-          <groupId>org.apache.deltaspike.cdictrl</groupId>
-          <artifactId>deltaspike-cdictrl-weld</artifactId>
-          <version>${deltaspike-version}</version>
-          <scope>test</scope>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-jcdi_1.1_spec</artifactId>
+          <version>${geronimo-jcdi-1.1-spec-version}</version>
+          <scope>provided</scope>
         </dependency>
+
         <dependency>
-          <groupId>org.jboss.weld.se</groupId>
-          <artifactId>weld-se-core</artifactId>
-          <version>${weld2-version}</version>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-atinject_1.0_spec</artifactId>
+          <version>${geronimo-atinject-1.0-spec-version}</version>
+          <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-annotation_1.2_spec</artifactId>
+          <version>${geronimo-annotation-1.2-spec-version}</version>
+          <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-interceptor_1.2_spec</artifactId>
+          <version>${geronimo-interceptor-1.2-spec-version}</version>
           <scope>provided</scope>
         </dependency>
+
+        <!-- test dependencies -->
+
+        <dependency>
+          <groupId>org.apache.openwebbeans.arquillian</groupId>
+          <artifactId>owb-arquillian-standalone</artifactId>
+          <version>${openwebbeans-version}</version>
+          <scope>test</scope>
+        </dependency>
+
+        <dependency>
+          <groupId>org.apache.openwebbeans</groupId>
+          <artifactId>openwebbeans-impl</artifactId>
+          <version>${openwebbeans-version}</version>
+          <scope>test</scope>
+        </dependency>
+
       </dependencies>
     </profile>
 

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedDelegate.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedDelegate.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedDelegate.java
new file mode 100644
index 0000000..ccd4989
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedDelegate.java
@@ -0,0 +1,85 @@
+/**
+ * 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.Annotation;
+import java.lang.reflect.Type;
+import java.util.HashSet;
+import java.util.Set;
+import javax.enterprise.inject.spi.Annotated;
+
+class AnnotatedDelegate implements Annotated {
+
+    private final Annotated delegate;
+
+    private final Set<Annotation> annotations;
+
+    AnnotatedDelegate(Annotated delegate, Set<Annotation> annotations) {
+        this.delegate = delegate;
+        this.annotations = new HashSet<>(annotations);
+    }
+
+    AnnotatedDelegate(Annotated delegate) {
+        this.delegate = delegate;
+        this.annotations = delegate.getAnnotations();
+    }
+
+    @Override
+    public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
+        for (Annotation annotation : annotations) {
+            if (annotation.annotationType().equals(annotationType)) {
+                return annotationType.cast(annotation);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Set<Annotation> getAnnotations() {
+        return annotations;
+    }
+
+    @Override
+    public Type getBaseType() {
+        return delegate.getBaseType();
+    }
+
+    @Override
+    public Set<Type> getTypeClosure() {
+        return delegate.getTypeClosure();
+    }
+
+    @Override
+    public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
+        return getAnnotation(annotationType) != null;
+    }
+
+    @Override
+    public String toString() {
+        return delegate.toString();
+    }
+    
+    @Override
+    public int hashCode() {
+        return delegate.hashCode();
+    }
+    
+    @Override
+    public boolean equals(Object object) {
+        return delegate.equals(object);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedMemberDelegate.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedMemberDelegate.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedMemberDelegate.java
new file mode 100644
index 0000000..d33732c
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedMemberDelegate.java
@@ -0,0 +1,48 @@
+/**
+ * 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.Annotation;
+import java.lang.reflect.Member;
+import java.util.Set;
+import javax.enterprise.inject.spi.AnnotatedMember;
+import javax.enterprise.inject.spi.AnnotatedType;
+
+class AnnotatedMemberDelegate<T> extends AnnotatedDelegate implements AnnotatedMember<T> {
+
+    private final AnnotatedMember<T> delegate;
+    
+    AnnotatedMemberDelegate(AnnotatedMember<T> delegate, Set<Annotation> annotations) {
+        super(delegate, annotations);
+        this.delegate = delegate;
+    }
+
+    @Override
+    public AnnotatedType<T> getDeclaringType() {
+        return delegate.getDeclaringType();
+    }
+
+    @Override
+    public Member getJavaMember() {
+        return delegate.getJavaMember();
+    }
+
+    @Override
+    public boolean isStatic() {
+        return delegate.isStatic();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedMethodDelegate.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedMethodDelegate.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedMethodDelegate.java
new file mode 100644
index 0000000..6e0b5df
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedMethodDelegate.java
@@ -0,0 +1,44 @@
+/**
+ * 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.Annotation;
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Set;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedParameter;
+
+final class AnnotatedMethodDelegate<T> extends AnnotatedMemberDelegate<T> implements AnnotatedMethod<T> {
+    
+    private final AnnotatedMethod<T> delegate;
+    
+    AnnotatedMethodDelegate(AnnotatedMethod<T> delegate, Set<Annotation> annotations) {
+        super(delegate, annotations);
+        this.delegate = delegate;
+    }
+
+    @Override
+    public List<AnnotatedParameter<T>> getParameters() {
+        return delegate.getParameters();
+    }
+
+    @Override
+    public Method getJavaMember() {
+        return delegate.getJavaMember();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedTypeDelegate.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedTypeDelegate.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedTypeDelegate.java
new file mode 100644
index 0000000..8d43662
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedTypeDelegate.java
@@ -0,0 +1,59 @@
+/**
+ * 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.util.HashSet;
+import java.util.Set;
+import javax.enterprise.inject.spi.AnnotatedConstructor;
+import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedType;
+
+final class AnnotatedTypeDelegate<T> extends AnnotatedDelegate implements AnnotatedType<T> {
+
+    private final Set<AnnotatedMethod<? super T>> methods;
+
+    private final AnnotatedType<T> delegate;
+
+    AnnotatedTypeDelegate(AnnotatedType<T> delegate, Set<AnnotatedMethod<? super T>> methods) {
+        super(delegate);
+        this.delegate = delegate;
+        this.methods = new HashSet<>(delegate.getMethods());
+        this.methods.removeAll(methods);
+        this.methods.addAll(methods);
+    }
+
+    @Override
+    public Set<AnnotatedConstructor<T>> getConstructors() {
+        return delegate.getConstructors();
+    }
+
+    @Override
+    public Set<AnnotatedField<? super T>> getFields() {
+        return delegate.getFields();
+    }
+
+    @Override
+    public Class<T> getJavaClass() {
+        return delegate.getJavaClass();
+    }
+
+    @Override
+    public Set<AnnotatedMethod<? super T>> getMethods() {
+        return methods;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedWrapper.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedWrapper.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedWrapper.java
new file mode 100644
index 0000000..013738a
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedWrapper.java
@@ -0,0 +1,84 @@
+/**
+ * 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.Annotation;
+import java.lang.reflect.Type;
+import java.util.Set;
+import javax.enterprise.inject.spi.Annotated;
+
+// This class is used as a work-around to OWB-1099
+final class AnnotatedWrapper implements Annotated {
+
+    private final Annotated delegate;
+
+    AnnotatedWrapper(Annotated delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    public Type getBaseType() {
+        return delegate.getBaseType();
+    }
+
+    @Override
+    public Set<Type> getTypeClosure() {
+        return delegate.getTypeClosure();
+    }
+
+    @Override
+    public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
+        return delegate.getAnnotation(annotationType);
+    }
+
+    @Override
+    public Set<Annotation> getAnnotations() {
+        return delegate.getAnnotations();
+    }
+
+    @Override
+    public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
+        return delegate.isAnnotationPresent(annotationType);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (object == null || getClass() != object.getClass()) {
+            return false;
+        }
+
+        AnnotatedWrapper that = (AnnotatedWrapper) object;
+
+        if (!getBaseType().equals(that.getBaseType())) {
+            return false;
+        } else if (!getTypeClosure().equals(that.getTypeClosure())) {
+            return false;
+        }
+        return getAnnotations().equals(that.getAnnotations());
+    }
+
+    @Override
+    public int hashCode() {
+        int result = getBaseType() != null ? getBaseType().hashCode() : 0;
+        result = 31 * result + (getTypeClosure() != null ? getTypeClosure().hashCode() : 0);
+        result = 31 * result + (getAnnotations() != null ? getAnnotations().hashCode() : 0);
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnyLiteral.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnyLiteral.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnyLiteral.java
new file mode 100755
index 0000000..decff53
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnyLiteral.java
@@ -0,0 +1,31 @@
+/**
+ * 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.enterprise.inject.Any;
+import javax.enterprise.util.AnnotationLiteral;
+
+@Vetoed
+final class AnyLiteral extends AnnotationLiteral<Any> implements Any {
+
+    static final Any INSTANCE = new AnyLiteral();
+
+    private static final long serialVersionUID = 1L;
+
+    private AnyLiteral() {
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/BeanDelegate.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/BeanDelegate.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/BeanDelegate.java
new file mode 100644
index 0000000..c1592cd
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/BeanDelegate.java
@@ -0,0 +1,92 @@
+/**
+ * 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.Annotation;
+import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.Set;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+final class BeanDelegate<T> implements Bean<T> {
+
+    private final Bean<T> delegate;
+
+    private final Set<Annotation> qualifiers;
+
+    BeanDelegate(Bean<T> delegate, Set<? extends Annotation> qualifiers) {
+        this.delegate = delegate;
+        this.qualifiers = Collections.unmodifiableSet(qualifiers);
+    }
+
+    @Override
+    public Set<Type> getTypes() {
+        return delegate.getTypes();
+    }
+
+    @Override
+    public Set<Annotation> getQualifiers() {
+        return qualifiers;
+    }
+
+    @Override
+    public Class<? extends Annotation> getScope() {
+        return delegate.getScope();
+    }
+
+    @Override
+    public String getName() {
+        return delegate.getName();
+    }
+
+    @Override
+    public Set<Class<? extends Annotation>> getStereotypes() {
+        return delegate.getStereotypes();
+    }
+
+    @Override
+    public boolean isAlternative() {
+        return delegate.isAlternative();
+    }
+
+    @Override
+    public Class<?> getBeanClass() {
+        return delegate.getBeanClass();
+    }
+
+    @Override
+    public Set<InjectionPoint> getInjectionPoints() {
+        return delegate.getInjectionPoints();
+    }
+
+    @Override
+    public boolean isNullable() {
+        return delegate.isNullable();
+    }
+
+    @Override
+    public T create(CreationalContext<T> creationalContext) {
+        return delegate.create(creationalContext);
+    }
+
+    @Override
+    public void destroy(T instance, CreationalContext<T> creationalContext) {
+        delegate.destroy(instance, creationalContext);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/BeanManagerHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/BeanManagerHelper.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/BeanManagerHelper.java
new file mode 100644
index 0000000..47118bf
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/BeanManagerHelper.java
@@ -0,0 +1,58 @@
+/**
+ * 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.Annotation;
+import java.util.HashSet;
+import java.util.Set;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+
+@Vetoed
+final class BeanManagerHelper {
+
+    private BeanManagerHelper() {
+    }
+
+    static <T> Set<T> getReferencesByType(BeanManager manager, Class<T> type, Annotation... qualifiers) {
+        Set<T> references = new HashSet<>();
+        for (Bean<?> bean : manager.getBeans(type, qualifiers)) {
+            references.add(getReference(manager, type, bean));
+        }
+        return references;
+    }
+
+    static <T> T getReferenceByName(BeanManager manager, String name, Class<T> type) {
+        Set<Bean<?>> beans = manager.getBeans(name);
+        if (beans == null || beans.isEmpty()) {
+            return null;
+        }
+        return getReference(manager, type, manager.resolve(beans));
+    }
+
+    static <T> T getReferenceByType(BeanManager manager, Class<T> type, Annotation... qualifiers) {
+        Set<Bean<?>> beans = manager.getBeans(type, qualifiers);
+        if (beans == null || beans.isEmpty()) {
+            return null;
+        }
+        return getReference(manager, type, manager.resolve(beans));
+    }
+
+    static <T> T getReference(BeanManager manager, Class<T> type, Bean<?> bean) {
+        return type.cast(manager.getReference(bean, type, manager.createCreationalContext(bean)));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelBeanInjectionTarget.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelBeanInjectionTarget.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelBeanInjectionTarget.java
new file mode 100644
index 0000000..9a78e61
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelBeanInjectionTarget.java
@@ -0,0 +1,47 @@
+/**
+ * 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.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.InjectionException;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.InjectionTarget;
+
+final class CamelBeanInjectionTarget<T> extends DelegateInjectionTarget<T> implements InjectionTarget<T> {
+
+    private final InjectionTarget<T> delegate;
+
+    private final CdiCamelBeanPostProcessor processor;
+
+    CamelBeanInjectionTarget(InjectionTarget<T> delegate, BeanManager manager) {
+        super(delegate);
+        this.delegate = delegate;
+        this.processor = new CdiCamelBeanPostProcessor(manager);
+    }
+
+    @Override
+    public void inject(T instance, CreationalContext<T> ctx) {
+        super.inject(instance, ctx);
+        try {
+            // TODO: see how to retrieve the bean name
+            processor.postProcessBeforeInitialization(instance, instance.getClass().getName());
+            processor.postProcessAfterInitialization(instance, instance.getClass().getName());
+        } catch (Exception cause) {
+            throw new InjectionException("Camel annotations post processing of [" + delegate + "] failed!", cause);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextDefaultProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextDefaultProducer.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextDefaultProducer.java
new file mode 100644
index 0000000..4af15e7
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextDefaultProducer.java
@@ -0,0 +1,57 @@
+/**
+ * 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.util.Collections;
+import java.util.Set;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.InjectionTarget;
+
+import org.apache.camel.impl.DefaultCamelContext;
+
+@Vetoed
+final class CamelContextDefaultProducer implements InjectionTarget<DefaultCamelContext> {
+
+    @Override
+    public DefaultCamelContext produce(CreationalContext<DefaultCamelContext> ctx) {
+        DefaultCamelContext context = new DefaultCamelContext();
+        context.setNameStrategy(new CdiCamelContextNameStrategy());
+        return context;
+    }
+
+    @Override
+    public void inject(DefaultCamelContext instance, CreationalContext<DefaultCamelContext> ctx) {
+    }
+
+    @Override
+    public void postConstruct(DefaultCamelContext instance) {
+    }
+
+    @Override
+    public void preDestroy(DefaultCamelContext instance) {
+    }
+
+    @Override
+    public void dispose(DefaultCamelContext instance) {
+    }
+
+    @Override
+    public Set<InjectionPoint> getInjectionPoints() {
+        return Collections.emptySet();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextInjectionTarget.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextInjectionTarget.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextInjectionTarget.java
new file mode 100644
index 0000000..4b84eed
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextInjectionTarget.java
@@ -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;
+
+import javax.enterprise.inject.spi.InjectionTarget;
+import javax.enterprise.inject.spi.Producer;
+
+import org.apache.camel.CamelContext;
+
+final class CamelContextInjectionTarget<T extends CamelContext> extends DelegateInjectionTarget<T> implements InjectionTarget<T> {
+
+    CamelContextInjectionTarget(InjectionTarget<T> target, Producer<T> producer) {
+        super(target, producer);
+    }
+
+    @Override
+    public void preDestroy(T instance) {
+        super.preDestroy(instance);
+        super.dispose(instance);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextOsgiProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextOsgiProducer.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextOsgiProducer.java
new file mode 100644
index 0000000..d780255
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextOsgiProducer.java
@@ -0,0 +1,62 @@
+/**
+ * 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.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.InjectionException;
+import javax.enterprise.inject.spi.Producer;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.core.osgi.OsgiCamelContextHelper;
+import org.apache.camel.core.osgi.OsgiCamelContextPublisher;
+import org.apache.camel.core.osgi.utils.BundleContextUtils;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultCamelContextNameStrategy;
+import org.apache.camel.spi.CamelContextNameStrategy;
+import org.osgi.framework.BundleContext;
+
+final class CamelContextOsgiProducer<T extends CamelContext> extends DelegateProducer<T> {
+
+    CamelContextOsgiProducer(Producer<T> delegate) {
+        super(delegate);
+    }
+
+    @Override
+    public T produce(CreationalContext<T> ctx) {
+        T context = super.produce(ctx);
+
+        // Register the context in the OSGi registry
+        BundleContext bundle = BundleContextUtils.getBundleContext(getClass());
+        context.getManagementStrategy().addEventNotifier(new OsgiCamelContextPublisher(bundle));
+
+        if (!(context instanceof DefaultCamelContext)) {
+            // Fail fast for the time being to avoid side effects by some methods get declared on the CamelContext interface
+            throw new InjectionException("Camel CDI requires Camel context [" + context.getName() + "] to be a subtype of DefaultCamelContext");
+        }
+
+        DefaultCamelContext adapted = context.adapt(DefaultCamelContext.class);
+        adapted.setRegistry(OsgiCamelContextHelper.wrapRegistry(context, context.getRegistry(), bundle));
+        CamelContextNameStrategy strategy = context.getNameStrategy();
+        OsgiCamelContextHelper.osgiUpdate(adapted, bundle);
+        // FIXME: the above call should not override explicit strategies provided by the end user or should decorate them instead of overriding them completely
+        if (!(strategy instanceof DefaultCamelContextNameStrategy)) {
+            context.setNameStrategy(strategy);
+        }
+
+        return context;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextProducer.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextProducer.java
new file mode 100644
index 0000000..ebf80eb
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CamelContextProducer.java
@@ -0,0 +1,129 @@
+/**
+ * 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.beans.Introspector;
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.InjectionException;
+import javax.enterprise.inject.spi.Annotated;
+import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.Producer;
+import javax.inject.Named;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultCamelContextNameStrategy;
+import org.apache.camel.impl.ExplicitCamelContextNameStrategy;
+import org.apache.camel.spi.CamelContextNameStrategy;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+final class CamelContextProducer<T extends CamelContext> extends DelegateProducer<T> {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    private final Annotated annotated;
+
+    private final BeanManager manager;
+
+    private final CdiCamelExtension extension;
+
+    CamelContextProducer(Producer<T> delegate, Annotated annotated, BeanManager manager, CdiCamelExtension extension) {
+        super(delegate);
+        this.annotated = annotated;
+        this.manager = manager;
+        this.extension = extension;
+    }
+
+    @Override
+    public T produce(CreationalContext<T> ctx) {
+        T context = super.produce(ctx);
+
+        // Do not override the name if it's been already set (in the bean constructor for example)
+        if (annotated != null && context.getNameStrategy() instanceof DefaultCamelContextNameStrategy) {
+            context.setNameStrategy(nameStrategy(annotated));
+        }
+
+        // Add bean registry and Camel injector
+        if (context instanceof DefaultCamelContext) {
+            DefaultCamelContext adapted = context.adapt(DefaultCamelContext.class);
+            adapted.setRegistry(new CdiCamelRegistry(manager));
+            adapted.setInjector(new CdiCamelInjector(context.getInjector(), manager));
+        } else {
+            // Fail fast for the time being to avoid side effects by the time these two methods get declared on the CamelContext interface
+            throw new InjectionException("Camel CDI requires Camel context [" + context.getName() + "] to be a subtype of DefaultCamelContext");
+        }
+
+        // Add event notifier if at least one observer is present
+        Set<Annotation> events = new HashSet<>(extension.getObserverEvents());
+        // Annotated must be wrapped because of OWB-1099
+        Collection<Annotation> qualifiers = annotated != null ? extension.getContextBean(new AnnotatedWrapper(annotated)).getQualifiers() : Arrays.asList(AnyLiteral.INSTANCE, DefaultLiteral.INSTANCE);
+        events.retainAll(qualifiers);
+        if (!events.isEmpty()) {
+            context.getManagementStrategy().addEventNotifier(new CdiEventNotifier(manager, qualifiers));
+        }
+
+        return context;
+    }
+
+    @Override
+    public void dispose(T context) {
+        super.dispose(context);
+
+        if (!context.getStatus().isStopped()) {
+            logger.info("Camel CDI is stopping Camel context [{}]", context.getName());
+            try {
+                context.stop();
+            } catch (Exception cause) {
+                throw ObjectHelper.wrapRuntimeCamelException(cause);
+            }
+        }
+    }
+
+    private static CamelContextNameStrategy nameStrategy(Annotated annotated) {
+        if (annotated.isAnnotationPresent(ContextName.class)) {
+            return new ExplicitCamelContextNameStrategy(annotated.getAnnotation(ContextName.class).value());
+        } else if (annotated.isAnnotationPresent(Named.class)) {
+            // TODO: support stereotype with empty @Named annotation
+            String name = annotated.getAnnotation(Named.class).value();
+            if (name.isEmpty()) {
+                if (annotated instanceof AnnotatedField) {
+                    name = ((AnnotatedField) annotated).getJavaMember().getName();
+                } else if (annotated instanceof AnnotatedMethod) {
+                    name = ((AnnotatedMethod) annotated).getJavaMember().getName();
+                    if (name.startsWith("get")) {
+                        name = Introspector.decapitalize(name.substring(3));
+                    }
+                } else {
+                    name = Introspector.decapitalize(CdiSpiHelper.getRawType(annotated.getBaseType()).getSimpleName());
+                }
+            }
+            return new ExplicitCamelContextNameStrategy(name);
+        } else {
+            // Use a specific naming strategy for Camel CDI as the default one increments the suffix for each CDI proxy created
+            return new CdiCamelContextNameStrategy();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiBeanManagerHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiBeanManagerHelper.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiBeanManagerHelper.java
deleted file mode 100644
index 91ecbd3..0000000
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiBeanManagerHelper.java
+++ /dev/null
@@ -1,73 +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.cdi;
-
-import java.util.Set;
-import javax.enterprise.context.spi.CreationalContext;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-
-/**
- * To make looking up beans in CDI easier
- */
-public final class CdiBeanManagerHelper {
-
-    private CdiBeanManagerHelper() {
-    }
-
-    /**
-     * To lookup a bean by a type
-     */
-    public static <T> T lookupBeanByType(BeanManager beanManager, Class<T> type) {
-        Set<Bean<?>> beans = beanManager.getBeans(type);
-        if (!beans.isEmpty()) {
-            Bean<?> bean = beanManager.resolve(beans);
-            CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean);
-            Object result = beanManager.getReference(bean, type, creationalContext);
-            if (result != null) {
-                return type.cast(result);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * To lookup a bean by a name
-     */
-    public static Object lookupBeanByName(BeanManager beanManager, String name) {
-        return lookupBeanByNameAndType(beanManager, name, Object.class);
-    }
-
-    /**
-     * To lookup a bean by name and type
-     */
-    public static <T> T lookupBeanByNameAndType(BeanManager beanManager, String name, Class<T> type) {
-        Set<Bean<?>> beans = beanManager.getBeans(name);
-        if (!beans.isEmpty()) {
-            Bean<?> bean = beanManager.resolve(beans);
-            CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean);
-            Object result = beanManager.getReference(bean, type, creationalContext);
-            if (result != null) {
-                return type.cast(result);
-            }
-        }
-
-        return null;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiBeanRegistry.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiBeanRegistry.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiBeanRegistry.java
deleted file mode 100644
index 4d131a9..0000000
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiBeanRegistry.java
+++ /dev/null
@@ -1,119 +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.cdi;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-
-import org.apache.camel.spi.Registry;
-import org.apache.camel.util.ObjectHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * CdiBeanRegistry used by Camel to perform lookup into the CDI {@link javax.enterprise.inject.spi.BeanManager}.
- */
-public class CdiBeanRegistry implements Registry {
-    private static final Logger LOG = LoggerFactory.getLogger(CdiBeanRegistry.class);
-
-    private final BeanManager beanManager;
-
-    public CdiBeanRegistry(BeanManager beanManager) {
-        this.beanManager = beanManager;
-    }
-
-    @Override
-    public Object lookupByName(final String name) {
-        ObjectHelper.notEmpty(name, "name");
-        LOG.trace("Looking up bean with name {}", name);
-
-        return CdiBeanManagerHelper.lookupBeanByName(beanManager, name);
-    }
-
-    @Override
-    public <T> T lookupByNameAndType(final String name, final Class<T> type) {
-        ObjectHelper.notEmpty(name, "name");
-        ObjectHelper.notNull(type, "type");
-
-        LOG.trace("Looking up bean with name {} of type {}", name, type);
-        return CdiBeanManagerHelper.lookupBeanByNameAndType(beanManager, name, type);
-    }
-
-    @Override
-    public <T> Map<String, T> findByTypeWithName(final Class<T> type) {
-        ObjectHelper.notNull(type, "type");
-
-        LOG.trace("Lookups based of type {}", type);
-        Map<String, T> beans = new HashMap<String, T>();
-        Set<Bean<?>> definitions = beanManager.getBeans(type);
-
-        if (definitions == null) {
-            return beans;
-        }
-        for (Bean<?> bean : definitions) {
-            if (bean.getName() != null) {
-                T obj = CdiBeanManagerHelper.lookupBeanByNameAndType(beanManager, bean.getName(), type);
-                beans.put(bean.getName(), obj);
-            }
-        }
-        return beans;
-    }
-
-    @Override
-    public <T> Set<T> findByType(Class<T> type) {
-        ObjectHelper.notNull(type, "type");
-
-        LOG.trace("Lookups based of type {}", type);
-        Set<T> beans = new HashSet<T>();
-        Set<Bean<?>> definitions = beanManager.getBeans(type);
-
-        if (definitions == null) {
-            return beans;
-        }
-        for (Bean<?> bean : definitions) {
-            if (bean.getName() != null) {
-                T obj = CdiBeanManagerHelper.lookupBeanByNameAndType(beanManager, bean.getName(), type);
-                beans.add(obj);
-            }
-        }
-        return beans;
-    }
-
-    @Override
-    public Object lookup(String name) {
-        return lookupByName(name);
-    }
-
-    @Override
-    public <T> T lookup(String name, Class<T> type) {
-        return lookupByNameAndType(name, type);
-    }
-
-    @Override
-    public <T> Map<String, T> lookupByType(Class<T> type) {
-        return findByTypeWithName(type);
-    }
-
-    @Override
-    public String toString() {
-        return "CdiRegistry[" + System.identityHashCode(this) + "]";
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelBeanPostProcessor.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelBeanPostProcessor.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelBeanPostProcessor.java
new file mode 100644
index 0000000..85284fc
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelBeanPostProcessor.java
@@ -0,0 +1,120 @@
+/**
+ * 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.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+import javax.enterprise.inject.InjectionException;
+import javax.enterprise.inject.UnsatisfiedResolutionException;
+import javax.enterprise.inject.spi.BeanManager;
+
+import org.apache.camel.BeanInject;
+import org.apache.camel.CamelContext;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Produce;
+import org.apache.camel.PropertyInject;
+import org.apache.camel.impl.CamelPostProcessorHelper;
+import org.apache.camel.impl.DefaultCamelBeanPostProcessor;
+import org.apache.camel.util.ReflectionHelper;
+
+@Vetoed
+final class CdiCamelBeanPostProcessor extends DefaultCamelBeanPostProcessor {
+
+    private final BeanManager manager;
+
+    private final Map<String, CamelPostProcessorHelper> postProcessorHelpers = new HashMap<>();
+
+    // TODO: proper support for multi Camel contexts and custom context qualifiers
+    CdiCamelBeanPostProcessor(BeanManager manager) {
+        this.manager = manager;
+    }
+
+    protected void injectFields(final Object bean, final String beanName) {
+        ReflectionHelper.doWithFields(bean.getClass(), new ReflectionHelper.FieldCallback() {
+            public void doWith(Field field) throws IllegalAccessException {
+                PropertyInject propertyInject = field.getAnnotation(PropertyInject.class);
+                if (propertyInject != null) {
+                    try {
+                        injectFieldProperty(field, propertyInject.value(), propertyInject.defaultValue(), propertyInject.context(), bean, beanName);
+                    } catch (Exception cause) {
+                        throw new InjectionException("Injection of [" + propertyInject + "] for field [" + field + "] failed!", cause);
+                    }
+                }
+
+                BeanInject beanInject = field.getAnnotation(BeanInject.class);
+                // TODO: proper support for multi Camel contexts
+                if (beanInject != null && getPostProcessorHelper().matchContext(beanInject.context())) {
+                    try {
+                        injectFieldBean(field, beanInject.value(), bean, beanName);
+                    } catch (Exception cause) {
+                        throw new InjectionException("Injection of [" + beanInject + "] for field [" + field + "] failed!", cause);
+                    }
+                }
+
+                EndpointInject endpointInject = field.getAnnotation(EndpointInject.class);
+                if (endpointInject != null) {
+                    try {
+                        injectField(field, endpointInject.uri(), endpointInject.ref(), endpointInject.property(), endpointInject.context(), bean, beanName);
+                    } catch (Exception cause) {
+                        throw new InjectionException("Injection of [" + endpointInject + "] for field [" + field + "] failed!", cause);
+                    }
+                }
+
+                Produce produce = field.getAnnotation(Produce.class);
+                if (produce != null) {
+                    try {
+                        injectField(field, produce.uri(), produce.ref(), produce.property(), produce.context(), bean, beanName);
+                    } catch (Exception cause) {
+                        throw new InjectionException("Injection of [" + produce + "] for field [" + field + "] failed!", cause);
+                    }
+                }
+            }
+        });
+    }
+
+    private void injectField(Field field, String uri, String ref, String property, String context, Object bean, String beanName) {
+        ReflectionHelper.setField(field, bean, getPostProcessorHelper(context).getInjectionValue(field.getType(), uri, ref, property, field.getName(), bean, beanName));
+    }
+
+    private void injectFieldProperty(Field field, String property, String defaultValue, String context, Object bean, String beanName) {
+        ReflectionHelper.setField(field, bean, getPostProcessorHelper(context).getInjectionPropertyValue(field.getType(), property, defaultValue, field.getName(), bean, beanName));
+    }
+
+    private CamelPostProcessorHelper getPostProcessorHelper(String contextName) {
+        CamelPostProcessorHelper helper = postProcessorHelpers.get(contextName);
+        if (helper == null) {
+            CamelContext context = getOrLookupCamelContext(contextName);
+            if (context == null) {
+                throw new UnsatisfiedResolutionException("No Camel context with name [" + contextName + "] is deployed!");
+            }
+            helper = new CamelPostProcessorHelper(context);
+            postProcessorHelpers.put(contextName, helper);
+        }
+        return helper;
+    }
+
+    private CamelContext getOrLookupCamelContext(String contextName) {
+        // TODO: proper support for custom context qualifiers
+        return BeanManagerHelper.getReferenceByType(manager, CamelContext.class, contextName.isEmpty() ? DefaultLiteral.INSTANCE : new ContextName.Literal(contextName));
+    }
+
+    @Override
+    public CamelContext getOrLookupCamelContext() {
+        return BeanManagerHelper.getReferenceByType(manager, CamelContext.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContext.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContext.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContext.java
old mode 100644
new mode 100755
index df603c7..f5f775d
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContext.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContext.java
@@ -16,77 +16,23 @@
  */
 package org.apache.camel.cdi;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import javax.enterprise.inject.Instance;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.inject.Inject;
-
 import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.spi.Injector;
-import org.apache.camel.spi.Registry;
-import org.apache.camel.util.ObjectHelper;
 
 /**
- * CDI {@link org.apache.camel.CamelContext} class.
+ * CDI {@link org.apache.camel.CamelContext} class that can be extended
+ * to declare custom Camel context beans. Camel CDI is capable of managing
+ * any bean that implements {@code org.apache.camel.CamelContext},
+ * so that directly extending {@link org.apache.camel.impl.DefaultCamelContext}
+ * is an option to avoid having to depend on Camel CDI specific API, e.g.:
+ *
+ * <pre><code>
+ * {@literal @}ApplicationScoped
+ * {@literal @}ContextName("foo")
+ * public class FooCamelContext extends DefaultCamelContext {
+ * }
+ * </code></pre>
  */
+@Vetoed
 public class CdiCamelContext extends DefaultCamelContext {
 
-    private BeanManager beanManager;
-
-    public CdiCamelContext() {
-    }
-
-    @Inject
-    public void setBeanManager(Instance<BeanManager> beanManager) {
-        this.beanManager = beanManager.get();
-    }
-
-    @Inject
-    public void setRegistry(Instance<Registry> instance) {
-        if (isSingular(instance)) {
-            setRegistry(instance.get());
-        }
-    }
-
-    @Inject
-    public void setInjector(Instance<Injector> instance) {
-        if (isSingular(instance)) {
-            setInjector(instance.get());
-        }
-    }
-
-    private <T> boolean isSingular(Instance<T> instance) {
-        return !instance.isUnsatisfied() && !instance.isAmbiguous();
-    }
-
-    @PostConstruct
-    @Override
-    public void start() {
-        // make sure to use cdi capable bean registry and injector
-        if (!(getRegistry() instanceof CdiBeanRegistry)) {
-            setRegistry(new CdiBeanRegistry(beanManager));
-        }
-
-        if (!(getInjector() instanceof CdiInjector)) {
-            setInjector(new CdiInjector(getInjector()));
-        }
-
-        try {
-            super.start();
-        } catch (Exception e) {
-            throw ObjectHelper.wrapRuntimeCamelException(e);
-        }
-    }
-
-    @PreDestroy
-    @Override
-    public void stop() {
-        try {
-            super.stop();
-        } catch (Exception e) {
-            throw ObjectHelper.wrapRuntimeCamelException(e);
-        }
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/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
new file mode 100644
index 0000000..08338a2
--- /dev/null
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContextBean.java
@@ -0,0 +1,120 @@
+/**
+ * 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.Annotation;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+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 javax.enterprise.inject.spi.PassivationCapable;
+
+import org.apache.camel.impl.DefaultCamelContext;
+
+final class CdiCamelContextBean implements Bean<DefaultCamelContext>, PassivationCapable {
+
+    private final Set<Annotation> qualifiers;
+
+    private final Set<Type> types;
+
+    private final InjectionTarget<DefaultCamelContext> target;
+
+    CdiCamelContextBean(BeanManager manager, InjectionTarget<DefaultCamelContext> target) {
+        this.qualifiers = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(AnyLiteral.INSTANCE, DefaultLiteral.INSTANCE)));
+        this.types = Collections.unmodifiableSet(manager.createAnnotatedType(DefaultCamelContext.class).getTypeClosure());
+        this.target = target;
+    }
+
+    @Override
+    public Class<? extends Annotation> getScope() {
+        return ApplicationScoped.class;
+    }
+
+    @Override
+    public Set<Annotation> getQualifiers() {
+        return qualifiers;
+    }
+
+    @Override
+    public DefaultCamelContext create(CreationalContext<DefaultCamelContext> creational) {
+        DefaultCamelContext context = target.produce(creational);
+        target.inject(context, creational);
+        target.postConstruct(context);
+        creational.push(context);
+        return context;
+    }
+
+    @Override
+    public void destroy(DefaultCamelContext instance, CreationalContext<DefaultCamelContext> creational) {
+        target.preDestroy(instance);
+        target.dispose(instance);
+        creational.release();
+    }
+
+    @Override
+    public Class<DefaultCamelContext> getBeanClass() {
+        return DefaultCamelContext.class;
+    }
+
+    @Override
+    public Set<InjectionPoint> getInjectionPoints() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public String getName() {
+        // Not called as this is not a named bean
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return "Default CDI Camel Context";
+    }
+
+    @Override
+    public Set<Class<? extends Annotation>> getStereotypes() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Set<Type> getTypes() {
+        return types;
+    }
+
+    @Override
+    public boolean isAlternative() {
+        return false;
+    }
+
+    @Override
+    public boolean isNullable() {
+        return false;
+    }
+
+    @Override
+    public String getId() {
+        return getClass().getName();
+    }
+}