fixing CleanUpAssembler in case of multiple apps + handling @AroundTimeout for cdi interceptors
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/3e40a2fe Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/3e40a2fe Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/3e40a2fe Branch: refs/heads/master Commit: 3e40a2fee8139d5c4234cc4c1150ba946d61c34a Parents: 37b5756 Author: Romain Manni-Bucau <rmannibu...@apache.org> Authored: Fri Mar 6 18:09:26 2015 +0100 Committer: Romain Manni-Bucau <rmannibu...@apache.org> Committed: Fri Mar 6 18:09:26 2015 +0100 ---------------------------------------------------------------------- .../java/org/apache/openejb/BeanContext.java | 28 ++++++++++++++++++++ .../tck/cdi/embedded/CleanUpAssembler.java | 6 ++++- tck/cdi-embedded/src/test/resources/failing.xml | 6 +---- 3 files changed, 34 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/3e40a2fe/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java b/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java index d21b20f..1535f5e 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java @@ -44,6 +44,7 @@ import org.apache.openejb.util.Logger; import org.apache.openejb.util.proxy.DynamicProxyImplFactory; import org.apache.openejb.util.proxy.LocalBeanProxyFactory; import org.apache.openejb.util.reflection.Reflections; +import org.apache.webbeans.annotation.AnnotationManager; import org.apache.webbeans.component.CdiInterceptorBean; import org.apache.webbeans.component.InjectionTargetBean; import org.apache.webbeans.config.WebBeansContext; @@ -53,6 +54,7 @@ import org.apache.webbeans.intercept.DecoratorHandler; import org.apache.webbeans.intercept.InterceptorResolutionService; import org.apache.webbeans.portable.InjectionTargetImpl; import org.apache.webbeans.proxy.InterceptorDecoratorProxyFactory; +import org.apache.webbeans.util.AnnotationUtil; import org.apache.xbean.recipe.ConstructionException; import javax.ejb.ApplicationException; @@ -70,6 +72,8 @@ import javax.ejb.TimedObject; import javax.ejb.Timer; import javax.enterprise.context.ConversationScoped; import javax.enterprise.context.spi.CreationalContext; +import javax.enterprise.inject.spi.AnnotatedMethod; +import javax.enterprise.inject.spi.AnnotatedType; import javax.enterprise.inject.spi.Decorator; import javax.enterprise.inject.spi.InterceptionType; import javax.enterprise.inject.spi.Interceptor; @@ -187,6 +191,30 @@ public class BeanContext extends DeploymentContext { clear(Collection.class.cast(Reflections.get(injectionTarget, "preDestroyMethods"))); clear(Collection.class.cast(Reflections.get(info, "ejbInterceptors"))); clear(Collection.class.cast(Reflections.get(info, "cdiInterceptors"))); + + // OWB doesn't compute AROUND_INVOKE so let's do it + final Method timeout = getEjbTimeout(); + if (timeout != null) { + final AnnotatedType annotatedType = cdiEjbBean.getAnnotatedType(); + final AnnotationManager annotationManager = getWebBeansContext().getAnnotationManager(); + final Collection<Annotation> annotations = new HashSet<>(); + annotations.addAll(annotationManager.getInterceptorAnnotations(annotatedType.getAnnotations())); + final Set<AnnotatedMethod<?>> methods = annotatedType.getMethods(); + for (final AnnotatedMethod<?> m : methods) { + if (timeout.equals(m.getJavaMember())) { + annotations.addAll(annotationManager.getInterceptorAnnotations(m.getAnnotations())); + break; + } + } + for (final Interceptor<?> timeoutInterceptor : getWebBeansContext().getBeanManagerImpl() + .resolveInterceptors(InterceptionType.AROUND_TIMEOUT, AnnotationUtil.asArray(annotations))) { + if (isEjbInterceptor(timeoutInterceptor)) { + continue; + } + final InterceptorData data = createInterceptorData(timeoutInterceptor); + addCdiMethodInterceptor(timeout, data); + } + } } private boolean isEjbInterceptor(final Interceptor<?> pc) { http://git-wip-us.apache.org/repos/asf/tomee/blob/3e40a2fe/tck/cdi-embedded/src/test/java/org/apache/openejb/tck/cdi/embedded/CleanUpAssembler.java ---------------------------------------------------------------------- diff --git a/tck/cdi-embedded/src/test/java/org/apache/openejb/tck/cdi/embedded/CleanUpAssembler.java b/tck/cdi-embedded/src/test/java/org/apache/openejb/tck/cdi/embedded/CleanUpAssembler.java index 1db29af..c31bd36 100644 --- a/tck/cdi-embedded/src/test/java/org/apache/openejb/tck/cdi/embedded/CleanUpAssembler.java +++ b/tck/cdi-embedded/src/test/java/org/apache/openejb/tck/cdi/embedded/CleanUpAssembler.java @@ -19,12 +19,16 @@ package org.apache.openejb.tck.cdi.embedded; import org.apache.openejb.UndeployException; import org.apache.openejb.assembler.classic.AppInfo; import org.apache.openejb.assembler.classic.Assembler; +import org.apache.openejb.loader.SystemInstance; +import org.apache.openejb.spi.ContainerSystem; import org.jboss.cdi.tck.util.ActionSequence; public class CleanUpAssembler extends Assembler { @Override public void destroyApplication(final AppInfo appInfo) throws UndeployException { super.destroyApplication(appInfo); - ActionSequence.reset(); + if (SystemInstance.get().getComponent(ContainerSystem.class).getAppContexts().isEmpty()) { + ActionSequence.reset(); + } } } http://git-wip-us.apache.org/repos/asf/tomee/blob/3e40a2fe/tck/cdi-embedded/src/test/resources/failing.xml ---------------------------------------------------------------------- diff --git a/tck/cdi-embedded/src/test/resources/failing.xml b/tck/cdi-embedded/src/test/resources/failing.xml index 4d6b027..29c6d9b 100644 --- a/tck/cdi-embedded/src/test/resources/failing.xml +++ b/tck/cdi-embedded/src/test/resources/failing.xml @@ -31,11 +31,7 @@ -Dopenejb.embedded.try-jsp=true --> <classes> - <!-- - org.jboss.cdi.tck.interceptors.tests.contract.aroundTimeout.bindings.AroundTimeoutOrderInterceptorTest - org.jboss.cdi.tck.tests.extensions.lifecycle.processInjectionTarget.ContainerEventTest - --> - <class name="org.jboss.cdi.tck.tests.deployment.discovery.BeanDiscoveryTest" /> + <class name="org.jboss.cdi.tck.interceptors.tests.contract.aroundTimeout.bindings.AroundTimeoutOrderInterceptorTest" /> </classes> </test> </suite>