Repository: cxf Updated Branches: refs/heads/master caac86161 -> 01cd14ce9
CXF-7097: application leaks a creational context in CDI Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/01cd14ce Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/01cd14ce Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/01cd14ce Branch: refs/heads/master Commit: 01cd14ce923f1f2cd044746e272b2d525c46f9a6 Parents: caac861 Author: reta <[email protected]> Authored: Tue Nov 8 17:45:22 2016 -0500 Committer: reta <[email protected]> Committed: Tue Nov 8 21:23:15 2016 -0500 ---------------------------------------------------------------------- .../apache/cxf/cdi/DefaultApplicationBean.java | 2 +- .../cxf/cdi/JAXRSCdiResourceExtension.java | 40 ++++++++++++++++++-- .../cdi/src/main/resources/META-INF/beans.xml | 3 ++ .../cdi/base/AbstractCdiSingleAppTest.java | 2 +- 4 files changed, 41 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/01cd14ce/integration/cdi/src/main/java/org/apache/cxf/cdi/DefaultApplicationBean.java ---------------------------------------------------------------------- diff --git a/integration/cdi/src/main/java/org/apache/cxf/cdi/DefaultApplicationBean.java b/integration/cdi/src/main/java/org/apache/cxf/cdi/DefaultApplicationBean.java index af83bbe..ed5afa6 100644 --- a/integration/cdi/src/main/java/org/apache/cxf/cdi/DefaultApplicationBean.java +++ b/integration/cdi/src/main/java/org/apache/cxf/cdi/DefaultApplicationBean.java @@ -49,7 +49,7 @@ class DefaultApplicationBean extends AbstractCXFBean<DefaultApplication> { @Override public void destroy(DefaultApplication defaultApplication, CreationalContext<DefaultApplication> creationalContext) { - + creationalContext.release(); } @Override http://git-wip-us.apache.org/repos/asf/cxf/blob/01cd14ce/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java ---------------------------------------------------------------------- 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 89b0094..0a6e032 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,17 +22,20 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.ServiceLoader; import java.util.Set; +import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.event.Observes; import javax.enterprise.inject.spi.AfterBeanDiscovery; 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.BeforeShutdown; import javax.enterprise.inject.spi.Extension; import javax.enterprise.inject.spi.InjectionTarget; import javax.enterprise.inject.spi.ProcessBean; @@ -58,10 +61,12 @@ public class JAXRSCdiResourceExtension implements Extension { private boolean hasBus; private Bus bus; - private final List< Bean< ? > > applicationBeans = new ArrayList< Bean< ? > >(); + private final Set< Bean< ? > > applicationBeans = new LinkedHashSet< Bean< ? > >(); private final List< Bean< ? > > serviceBeans = new ArrayList< Bean< ? > >(); private final List< Bean< ? > > providerBeans = new ArrayList< Bean< ? > >(); private final List< Bean< ? extends Feature > > featureBeans = new ArrayList< Bean< ? extends Feature > >(); + private final List< CreationalContext< ? > > disposableCreationalContexts = + new ArrayList< CreationalContext< ? > >(); @SuppressWarnings("unchecked") public <T> void collect(@Observes final ProcessBean< T > event) { @@ -82,15 +87,17 @@ public class JAXRSCdiResourceExtension implements Extension { public void load(@Observes final AfterDeploymentValidation event, final BeanManager beanManager) { // no need of creational context, it only works for app scoped instances anyway final Bean<?> busBean = beanManager.resolve(beanManager.getBeans(CdiBusBean.CXF)); + bus = (Bus)beanManager.getReference( - busBean, Bus.class, + busBean, + Bus.class, beanManager.createCreationalContext(busBean)); for (final Bean< ? > application: applicationBeans) { final Application instance = (Application)beanManager.getReference( application, application.getBeanClass(), - beanManager.createCreationalContext(application) + createCreationalContext(beanManager, application) ); // If there is an application without any singletons and classes defined, we will @@ -122,7 +129,18 @@ public class JAXRSCdiResourceExtension implements Extension { event.addBean(new CdiBusBean(busInjectionTarget)); } if (applicationBeans.isEmpty() && !serviceBeans.isEmpty()) { - event.addBean(new DefaultApplicationBean()); + final DefaultApplicationBean applicationBean = new DefaultApplicationBean(); + applicationBeans.add(applicationBean); + event.addBean(applicationBean); + } + } + + /** + * Releases created CreationalContext instances + */ + public void release(@Observes final BeforeShutdown event) { + for (final CreationalContext<?> disposableCreationalContext: disposableCreationalContexts) { + disposableCreationalContext.release(); } } @@ -295,4 +313,18 @@ public class JAXRSCdiResourceExtension implements Extension { extension.customize(bean); } } + + /** + * Creates and collects the CreationalContext instances for future releasing. + * @param beanManager bean manager instance + * @param bean bean instance to create CreationalContext for + * @return CreationalContext instance + */ + private<T> CreationalContext< T > createCreationalContext(final BeanManager beanManager, Bean< T > bean) { + final CreationalContext< T > creationalContext = beanManager.createCreationalContext(bean); + if (!(bean instanceof DefaultApplicationBean)) { + disposableCreationalContexts.add(creationalContext); + } + return creationalContext; + } } http://git-wip-us.apache.org/repos/asf/cxf/blob/01cd14ce/integration/cdi/src/main/resources/META-INF/beans.xml ---------------------------------------------------------------------- diff --git a/integration/cdi/src/main/resources/META-INF/beans.xml b/integration/cdi/src/main/resources/META-INF/beans.xml index aff28d9..70c89e6 100644 --- a/integration/cdi/src/main/resources/META-INF/beans.xml +++ b/integration/cdi/src/main/resources/META-INF/beans.xml @@ -2,4 +2,7 @@ <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_1.xsd"> + <scan> + <exclude name="org.apache.cxf.cdi.DefaultApplication" /> + </scan> </beans> http://git-wip-us.apache.org/repos/asf/cxf/blob/01cd14ce/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/AbstractCdiSingleAppTest.java ---------------------------------------------------------------------- diff --git a/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/AbstractCdiSingleAppTest.java b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/AbstractCdiSingleAppTest.java index f690d06..0dd6ce4 100644 --- a/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/AbstractCdiSingleAppTest.java +++ b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/AbstractCdiSingleAppTest.java @@ -35,7 +35,7 @@ import org.junit.Test; public abstract class AbstractCdiSingleAppTest extends AbstractBusClientServerTestBase { @Test public void testInjectedVersionIsProperlyReturned() { - Response r = createWebClient("/rest/bookstore/version", MediaType.TEXT_PLAIN).get(); + Response r = createWebClient(getBasePath() + "/version", MediaType.TEXT_PLAIN).get(); assertEquals(Response.Status.OK.getStatusCode(), r.getStatus()); assertEquals("1.0", r.readEntity(String.class)); }
