You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ha...@apache.org on 2012/07/18 04:29:49 UTC

svn commit: r1362746 - in /camel/trunk/components/camel-cdi: ./ src/main/java/org/apache/camel/component/cdi/ src/main/java/org/apache/camel/component/cdi/internal/ src/main/resources/META-INF/services/ src/test/java/org/apache/camel/cdi/

Author: hadrian
Date: Wed Jul 18 02:29:49 2012
New Revision: 1362746

URL: http://svn.apache.org/viewvc?rev=1362746&view=rev
Log:
CAMEL-5447. Camel context creation in CDI containers. Patch applied with thatnks to Lukasz

Added:
    camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/
    camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java   (with props)
    camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelExtension.java   (with props)
    camel/trunk/components/camel-cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
    camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelExtensionTest.java
      - copied, changed from r1362634, camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java
    camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiContextTestSupport.java
      - copied, changed from r1362634, camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelCdiTestContainer.java
    camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiTestSupport.java   (contents, props changed)
      - copied, changed from r1362634, camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelCdiTestContainer.java
Removed:
    camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelCdiTestContainer.java
Modified:
    camel/trunk/components/camel-cdi/pom.xml
    camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java
    camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiInjector.java
    camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/RegistryLookupAndInjectorTest.java

Modified: camel/trunk/components/camel-cdi/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/pom.xml?rev=1362746&r1=1362745&r2=1362746&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/pom.xml (original)
+++ camel/trunk/components/camel-cdi/pom.xml Wed Jul 18 02:29:49 2012
@@ -103,6 +103,17 @@
     </dependency>
   </dependencies>
 
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <forkMode>pertest</forkMode>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
   <profiles>
     <profile>
       <id>owb</id>

Modified: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java?rev=1362746&r1=1362745&r2=1362746&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java (original)
+++ camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java Wed Jul 18 02:29:49 2012
@@ -16,7 +16,13 @@
  */
 package org.apache.camel.component.cdi;
 
+import javax.annotation.PostConstruct;
+import javax.enterprise.inject.Instance;
+import javax.inject.Inject;
+
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.Injector;
+import org.apache.camel.spi.Registry;
 
 /**
  * CDI {@link org.apache.camel.CamelContext} class.
@@ -24,8 +30,26 @@ import org.apache.camel.impl.DefaultCame
 public class CdiCamelContext extends DefaultCamelContext {
 
     public CdiCamelContext() {
-        setRegistry(new CdiBeanRegistry());
+        super(new CdiBeanRegistry());
         setInjector(new CdiInjector(getInjector()));
     }
 
-}
\ No newline at end of file
+    @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();
+    }
+
+}

Modified: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiInjector.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiInjector.java?rev=1362746&r1=1362745&r2=1362746&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiInjector.java (original)
+++ camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiInjector.java Wed Jul 18 02:29:49 2012
@@ -18,6 +18,7 @@ package org.apache.camel.component.cdi;
 
 import org.apache.camel.IsSingleton;
 import org.apache.camel.spi.Injector;
+import org.apache.camel.util.ReflectionInjector;
 import org.apache.deltaspike.core.api.provider.BeanProvider;
 
 /**
@@ -30,6 +31,10 @@ public class CdiInjector implements Inje
      */
     private Injector injector;
 
+    public CdiInjector() {
+        this(new ReflectionInjector());
+    }
+
     public CdiInjector(Injector parent) {
         this.injector = parent;
     }

Added: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java?rev=1362746&view=auto
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java (added)
+++ camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java Wed Jul 18 02:29:49 2012
@@ -0,0 +1,108 @@
+/**
+ * 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.component.cdi.internal;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+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.InjectionPoint;
+import javax.enterprise.inject.spi.InjectionTarget;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.cdi.CdiCamelContext;
+import org.apache.deltaspike.core.api.literal.AnyLiteral;
+import org.apache.deltaspike.core.api.literal.DefaultLiteral;
+
+/**
+ * Description of camel context bean.
+ */
+@SuppressWarnings("unchecked")
+public class CamelContextBean implements Bean<CdiCamelContext> {
+
+    private final InjectionTarget<CdiCamelContext> target;
+
+    public CamelContextBean(InjectionTarget<CdiCamelContext> injectionTarget) {
+        this.target = injectionTarget;
+    }
+
+    @Override
+    public CdiCamelContext create(CreationalContext<CdiCamelContext> context) {
+        CdiCamelContext camelContext = target.produce(context);
+        target.postConstruct(camelContext);
+        context.push(camelContext);
+        return camelContext;
+    }
+
+    @Override
+    public void destroy(CdiCamelContext instance, CreationalContext<CdiCamelContext> context) {
+        target.preDestroy(instance);
+        target.dispose(instance);
+        context.release();
+    }
+
+    @Override
+    public Set<Type> getTypes() {
+        return new HashSet<Type>(Arrays.asList(Object.class, CamelContext.class, CdiCamelContext.class));
+    }
+
+    @Override
+    public Set<Annotation> getQualifiers() {
+        return new HashSet<Annotation>(Arrays.asList(new DefaultLiteral(), new AnyLiteral()));
+    }
+
+    @Override
+    public Class<? extends Annotation> getScope() {
+        return ApplicationScoped.class;
+    }
+
+    @Override
+    public String getName() {
+        return "CamelContext";
+    }
+
+    @Override
+    public boolean isNullable() {
+        return false;
+    }
+
+    @Override
+    public Set<InjectionPoint> getInjectionPoints() {
+        return target.getInjectionPoints();
+    }
+
+    @Override
+    public Class<?> getBeanClass() {
+        return CdiCamelContext.class;
+    }
+
+    @Override
+    public Set<Class<? extends Annotation>> getStereotypes() {
+        return null;
+    }
+
+    @Override
+    public boolean isAlternative() {
+        return false;
+    }
+
+}

Propchange: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelContextBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 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=1362746&view=auto
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelExtension.java (added)
+++ camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelExtension.java Wed Jul 18 02:29:49 2012
@@ -0,0 +1,82 @@
+/**
+ * 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.component.cdi.internal;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.AfterBeanDiscovery;
+import javax.enterprise.inject.spi.AfterDeploymentValidation;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeShutdown;
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.ProcessAnnotatedType;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.cdi.CdiCamelContext;
+import org.apache.deltaspike.core.api.provider.BeanProvider;
+
+/**
+ * Set of camel specific hooks for CDI.
+ */
+public class CamelExtension implements Extension {
+
+    /**
+     * Context instance.
+     */
+    private CamelContext camelContext;
+
+    /**
+     * Disable creation of default CamelContext bean and rely on context created
+     * and managed by extension.
+     *
+     * @param process Annotated type.
+     */
+    protected void disableDefaultContext(@Observes ProcessAnnotatedType<CamelContext> process) {
+        process.veto();
+    }
+
+    /**
+     * Registers managed camel bean.
+     * 
+     * @param abd After bean discovery event.
+     * @param manager Bean manager.
+     */
+    protected void registerManagedCamelContext(@Observes AfterBeanDiscovery abd, BeanManager manager) {
+        abd.addBean(new CamelContextBean(manager.createInjectionTarget(manager.createAnnotatedType(CdiCamelContext.class))));
+    }
+
+    /**
+     * Start up camel context.
+     * 
+     * @param adv After deployment validation event.
+     * @throws Exception In case of failures.
+     */
+    protected void validate(@Observes AfterDeploymentValidation adv) throws Exception {
+        camelContext = BeanProvider.getContextualReference(CamelContext.class);
+        camelContext.start();
+    }
+
+    /**
+     * Shutdown camel context.
+     * 
+     * @param bsd Shutdown event.
+     * @throws Exception In case of failures.
+     */
+    protected void shutdown(@Observes BeforeShutdown bsd) throws Exception {
+        camelContext.stop();
+    }
+
+}

Propchange: camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/internal/CamelExtension.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: camel/trunk/components/camel-cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension?rev=1362746&view=auto
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension (added)
+++ camel/trunk/components/camel-cdi/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension Wed Jul 18 02:29:49 2012
@@ -0,0 +1 @@
+org.apache.camel.component.cdi.internal.CamelExtension
\ No newline at end of file

Copied: camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelExtensionTest.java (from r1362634, camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelExtensionTest.java?p2=camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelExtensionTest.java&p1=camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java&r1=1362634&r2=1362746&rev=1362746&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/main/java/org/apache/camel/component/cdi/CdiCamelContext.java (original)
+++ camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelExtensionTest.java Wed Jul 18 02:29:49 2012
@@ -14,18 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.cdi;
+package org.apache.camel.cdi;
 
-import org.apache.camel.impl.DefaultCamelContext;
+import javax.inject.Inject;
+
+import org.apache.camel.CamelContext;
+import org.junit.Test;
 
 /**
- * CDI {@link org.apache.camel.CamelContext} class.
+ * Test camel extension.
  */
-public class CdiCamelContext extends DefaultCamelContext {
+public class CamelExtensionTest extends CdiTestSupport {
+
+    @Inject
+    private CamelContext context;
 
-    public CdiCamelContext() {
-        setRegistry(new CdiBeanRegistry());
-        setInjector(new CdiInjector(getInjector()));
+    @Test
+    public void shouldBeStartedByTestFramework() {
+        assertTrue(context.getStatus().isStarted());
+        assertFalse(context.getStatus().isStopped());
+        assertFalse(context.getStatus().isStopping());
     }
 
-}
\ No newline at end of file
+}

Copied: camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiContextTestSupport.java (from r1362634, camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelCdiTestContainer.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiContextTestSupport.java?p2=camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiContextTestSupport.java&p1=camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelCdiTestContainer.java&r1=1362634&r2=1362746&rev=1362746&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelCdiTestContainer.java (original)
+++ camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiContextTestSupport.java Wed Jul 18 02:29:49 2012
@@ -19,10 +19,10 @@ package org.apache.camel.cdi;
 import java.util.logging.LogManager;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.component.cdi.CdiCamelContext;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.apache.deltaspike.cdise.api.CdiContainer;
 import org.apache.deltaspike.cdise.api.CdiContainerLoader;
+import org.apache.deltaspike.core.api.provider.BeanProvider;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -30,7 +30,7 @@ import org.junit.BeforeClass;
 /**
  * Base class for cdi tests.
  */
-public abstract class CamelCdiTestContainer extends CamelTestSupport {
+public abstract class CdiContextTestSupport extends CamelTestSupport {
 
     private CdiContainer cdiContainer;
 
@@ -51,19 +51,21 @@ public abstract class CamelCdiTestContai
         cdiContainer = CdiContainerLoader.getCdiContainer();
         cdiContainer.boot();
 
+        // inject fields inside child classes
+        BeanProvider.injectFields(this);
+
         super.setUp();
     }
 
     @After
     public void tearDown() throws Exception {
         super.tearDown();
-        context.stop();
         cdiContainer.shutdown();
     }
 
     @Override
     protected CamelContext createCamelContext() throws Exception {
-        return new CdiCamelContext();
+        return BeanProvider.getContextualReference(CamelContext.class);
     }
 }
 

Copied: camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiTestSupport.java (from r1362634, camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelCdiTestContainer.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiTestSupport.java?p2=camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiTestSupport.java&p1=camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelCdiTestContainer.java&r1=1362634&r2=1362746&rev=1362746&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CamelCdiTestContainer.java (original)
+++ camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiTestSupport.java Wed Jul 18 02:29:49 2012
@@ -18,11 +18,10 @@ package org.apache.camel.cdi;
 
 import java.util.logging.LogManager;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.component.cdi.CdiCamelContext;
-import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.test.junit4.TestSupport;
 import org.apache.deltaspike.cdise.api.CdiContainer;
 import org.apache.deltaspike.cdise.api.CdiContainerLoader;
+import org.apache.deltaspike.core.api.provider.BeanProvider;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -30,7 +29,7 @@ import org.junit.BeforeClass;
 /**
  * Base class for cdi tests.
  */
-public abstract class CamelCdiTestContainer extends CamelTestSupport {
+public abstract class CdiTestSupport extends TestSupport {
 
     private CdiContainer cdiContainer;
 
@@ -51,19 +50,13 @@ public abstract class CamelCdiTestContai
         cdiContainer = CdiContainerLoader.getCdiContainer();
         cdiContainer.boot();
 
-        super.setUp();
+        BeanProvider.injectFields(this);
     }
 
     @After
     public void tearDown() throws Exception {
-        super.tearDown();
-        context.stop();
         cdiContainer.shutdown();
     }
 
-    @Override
-    protected CamelContext createCamelContext() throws Exception {
-        return new CdiCamelContext();
-    }
 }
 

Propchange: camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/CdiTestSupport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/RegistryLookupAndInjectorTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/RegistryLookupAndInjectorTest.java?rev=1362746&r1=1362745&r2=1362746&view=diff
==============================================================================
--- camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/RegistryLookupAndInjectorTest.java (original)
+++ camel/trunk/components/camel-cdi/src/test/java/org/apache/camel/cdi/RegistryLookupAndInjectorTest.java Wed Jul 18 02:29:49 2012
@@ -26,7 +26,7 @@ import org.apache.camel.cdi.store.Shoppi
 import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.Test;
 
-public class RegistryLookupAndInjectorTest extends CamelCdiTestContainer {
+public class RegistryLookupAndInjectorTest extends CdiContextTestSupport {
 
     private MockEndpoint resultEndpoint;