You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2016/04/22 16:29:17 UTC

[1/2] camel git commit: Camel CDI: hasId predicate for Camel XML beans

Repository: camel
Updated Branches:
  refs/heads/master 2930338eb -> 12530e8e6


Camel CDI: hasId predicate for Camel XML beans


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

Branch: refs/heads/master
Commit: afc9d55793286d96d71d6a0ae3e26ad2c3a74bc7
Parents: 2930338
Author: Antonin Stefanutti <an...@stefanutti.fr>
Authored: Fri Apr 22 16:08:52 2016 +0200
Committer: Antonin Stefanutti <an...@stefanutti.fr>
Committed: Fri Apr 22 16:20:11 2016 +0200

----------------------------------------------------------------------
 .../org/apache/camel/cdi/XmlCdiBeanFactory.java | 30 +++++++++++++-------
 1 file changed, 20 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/afc9d557/components/camel-cdi/src/main/java/org/apache/camel/cdi/XmlCdiBeanFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/XmlCdiBeanFactory.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/XmlCdiBeanFactory.java
index d496d58..a9aaf05 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/XmlCdiBeanFactory.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/XmlCdiBeanFactory.java
@@ -51,6 +51,8 @@ import org.apache.camel.core.xml.AbstractCamelFactoryBean;
 import org.apache.camel.core.xml.CamelProxyFactoryDefinition;
 import org.apache.camel.core.xml.CamelServiceExporterDefinition;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.model.IdentifiedType;
+import org.apache.camel.model.OptionalIdentifiedDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestDefinition;
@@ -126,7 +128,7 @@ final class XmlCdiBeanFactory {
                     beans.add(routeContextBean(factory, url));
                 }
                 for (AbstractCamelFactoryBean<?> factory : app.getBeans()) {
-                    if (factory.getId() != null) {
+                    if (hasId(factory)) {
                         beans.add(camelContextBean(null, factory, url));
                     }
                 }
@@ -152,7 +154,7 @@ final class XmlCdiBeanFactory {
     private SyntheticBean<?> camelContextBean(CamelContextFactoryBean factory, URL url) {
         Set<Annotation> annotations = new HashSet<>();
         annotations.add(ANY);
-        if (factory.getId() != null) {
+        if (hasId(factory)) {
             addAll(annotations,
                 ContextName.Literal.of(factory.getId()), NamedLiteral.of(factory.getId()));
         } else {
@@ -193,7 +195,7 @@ final class XmlCdiBeanFactory {
         // TODO: WARN log if the definition doesn't have an id
         if (factory.getBeans() != null) {
             factory.getBeans().stream()
-                .filter(bean -> bean.getId() != null)
+                .filter(XmlCdiBeanFactory::hasId)
                 .map(bean -> camelContextBean(context, bean, url))
                 .forEach(beans::add);
         }
@@ -201,14 +203,14 @@ final class XmlCdiBeanFactory {
         // TODO: define in beans
         if (factory.getEndpoints() != null) {
             factory.getEndpoints().stream()
-                .filter(endpoint -> endpoint.getId() != null)
+                .filter(XmlCdiBeanFactory::hasId)
                 .map(endpoint -> camelContextBean(context, endpoint, url))
                 .forEach(beans::add);
         }
 
         if (factory.getErrorHandlers() != null) {
             factory.getErrorHandlers().stream()
-                .filter(handler -> handler.getId() != null)
+                .filter(XmlCdiBeanFactory::hasId)
                 .map(handler -> errorHandlerBean(handler, url))
                 .forEach(beans::add);
         }
@@ -221,7 +223,7 @@ final class XmlCdiBeanFactory {
 
         if (factory.getProxies() != null) {
             factory.getProxies().stream()
-                .filter(proxy -> proxy.getId() != null)
+                .filter(XmlCdiBeanFactory::hasId)
                 .map(proxy -> proxyFactoryBean(context, proxy, url))
                 .forEach(beans::add);
         }
@@ -229,7 +231,7 @@ final class XmlCdiBeanFactory {
         // TODO: define in beans
         if (factory.getRedeliveryPolicies() != null) {
             factory.getRedeliveryPolicies().stream()
-                .filter(policy -> policy.getId() != null)
+                .filter(XmlCdiBeanFactory::hasId)
                 .map(policy -> camelContextBean(context, policy, url))
                 .forEach(beans::add);
         }
@@ -245,7 +247,7 @@ final class XmlCdiBeanFactory {
         Set<Annotation> annotations = new HashSet<>();
         annotations.add(ANY);
         // FIXME: should add @ContextName if the Camel context bean has it
-        annotations.add(factory.getId() != null ? NamedLiteral.of(factory.getId()) : DEFAULT);
+        annotations.add(hasId(factory) ? NamedLiteral.of(factory.getId()) : DEFAULT);
 
         // TODO: should that be @Singleton to enable injection points with bean instance type?
         if (factory.isSingleton()) {
@@ -310,7 +312,7 @@ final class XmlCdiBeanFactory {
 
         return new XmlServiceExporterBean<>(manager,
             new SyntheticAnnotated(type, types, APPLICATION_SCOPED, ANY, STARTUP,
-                exporter.getId() != null ? NamedLiteral.of(exporter.getId()) : DEFAULT),
+                hasId(exporter) ? NamedLiteral.of(exporter.getId()) : DEFAULT),
             type, bean ->
                 "imported bean [" + Objects.toString(exporter.getId(), "export") + "] "
                 + "from resource [" + url + "] "
@@ -363,7 +365,7 @@ final class XmlCdiBeanFactory {
             RoutesDefinition.class,
             new SyntheticInjectionTarget<>(() -> definition), bean ->
                 "imported routes definition "
-                + (definition.getId() != null ? "[" + definition.getId() + "] " : "")
+                + (hasId(definition) ? "[" + definition.getId() + "] " : "")
                 + "from resource [" + url + "]");
     }
 
@@ -465,4 +467,12 @@ final class XmlCdiBeanFactory {
             format("Attribute [%s] is not supported by error handler type [%s], in error handler with id [%s]",
                 attribute, type, id));
     }
+
+    private static <T extends IdentifiedType> boolean hasId(T type) {
+        return isNotEmpty(type.getId());
+    }
+
+    private static <T extends OptionalIdentifiedDefinition<T>> boolean hasId(T type) {
+        return isNotEmpty(type.getId());
+    }
 }


[2/2] camel git commit: CAMEL-9904: Avoid creating an empty default Camel context in Camel CDI for empty deployments

Posted by as...@apache.org.
CAMEL-9904: Avoid creating an empty default Camel context in Camel CDI for empty deployments


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

Branch: refs/heads/master
Commit: 12530e8e68ed010049b1534cbcfbad1a6659cac9
Parents: afc9d55
Author: Antonin Stefanutti <an...@stefanutti.fr>
Authored: Fri Apr 22 16:19:38 2016 +0200
Committer: Antonin Stefanutti <an...@stefanutti.fr>
Committed: Fri Apr 22 16:28:56 2016 +0200

----------------------------------------------------------------------
 .../org/apache/camel/cdi/CdiCamelExtension.java | 151 +++++++++++--------
 .../java/org/apache/camel/cdi/CdiSpiHelper.java |   5 +
 .../main/java/org/apache/camel/cdi/Main.java    |   9 +-
 .../camel/cdi/test/NamedCamelBeanTest.java      |  24 ++-
 .../camel/cdi/test/NoCamelContextTest.java      |  59 ++++++++
 .../camel/cdi/test/UndefinedPropertyTest.java   |   9 +-
 6 files changed, 174 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/12530e8e/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
index 4e38b77..ae6f682 100755
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
@@ -35,6 +35,7 @@ import static java.util.function.Predicate.isEqual;
 import static java.util.stream.Collectors.collectingAndThen;
 
 import static java.util.stream.Collectors.toSet;
+import static java.util.stream.Stream.concat;
 
 import javax.enterprise.event.Observes;
 import javax.enterprise.inject.Default;
@@ -42,6 +43,7 @@ import javax.enterprise.inject.InjectionException;
 import javax.enterprise.inject.Produces;
 import javax.enterprise.inject.spi.AfterBeanDiscovery;
 import javax.enterprise.inject.spi.AfterDeploymentValidation;
+import javax.enterprise.inject.spi.Annotated;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
@@ -59,6 +61,7 @@ import javax.inject.Named;
 import org.apache.camel.BeanInject;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
+import org.apache.camel.Component;
 import org.apache.camel.Consume;
 import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.Converter;
@@ -69,7 +72,7 @@ import org.apache.camel.ProducerTemplate;
 import org.apache.camel.PropertyInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.ServiceStatus;
-import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.TypeConverter;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.management.event.AbstractExchangeEvent;
 import org.apache.camel.model.RouteContainer;
@@ -83,6 +86,7 @@ import static org.apache.camel.cdi.BeanManagerHelper.getReferencesByType;
 import static org.apache.camel.cdi.CdiSpiHelper.getQualifiers;
 import static org.apache.camel.cdi.CdiSpiHelper.getRawType;
 import static org.apache.camel.cdi.CdiSpiHelper.hasAnnotation;
+import static org.apache.camel.cdi.CdiSpiHelper.hasType;
 import static org.apache.camel.cdi.CdiSpiHelper.isAnnotationType;
 import static org.apache.camel.cdi.DefaultLiteral.DEFAULT;
 import static org.apache.camel.cdi.Excluded.EXCLUDED;
@@ -103,17 +107,15 @@ public class CdiCamelExtension implements Extension {
 
     private final Map<InjectionPoint, ForwardingObserverMethod<?>> cdiEventEndpoints = new ConcurrentHashMap<>();
 
-    private final Set<Bean<?>> contextBeans = newSetFromMap(new ConcurrentHashMap<>());
+    private final Set<Bean<?>> cdiBeans = newSetFromMap(new ConcurrentHashMap<>());
 
     private final Set<Annotation> contextQualifiers = newSetFromMap(new ConcurrentHashMap<>());
 
-    private final Set<Annotation> eventQualifiers = newSetFromMap(new ConcurrentHashMap<>());
-
     private final Map<Method, Bean<?>> producerBeans = new ConcurrentHashMap<>();
 
     private final Map<Method, Set<Annotation>> producerQualifiers = new ConcurrentHashMap<>();
 
-    private final Set<ContextName> contextNames = newSetFromMap(new ConcurrentHashMap<>());
+    private final Set<Annotation> eventQualifiers = newSetFromMap(new ConcurrentHashMap<>());
 
     private final Set<ImportResource> resources = newSetFromMap(new ConcurrentHashMap<>());
 
@@ -147,10 +149,6 @@ public class CdiCamelExtension implements Extension {
         }
     }
 
-    private void camelContextAware(@Observes ProcessAnnotatedType<? extends CamelContextAware> pat) {
-        camelBeans.add(pat.getAnnotatedType());
-    }
-
     private <T extends CamelContext> void camelContextBeans(@Observes ProcessInjectionTarget<T> pit, BeanManager manager) {
         pit.setInjectionTarget(environment.camelContextInjectionTarget(pit.getInjectionTarget(), pit.getAnnotatedType(), manager, this));
     }
@@ -165,18 +163,8 @@ public class CdiCamelExtension implements Extension {
         }
     }
 
-    private void cdiEventEndpoints(@Observes ProcessBean<?> pb) {
-        for (InjectionPoint ip : pb.getBean().getInjectionPoints()) {
-            if (!CdiEventEndpoint.class.equals(getRawType(ip.getType()))) {
-                continue;
-            }
-            // TODO: refine the key to the type and qualifiers instead of the whole injection point as it leads to registering redundant observers
-            if (ip.getType() instanceof ParameterizedType) {
-                cdiEventEndpoints.put(ip, new ForwardingObserverMethod<>(((ParameterizedType) ip.getType()).getActualTypeArguments()[0], ip.getQualifiers()));
-            } else if (ip.getType() instanceof Class) {
-                cdiEventEndpoints.put(ip, new ForwardingObserverMethod<>(Object.class, ip.getQualifiers()));
-            }
-        }
+    private <T extends CamelContextAware> void camelContextAware(@Observes ProcessInjectionTarget<T> pit, BeanManager manager) {
+        pit.setInjectionTarget(new CamelBeanInjectionTarget<>(pit.getInjectionTarget(), manager));
     }
 
     private <T extends Endpoint> void endpointBeans(@Observes ProcessProducerMethod<T, CdiCamelFactory> ppm) {
@@ -196,9 +184,7 @@ public class CdiCamelExtension implements Extension {
             new AnnotatedTypeDelegate<>(
                 pat.getAnnotatedType(), pat.getAnnotatedType().getMethods().stream()
                 .filter(am -> am.isAnnotationPresent(Produces.class))
-                .filter(am -> am.getTypeClosure().stream().anyMatch(isEqual(Endpoint.class)
-                    .or(isEqual(CdiEventEndpoint.class)).or(isEqual(MockEndpoint.class))
-                    .or(isEqual(ConsumerTemplate.class)).or(isEqual(ProducerTemplate.class))))
+                .filter(am -> am.getTypeClosure().stream().noneMatch(isEqual(TypeConverter.class)))
                 .peek(am -> producerQualifiers.put(am.getJavaMember(), getQualifiers(am, manager)))
                 .map(am -> new AnnotatedMethodDelegate<>(am, am.getAnnotations().stream()
                     .filter(annotation -> !manager.isQualifier(annotation.annotationType()))
@@ -218,34 +204,40 @@ public class CdiCamelExtension implements Extension {
         }
     }
 
-    private <T extends RoutesBuilder> void routeBuilderBeans(@Observes ProcessBean<T> pb) {
-        if (pb.getAnnotated().isAnnotationPresent(ContextName.class)) {
-            contextNames.add(pb.getAnnotated().getAnnotation(ContextName.class));
-        }
-    }
-
-    private <T extends CamelContext> void camelContextBeans(@Observes ProcessBean<T> pb) {
-        contextBeans.add(pb.getBean());
+    private void beans(@Observes ProcessProducerField<?, ?> pb) {
+        cdiBeans.add(pb.getBean());
     }
 
-    private <T extends CamelContext> void camelContextProducerFields(@Observes ProcessProducerField<T, ?> pb) {
-        contextBeans.add(pb.getBean());
+    private void beans(@Observes ProcessProducerMethod<?, ?> pb) {
+        cdiBeans.add(pb.getBean());
     }
 
-    private <T extends CamelContext> void camelContextProducerMethods(@Observes ProcessProducerMethod<T, ?> pb) {
-        contextBeans.add(pb.getBean());
+    private void beans(@Observes ProcessBean<?> pb) {
+        cdiBeans.add(pb.getBean());
+
+        // TODO: refine the key to the type and qualifiers instead of the whole injection point as it leads to registering redundant observers
+        pb.getBean().getInjectionPoints().stream()
+            .filter(ip -> CdiEventEndpoint.class.equals(getRawType(ip.getType())))
+            .forEach(ip -> {
+                // TODO: refine the key to the type and qualifiers instead of the whole injection point as it leads to registering redundant observers
+                if (ip.getType() instanceof ParameterizedType) {
+                    cdiEventEndpoints.put(ip, new ForwardingObserverMethod<>(((ParameterizedType) ip.getType()).getActualTypeArguments()[0], ip.getQualifiers()));
+                } else if (ip.getType() instanceof Class) {
+                    cdiEventEndpoints.put(ip, new ForwardingObserverMethod<>(Object.class, ip.getQualifiers()));
+                }
+            });
     }
 
     private void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager manager) {
-        // The set of programmatic beans to be added
-        Set<SyntheticBean<?>> beans = new HashSet<>();
+        // The set of extra Camel CDI beans
+        Set<SyntheticBean<?>> extraBeans = new HashSet<>();
 
         // Add beans from Camel XML resources
         for (ImportResource resource : resources) {
             XmlCdiBeanFactory factory = XmlCdiBeanFactory.with(manager, environment, this);
             for (String path : resource.value()) {
                 try {
-                    beans.addAll(factory.beansFrom(path));
+                    extraBeans.addAll(factory.beansFrom(path));
                 } catch (NoClassDefFoundError cause) {
                     if (cause.getMessage().contains("AbstractCamelContextFactoryBean")) {
                         logger.error("Importing Camel XML requires to have the 'camel-core-xml' dependency in the classpath!");
@@ -259,33 +251,32 @@ public class CdiCamelExtension implements Extension {
             }
         }
 
-        // The set of all the Camel context beans
-        Set<Bean<?>> contexts = new HashSet<>();
-
-        // From the discovered annotated types
-        contextBeans.stream()
-            .peek(contexts::add)
+        // Camel contexts from the imported Camel XML
+        concat(cdiBeans.stream(), extraBeans.stream())
+            .filter(hasType(CamelContext.class))
             .map(Bean::getQualifiers)
             .forEach(contextQualifiers::addAll);
 
-        // From the imported Camel XML
-        beans.stream()
-            .filter(bean -> bean.getTypes().contains(CamelContext.class))
-            .peek(contexts::add)
+        // From the @ContextName qualifiers on RoutesBuilder and RouteContainer beans
+        cdiBeans.stream()
+            .filter(hasType(RoutesBuilder.class).or(hasType(RouteContainer.class)))
             .map(Bean::getQualifiers)
-            .forEach(contextQualifiers::addAll);
-
-        // From the @ContextName qualifiers on RoutesBuilder beans
-        contextNames.stream()
+            .flatMap(Set::stream)
+            .filter(isAnnotationType(ContextName.class))
             .filter(name -> !contextQualifiers.contains(name))
             .peek(contextQualifiers::add)
             .map(name -> camelContextBean(manager, ANY, name, APPLICATION_SCOPED))
-            .peek(contexts::add)
-            .forEach(beans::add);
+            .forEach(extraBeans::add);
 
-        if (contexts.size() == 0) {
+        Set<Bean<?>> allBeans = concat(cdiBeans.stream(), extraBeans.stream())
+            .collect(toSet());
+        Set<Bean<?>> contexts = allBeans.stream()
+            .filter(hasType(CamelContext.class))
+            .collect(toSet());
+
+        if (contexts.size() == 0 && shouldDeployDefaultCamelContext(allBeans)) {
             // Add @Default Camel context bean if any
-            beans.add(camelContextBean(manager, ANY, DEFAULT, APPLICATION_SCOPED));
+            extraBeans.add(camelContextBean(manager, ANY, DEFAULT, APPLICATION_SCOPED));
         } else if (contexts.size() == 1) {
             // Add the @Default qualifier if there is only one Camel context bean
             Bean<?> context = contexts.iterator().next();
@@ -298,11 +289,12 @@ public class CdiCamelExtension implements Extension {
         }
 
         // Finally add the beans to the deployment
-        beans.forEach(abd::addBean);
+        extraBeans.forEach(abd::addBean);
 
         // Update the CDI Camel factory beans
         Set<Annotation> endpointQualifiers = cdiEventEndpoints.keySet().stream()
-            .flatMap(ip -> ip.getQualifiers().stream())
+            .map(InjectionPoint::getQualifiers)
+            .flatMap(Set::stream)
             .collect(toSet());
         Set<Annotation> templateQualifiers = contextQualifiers.stream()
             .filter(isAnnotationType(Default.class).or(isAnnotationType(Named.class)).negate())
@@ -320,6 +312,45 @@ public class CdiCamelExtension implements Extension {
         cdiEventEndpoints.values().forEach(abd::addObserverMethod);
     }
 
+    private boolean shouldDeployDefaultCamelContext(Set<Bean<?>> beans) {
+        return beans.stream()
+            // Is there a Camel bean with the @Default qualifier?
+            // Excluding internal components...
+            .filter(bean -> !bean.getBeanClass().getPackage().equals(getClass().getPackage()))
+            .filter(hasType(CamelContextAware.class).or(hasType(Component.class))
+                .or(hasType(RouteContainer.class).or(hasType(RoutesBuilder.class))))
+            .map(Bean::getQualifiers)
+            .flatMap(Set::stream)
+            .filter(isEqual(DEFAULT))
+            .findAny()
+            .isPresent()
+            // Or a bean with Camel annotations?
+            || concat(camelBeans.stream().map(AnnotatedType::getFields),
+                      camelBeans.stream().map(AnnotatedType::getMethods))
+            .flatMap(Set::stream)
+            .map(Annotated::getAnnotations)
+            .flatMap(Set::stream)
+            .filter(isAnnotationType(Consume.class).and(a -> ((Consume) a).context().isEmpty())
+                .or(isAnnotationType(BeanInject.class).and(a -> ((BeanInject) a).context().isEmpty()))
+                .or(isAnnotationType(EndpointInject.class).and(a -> ((EndpointInject) a).context().isEmpty()))
+                .or(isAnnotationType(Produce.class).and(a -> ((Produce) a).context().isEmpty()))
+                .or(isAnnotationType(PropertyInject.class).and(a -> ((PropertyInject) a).context().isEmpty())))
+            .findAny()
+            .isPresent()
+            // Or an injection point for Camel primitives?
+            || beans.stream()
+            // Excluding internal components...
+            .filter(bean -> !bean.getBeanClass().getPackage().equals(getClass().getPackage()))
+            .map(Bean::getInjectionPoints)
+            .flatMap(Set::stream)
+            .filter(ip -> getRawType(ip.getType()).getPackage().getName().startsWith("org.apache.camel"))
+            .map(InjectionPoint::getQualifiers)
+            .flatMap(Set::stream)
+            .filter(isAnnotationType(Uri.class).or(isEqual(DEFAULT)))
+            .findAny()
+            .isPresent();
+    }
+
     private SyntheticBean<?> camelContextBean(BeanManager manager, Annotation... qualifiers) {
         SyntheticAnnotated annotated = new SyntheticAnnotated(DefaultCamelContext.class,
             manager.createAnnotatedType(DefaultCamelContext.class).getTypeClosure(), qualifiers);
@@ -383,7 +414,7 @@ public class CdiCamelExtension implements Extension {
         }
 
         // Clean-up
-        Stream.of(converters, camelBeans, eagerBeans, contextBeans, contextNames).forEach(Set::clear);
+        Stream.of(converters, camelBeans, eagerBeans, cdiBeans).forEach(Set::clear);
         Stream.of(producerBeans, producerQualifiers).forEach(Map::clear);
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/12530e8e/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiSpiHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiSpiHelper.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiSpiHelper.java
index 17fa933..3d96003 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiSpiHelper.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiSpiHelper.java
@@ -57,6 +57,11 @@ final class CdiSpiHelper {
     private CdiSpiHelper() {
     }
 
+    static Predicate<Bean> hasType(Type type) {
+        requireNonNull(type);
+        return bean -> bean.getTypes().contains(type);
+    }
+
     static Predicate<Annotation> isAnnotationType(Class<? extends Annotation> clazz) {
         requireNonNull(clazz);
         return annotation -> clazz.equals(annotation.annotationType());

http://git-wip-us.apache.org/repos/asf/camel/blob/12530e8e/components/camel-cdi/src/main/java/org/apache/camel/cdi/Main.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/Main.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/Main.java
index 9b58aa3..aeabac3 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/Main.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/Main.java
@@ -104,11 +104,10 @@ public class Main extends MainSupport {
 
     private void warnIfNoCamelFound() {
         BeanManager manager = cdiContainer.getBeanManager();
-        Set<Bean<?>> contexts = manager.getBeans(CamelContext.class);
-        // Warn if the default CDI Camel context has no routes
-        if (contexts.size() == 1 && getReference(manager, CamelContext.class, contexts.iterator().next()).getRoutes().isEmpty()) {
-            LOG.warn("Camel CDI main has started with no Camel routes! "
-                   + "You may add some RouteBuilder beans to your project.");
+        Set<Bean<?>> contexts = manager.getBeans(CamelContext.class, ANY);
+        // Warn if there is no CDI Camel contexts
+        if (contexts.isEmpty()) {
+            LOG.warn("Camel CDI main has started with no Camel context!");
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/12530e8e/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NamedCamelBeanTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NamedCamelBeanTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NamedCamelBeanTest.java
index cb93c55..fbb2879 100644
--- a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NamedCamelBeanTest.java
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NamedCamelBeanTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.cdi.test;
 
 import java.util.concurrent.TimeUnit;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.cdi.CdiCamelExtension;
@@ -27,7 +26,6 @@ import org.apache.camel.cdi.bean.NamedCamelBean;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
-import org.jboss.arquillian.junit.InSequence;
 import org.jboss.shrinkwrap.api.Archive;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.asset.EmptyAsset;
@@ -52,19 +50,8 @@ public class NamedCamelBeanTest {
     }
 
     @Test
-    @InSequence(1)
-    public void configureCamelContext(CamelContext context) throws Exception {
-        context.addRoutes(new RouteBuilder() {
-            @Override
-            public void configure() {
-                from("direct:inbound").bean("beanName").to("mock:outbound");
-            }
-        });
-    }
-
-    @Test
-    @InSequence(2)
-    public void sendMessageToInbound(@Uri("direct:inbound") ProducerTemplate in, @Uri("mock:outbound") MockEndpoint out) throws InterruptedException {
+    public void sendMessageToInbound(@Uri("direct:inbound") ProducerTemplate in,
+                                     @Uri("mock:outbound") MockEndpoint out) throws InterruptedException {
         out.expectedMessageCount(1);
         out.expectedBodiesReceived("test-processed");
         
@@ -72,4 +59,11 @@ public class NamedCamelBeanTest {
 
         assertIsSatisfied(2L, TimeUnit.SECONDS, out);
     }
+
+    private static class TestRoute extends RouteBuilder {
+        @Override
+        public void configure() {
+            from("direct:inbound").bean("beanName").to("mock:outbound");
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/12530e8e/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NoCamelContextTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NoCamelContextTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NoCamelContextTest.java
new file mode 100644
index 0000000..fbdbf3d
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NoCamelContextTest.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.test;
+
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Instance;
+import javax.inject.Inject;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+
+@RunWith(Arquillian.class)
+public class NoCamelContextTest {
+
+    @Any
+    @Inject
+    private Instance<CamelContext> contexts;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void verifyDeployment() {
+        assertThat("Camel context beans are deployed!", contexts.isUnsatisfied(), is(equalTo(true)));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/12530e8e/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/UndefinedPropertyTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/UndefinedPropertyTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/UndefinedPropertyTest.java
index 8b88667..19e50e1 100644
--- a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/UndefinedPropertyTest.java
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/UndefinedPropertyTest.java
@@ -67,7 +67,8 @@ public class UndefinedPropertyTest {
 
     @Test
     public void lookupDefinedProperty(CamelContext context) throws Exception {
-        assertThat("Resolved property value is incorrect", context.resolvePropertyPlaceholders("{{from}}"), is(equalTo("inbound")));
+        assertThat("Resolved property value is incorrect",
+            context.resolvePropertyPlaceholders("{{from}}"), is(equalTo("inbound")));
     }
 
     @Test
@@ -76,8 +77,10 @@ public class UndefinedPropertyTest {
             context.resolvePropertyPlaceholders("{{to}}");
             fail("No exception is thrown!");
         } catch (Exception cause) {
-            assertThat("Exception thrown is incorrect", cause, is(instanceOf(IllegalArgumentException.class)));
-            assertThat("Exception message is incorrect", cause.getMessage(), is(equalTo("Property with key [to] not found in properties from text: {{to}}")));
+            assertThat("Exception thrown is incorrect", cause,
+                is(instanceOf(IllegalArgumentException.class)));
+            assertThat("Exception message is incorrect", cause.getMessage(),
+                is(equalTo("Property with key [to] not found in properties from text: {{to}}")));
         }
     }
 }