This is an automated email from the ASF dual-hosted git repository. dkulp pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 4398d3a15c344281a6974d334311ec223a603e15 Author: Romain Manni-Bucau <rmannibu...@apache.org> AuthorDate: Sun Mar 18 21:00:42 2018 +0100 CXF-7643 ensure to not conflict with default CDI beans when possible + add a way for cdi container to integrate with cdi to configure it --- .../org/apache/cxf/cdi/ContextProducerBean.java | 11 +++-- .../apache/cxf/cdi/JAXRSCdiResourceExtension.java | 55 +++++++++++++++++++++- 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/integration/cdi/src/main/java/org/apache/cxf/cdi/ContextProducerBean.java b/integration/cdi/src/main/java/org/apache/cxf/cdi/ContextProducerBean.java index 7fab977..98bcca6 100644 --- a/integration/cdi/src/main/java/org/apache/cxf/cdi/ContextProducerBean.java +++ b/integration/cdi/src/main/java/org/apache/cxf/cdi/ContextProducerBean.java @@ -34,16 +34,19 @@ import org.apache.cxf.phase.PhaseInterceptorChain; public class ContextProducerBean extends AbstractCXFBean<Object> implements PassivationCapable { private final Type type; + private final Set<Annotation> qualifiers; - ContextProducerBean(Type type) { + ContextProducerBean(Type type, boolean defaultQualifier) { this.type = type; + this.qualifiers = new HashSet<>(defaultQualifier ? 2 : 1); + this.qualifiers.add(ContextResolved.LITERAL); + if (defaultQualifier) { + this.qualifiers.add(DEFAULT); + } } @Override public Set<Annotation> getQualifiers() { - Set<Annotation> qualifiers = new HashSet<>(2); - qualifiers.add(ContextResolved.LITERAL); - qualifiers.add(DEFAULT); return qualifiers; } diff --git a/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java b/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java index bc7a251..04121a6 100644 --- a/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java +++ b/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java @@ -22,6 +22,7 @@ import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -35,6 +36,7 @@ import javax.enterprise.inject.spi.AfterDeploymentValidation; import javax.enterprise.inject.spi.AnnotatedType; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.BeforeBeanDiscovery; import javax.enterprise.inject.spi.BeforeShutdown; import javax.enterprise.inject.spi.Extension; import javax.enterprise.inject.spi.InjectionTarget; @@ -63,6 +65,9 @@ import org.apache.cxf.jaxrs.utils.InjectionUtils; import org.apache.cxf.jaxrs.utils.JAXRSServerFactoryCustomizationUtils; import org.apache.cxf.jaxrs.utils.ResourceUtils; +import static java.util.Arrays.asList; +import static java.util.Optional.ofNullable; + /** * Apache CXF portable CDI extension to support initialization of JAX-RS resources. */ @@ -78,6 +83,8 @@ public class JAXRSCdiResourceExtension implements Extension { new ArrayList< CreationalContext< ? > >(); private final Set< Type > contextTypes = new LinkedHashSet<>(); + private final Collection< String > existingStandardClasses = new HashSet<>(); + /** * Holder of the classified resource classes, converted to appropriate instance * representations. @@ -112,6 +119,46 @@ public class JAXRSCdiResourceExtension implements Extension { } } + // observing JAXRSCdiResourceExtension a "container" can customize that value to prevent some instances + // to be added with the default qualifier + public Collection<String> getExistingStandardClasses() { + return existingStandardClasses; + } + + /** + * Fires itsels, allows other extensions to modify this one. + * Typical example can be to modify existingStandardClasses to prevent CXF + * to own some beans it shouldn't create with default classifier. + * + * @param beforeBeanDiscovery the corresponding cdi event. + * @param beanManager the cdi bean manager. + */ + void onStartup(@Observes final BeforeBeanDiscovery beforeBeanDiscovery, final BeanManager beanManager) { + final ClassLoader loader = ofNullable(Thread.currentThread().getContextClassLoader()) + .orElseGet(ClassLoader::getSystemClassLoader); + boolean webHandled = false; + try { // OWB + loader.loadClass("org.apache.webbeans.web.lifecycle.WebContainerLifecycle"); + webHandled = true; + } catch (final NoClassDefFoundError | ClassNotFoundException e) { + // ok to keep them all + } + if (!webHandled) { + try { // Weld + loader.loadClass("org.jboss.weld.module.web.WeldWebModule"); + webHandled = true; + } catch (final NoClassDefFoundError | ClassNotFoundException e) { + // ok to keep them all + } + } + if (webHandled) { + existingStandardClasses.addAll(asList( + "javax.servlet.http.HttpServletRequest", + "javax.servlet.ServletContext")); + } + beanManager.fireEvent(this); + } + /** * For any {@link AnnotatedType} that includes a {@link Context} injection point, this method replaces * the field with the following code: @@ -149,6 +196,11 @@ public class JAXRSCdiResourceExtension implements Extension { } else if (CdiBusBean.CXF.equals(event.getBean().getName()) && Bus.class.isAssignableFrom(event.getBean().getBeanClass())) { hasBus = true; + } else { + event.getBean().getTypes().stream() + .filter(e -> Object.class != e && InjectionUtils.STANDARD_CONTEXT_CLASSES.contains(e.getTypeName())) + .findFirst() + .ifPresent(type -> existingStandardClasses.add(type.getTypeName())); } } @@ -224,7 +276,8 @@ public class JAXRSCdiResourceExtension implements Extension { // add custom contexts contextTypes.addAll(getCustomContextClasses()); // register all of the context types - contextTypes.forEach(t -> event.addBean(new ContextProducerBean(t))); + contextTypes.forEach( + t -> event.addBean(new ContextProducerBean(t, !existingStandardClasses.contains(t.getTypeName())))); } /** -- To stop receiving notification emails like this one, please contact dk...@apache.org.