Improve metadata handing for default Camel context beans

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

Branch: refs/heads/master
Commit: de29d3dcda2d5adc4367e339e5f75dc9a9729ada
Parents: 0bd48bc
Author: Antonin Stefanutti <anto...@stefanutti.fr>
Authored: Thu Jan 21 14:45:15 2016 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Fri Jan 22 15:57:17 2016 +0100

----------------------------------------------------------------------
 .../org/apache/camel/cdi/AnnotatedWrapper.java  | 84 --------------------
 .../camel/cdi/CamelContextDefaultProducer.java  |  4 +-
 .../apache/camel/cdi/CamelContextProducer.java  | 17 ++--
 .../camel/cdi/CdiCamelContextAnnotated.java     | 65 +++++++++++++++
 .../apache/camel/cdi/CdiCamelContextBean.java   |  9 +--
 .../org/apache/camel/cdi/CdiCamelExtension.java | 24 ++----
 .../java/org/apache/camel/cdi/CdiSpiHelper.java |  2 +-
 7 files changed, 84 insertions(+), 121 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/de29d3dc/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
deleted file mode 100644
index 013738a..0000000
--- 
a/components/camel-cdi/src/main/java/org/apache/camel/cdi/AnnotatedWrapper.java
+++ /dev/null
@@ -1,84 +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.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/de29d3dc/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
index 4af15e7..6412bc7 100644
--- 
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
@@ -29,9 +29,7 @@ final class CamelContextDefaultProducer implements 
InjectionTarget<DefaultCamelC
 
     @Override
     public DefaultCamelContext produce(CreationalContext<DefaultCamelContext> 
ctx) {
-        DefaultCamelContext context = new DefaultCamelContext();
-        context.setNameStrategy(new CdiCamelContextNameStrategy());
-        return context;
+        return new DefaultCamelContext();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/de29d3dc/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
index ebf80eb..1d8c99c 100644
--- 
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
@@ -18,9 +18,6 @@ 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;
@@ -62,7 +59,7 @@ final class CamelContextProducer<T extends CamelContext> 
extends DelegateProduce
         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) {
+        if (context.getNameStrategy() instanceof 
DefaultCamelContextNameStrategy) {
             context.setNameStrategy(nameStrategy(annotated));
         }
 
@@ -77,11 +74,13 @@ final class CamelContextProducer<T extends CamelContext> 
extends DelegateProduce
         }
 
         // 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()) {
+        Set<Annotation> qualifiers = 
CdiSpiHelper.excludeElementOfTypes(CdiSpiHelper.getQualifiers(annotated, 
manager), Named.class);
+        qualifiers.add(AnyLiteral.INSTANCE);
+        if (qualifiers.size() == 1) {
+            qualifiers.add(DefaultLiteral.INSTANCE);
+        }
+        qualifiers.retainAll(extension.getObserverEvents());
+        if (!qualifiers.isEmpty()) {
             context.getManagementStrategy().addEventNotifier(new 
CdiEventNotifier(manager, qualifiers));
         }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/de29d3dc/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContextAnnotated.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContextAnnotated.java
 
b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContextAnnotated.java
new file mode 100644
index 0000000..39d932d
--- /dev/null
+++ 
b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContextAnnotated.java
@@ -0,0 +1,65 @@
+/**
+ * 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.inject.spi.Annotated;
+import javax.enterprise.inject.spi.BeanManager;
+
+import org.apache.camel.impl.DefaultCamelContext;
+
+final class CdiCamelContextAnnotated implements Annotated {
+
+    private final Set<Type> types;
+
+    private final Set<Annotation> annotations;
+
+    CdiCamelContextAnnotated(BeanManager manager, Annotation... annotations) {
+        this.types = 
Collections.unmodifiableSet(manager.createAnnotatedType(DefaultCamelContext.class).getTypeClosure());
+        this.annotations = Collections.unmodifiableSet(new 
HashSet<>(Arrays.asList(annotations)));
+    }
+
+    @Override
+    public Type getBaseType() {
+        return DefaultCamelContext.class;
+    }
+
+    @Override
+    public Set<Type> getTypeClosure() {
+        return types;
+    }
+
+    @Override
+    public <U extends Annotation> U getAnnotation(Class<U> annotationType) {
+        return CdiSpiHelper.getFirstElementOfType(getAnnotations(), 
annotationType);
+    }
+
+    @Override
+    public Set<Annotation> getAnnotations() {
+        return annotations;
+    }
+
+    @Override
+    public boolean isAnnotationPresent(Class<? extends Annotation> 
annotationType) {
+        return getAnnotation(annotationType) != null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/de29d3dc/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
index 08338a2..6f4dc10 100644
--- 
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
@@ -18,14 +18,11 @@ 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;
@@ -40,9 +37,9 @@ final class CdiCamelContextBean implements 
Bean<DefaultCamelContext>, Passivatio
 
     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());
+    CdiCamelContextBean(CdiCamelContextAnnotated annotated, 
InjectionTarget<DefaultCamelContext> target) {
+        this.qualifiers = annotated.getAnnotations();
+        this.types = annotated.getTypeClosure();
         this.target = target;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/de29d3dc/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 6951cc3..e052206 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
@@ -36,7 +36,6 @@ 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.AnnotatedMethod;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
@@ -86,8 +85,6 @@ public class CdiCamelExtension implements Extension {
 
     private final Map<InjectionPoint, ForwardingObserverMethod<?>> 
cdiEventEndpoints = new ConcurrentHashMap<>();
 
-    private final Map<Annotated, Bean<?>> contextBeans = new 
ConcurrentHashMap<>();
-
     private final Set<Annotation> contextQualifiers = newSetFromMap(new 
ConcurrentHashMap<Annotation, Boolean>());
 
     private final Set<Annotation> eventQualifiers = newSetFromMap(new 
ConcurrentHashMap<Annotation, Boolean>());
@@ -104,10 +101,6 @@ public class CdiCamelExtension implements Extension {
         return eventQualifiers;
     }
 
-    Bean<?> getContextBean(Annotated annotated) {
-        return contextBeans.get(annotated);
-    }
-
     Set<Annotation> getContextQualifiers() {
         return contextQualifiers;
     }
@@ -197,21 +190,15 @@ public class CdiCamelExtension implements Extension {
     }
 
     private <T extends CamelContext> void camelContextBeans(@Observes 
ProcessBean<T> pb) {
-        processCamelContextBean(pb.getAnnotated(), pb.getBean());
+        contextQualifiers.addAll(pb.getBean().getQualifiers());
     }
 
     private <T extends CamelContext> void camelContextProducerFields(@Observes 
ProcessProducerField<T, ?> pb) {
-        processCamelContextBean(pb.getAnnotated(), pb.getBean());
+        contextQualifiers.addAll(pb.getBean().getQualifiers());
     }
 
     private <T extends CamelContext> void 
camelContextProducerMethods(@Observes ProcessProducerMethod<T, ?> pb) {
-        processCamelContextBean(pb.getAnnotated(), pb.getBean());
-    }
-
-    private void processCamelContextBean(Annotated annotated, Bean<?> bean) {
-        contextQualifiers.addAll(bean.getQualifiers());
-        // Annotated must be wrapped because of OWB-1099
-        contextBeans.put(new AnnotatedWrapper(annotated), bean);
+        contextQualifiers.addAll(pb.getBean().getQualifiers());
     }
 
     private void cdiCamelFactoryProducers(@Observes AfterBeanDiscovery abd) {
@@ -234,8 +221,9 @@ public class CdiCamelExtension implements Extension {
     }
 
     private void addDefaultCamelContext(@Observes AfterBeanDiscovery abd, 
BeanManager manager) {
-        if (contextBeans.isEmpty()) {
-            abd.addBean(new CdiCamelContextBean(manager, 
environment.camelContextInjectionTarget(new CamelContextDefaultProducer(), 
null, manager, CdiCamelExtension.this)));
+        if (contextQualifiers.isEmpty()) {
+            CdiCamelContextAnnotated annotated = new 
CdiCamelContextAnnotated(manager, AnyLiteral.INSTANCE, DefaultLiteral.INSTANCE);
+            abd.addBean(new CdiCamelContextBean(annotated, 
environment.camelContextInjectionTarget(new CamelContextDefaultProducer(), 
annotated, manager, this)));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/de29d3dc/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 5bf852e..660f4f5 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
@@ -46,7 +46,7 @@ final class CdiSpiHelper {
         return getFirstElementOfType(ip.getQualifiers(), type);
     }
 
-    private static <E, T extends E> T getFirstElementOfType(Collection<E> 
collection, Class<T> type) {
+    static <E, T extends E> T getFirstElementOfType(Collection<E> collection, 
Class<T> type) {
         for (E item : collection) {
             if ((item != null) && type.isAssignableFrom(item.getClass())) {
                 return ObjectHelper.cast(type, item);

Reply via email to