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);