From 558ae7cc160a41e6743eba816bb5a76b280e71eb Mon Sep 17 00:00:00 2001 From: Jozef Hartinger Date: Thu, 4 Sep 2014 09:28:21 +0200 Subject: [PATCH 1/2] Testcase for WELD-1736 --- .../unit/ejb/subclass/BarInterceptor.java | 10 +++++++ .../ejb/subclass/BarInterceptorBinding.java | 3 +- .../weld/tests/unit/ejb/subclass/Foo.java | 1 + .../SubclassedComponentDescriptorTest.java | 29 +++++++++++++++---- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/BarInterceptor.java b/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/BarInterceptor.java index 2aad52915be..0520c48ed3c 100644 --- a/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/BarInterceptor.java +++ b/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/BarInterceptor.java @@ -17,6 +17,7 @@ package org.jboss.weld.tests.unit.ejb.subclass; import javax.annotation.Priority; +import javax.interceptor.AroundConstruct; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; import javax.interceptor.InvocationContext; @@ -26,6 +27,15 @@ @BarInterceptorBinding public class BarInterceptor { + @AroundConstruct + public void aroundConstruct(InvocationContext ctx) { + try { + ctx.proceed(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @AroundInvoke public Object alwaysReturnThis(InvocationContext ctx) throws Exception { return ctx.proceed(); diff --git a/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/BarInterceptorBinding.java b/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/BarInterceptorBinding.java index 6e41f0574e7..07375be87b6 100644 --- a/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/BarInterceptorBinding.java +++ b/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/BarInterceptorBinding.java @@ -16,6 +16,7 @@ */ package org.jboss.weld.tests.unit.ejb.subclass; +import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; @@ -27,7 +28,7 @@ import javax.interceptor.InterceptorBinding; -@Target({ TYPE, METHOD }) +@Target({ TYPE, METHOD, CONSTRUCTOR }) @Retention(RUNTIME) @Documented @Inherited diff --git a/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/Foo.java b/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/Foo.java index b262f363ac6..77b5e6d1c3b 100644 --- a/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/Foo.java +++ b/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/Foo.java @@ -29,6 +29,7 @@ public Foo() { } @Inject + @BarInterceptorBinding public Foo(BeanManager manager) { this.manager = manager; } diff --git a/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/SubclassedComponentDescriptorTest.java b/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/SubclassedComponentDescriptorTest.java index 6121dbfddd1..bc8a579a199 100644 --- a/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/SubclassedComponentDescriptorTest.java +++ b/tests/src/test/java/org/jboss/weld/tests/unit/ejb/subclass/SubclassedComponentDescriptorTest.java @@ -34,10 +34,13 @@ import org.jboss.weld.ejb.spi.EjbDescriptor; import org.jboss.weld.ejb.spi.EjbServices; import org.jboss.weld.ejb.spi.SubclassedComponentDescriptor; +import org.jboss.weld.injection.producer.ejb.SessionBeanInjectionTarget; +import org.jboss.weld.interceptor.spi.model.InterceptionModel; import org.jboss.weld.manager.BeanManagerImpl; import org.jboss.weld.mock.AbstractDeployment; import org.jboss.weld.mock.MockEjbServices; import org.jboss.weld.util.reflection.Reflections; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.google.common.collect.ImmutableSet; @@ -51,9 +54,10 @@ */ public class SubclassedComponentDescriptorTest { - @Test - public void testSubclassedComponentDescriptor() { + private BeanManagerImpl manager; + @BeforeClass + public void prepareContainer() { final EjbDescriptor fooDescriptor = new EjbDescriptorImpl(Foo.class, Foo.class, EnhancedFoo.class, SessionBeanType.STATEFUL); final EjbDescriptor barDescriptor = new EjbDescriptorImpl(Bar.class, BarLocal.class, EnhancedBar.class, SessionBeanType.STATEFUL); final EjbDescriptor bazDescriptor = new EjbDescriptorImpl(Baz.class, Baz.class, EnhancedBaz.class, null); @@ -87,7 +91,11 @@ protected void configureServices() { }; final TestContainer container = new TestContainer(deployment).startContainer(); - final BeanManagerImpl manager = (BeanManagerImpl) container.getBeanManager(bda); + manager = (BeanManagerImpl) container.getBeanManager(bda); + } + + @Test + public void testSubclassedComponentDescriptor() { Foo foo = (Foo) manager.createInjectionTarget(manager.getEjbDescriptor(Foo.class.getSimpleName())).produce(manager.createCreationalContext(null)); Bar bar = (Bar) manager.createInjectionTarget(manager.getEjbDescriptor(Bar.class.getSimpleName())).produce(manager.createCreationalContext(null)); Baz baz = (Baz) manager.createInjectionTarget(manager.getEjbDescriptor(Baz.class.getSimpleName())).produce(manager.createCreationalContext(null)); @@ -105,12 +113,21 @@ protected void configureServices() { assertTrue(baz instanceof Enhanced); assertTrue(Reflections.cast(baz).check()); - assertEquals(MockEjbServices.getDescriptors().size(), 1); - assertEquals(MockEjbServices.getDescriptors().iterator().next().getBeanClass(), Bar.class); - assertNotNull(foo.getManager()); assertNotNull(bar.getManager()); assertNotNull(baz.getManager()); + + assertEquals(MockEjbServices.getDescriptors().size(), 2); + assertTrue(MockEjbServices.getDescriptors().contains(manager.getEjbDescriptor(Foo.class.getSimpleName()))); + assertTrue(MockEjbServices.getDescriptors().contains(manager.getEjbDescriptor(Bar.class.getSimpleName()))); + } + + @Test + public void testInterceptionModelForConstructor() { + SessionBeanInjectionTarget it = (SessionBeanInjectionTarget) manager.createInjectionTarget(manager.getEjbDescriptor(Foo.class.getSimpleName())); + InterceptionModel model = manager.getInterceptorModelRegistry().get(it.getAnnotated()); + assertNotNull(model); + assertTrue(model.hasExternalConstructorInterceptors()); } private static class EjbDescriptorImpl implements EjbDescriptor, SubclassedComponentDescriptor { From 0269913a772843255b9e1388ad541e2a423d5a6d Mon Sep 17 00:00:00 2001 From: Jozef Hartinger Date: Thu, 4 Sep 2014 09:29:20 +0200 Subject: [PATCH 2/2] WELD-1736 Session bean's subclass constructor used for building interception model --- .../weld/injection/producer/BeanInjectionTarget.java | 6 +++++- .../producer/ejb/SessionBeanInjectionTarget.java | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/impl/src/main/java/org/jboss/weld/injection/producer/BeanInjectionTarget.java b/impl/src/main/java/org/jboss/weld/injection/producer/BeanInjectionTarget.java index 1ef246472ca..4b0256ed986 100644 --- a/impl/src/main/java/org/jboss/weld/injection/producer/BeanInjectionTarget.java +++ b/impl/src/main/java/org/jboss/weld/injection/producer/BeanInjectionTarget.java @@ -103,10 +103,14 @@ protected void initializeInterceptionModel(EnhancedAnnotatedType annotatedTyp return; // this is a non-producible InjectionTarget (only created to inject existing instances) } if (isInterceptionCandidate() && !beanManager.getInterceptorModelRegistry().containsKey(getType())) { - new InterceptionModelInitializer(beanManager, annotatedType, instantiator.getConstructorInjectionPoint().getAnnotated(), getBean()).init(); + buildInterceptionModel(annotatedType, instantiator); } } + protected void buildInterceptionModel(EnhancedAnnotatedType annotatedType, AbstractInstantiator instantiator) { + new InterceptionModelInitializer(beanManager, annotatedType, instantiator.getConstructorInjectionPoint().getAnnotated(), getBean()).init(); + } + @Override public void initializeAfterBeanDiscovery(EnhancedAnnotatedType annotatedType) { initializeInterceptionModel(annotatedType); diff --git a/impl/src/main/java/org/jboss/weld/injection/producer/ejb/SessionBeanInjectionTarget.java b/impl/src/main/java/org/jboss/weld/injection/producer/ejb/SessionBeanInjectionTarget.java index d5f73c74096..2341459170f 100644 --- a/impl/src/main/java/org/jboss/weld/injection/producer/ejb/SessionBeanInjectionTarget.java +++ b/impl/src/main/java/org/jboss/weld/injection/producer/ejb/SessionBeanInjectionTarget.java @@ -26,6 +26,7 @@ import javax.enterprise.inject.spi.Decorator; import javax.enterprise.inject.spi.InjectionPoint; +import org.jboss.weld.annotated.enhanced.EnhancedAnnotatedConstructor; import org.jboss.weld.annotated.enhanced.EnhancedAnnotatedType; import org.jboss.weld.bean.SessionBean; import org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler; @@ -38,6 +39,7 @@ import org.jboss.weld.injection.producer.DefaultLifecycleCallbackInvoker; import org.jboss.weld.injection.producer.Injector; import org.jboss.weld.injection.producer.Instantiator; +import org.jboss.weld.injection.producer.InterceptionModelInitializer; import org.jboss.weld.injection.producer.LifecycleCallbackInvoker; import org.jboss.weld.injection.producer.StatelessSessionBeanInjector; import org.jboss.weld.injection.producer.SubclassDecoratorApplyingInstantiator; @@ -109,6 +111,16 @@ public void initializeAfterBeanDiscovery(EnhancedAnnotatedType annotatedType) setupConstructorInterceptionInstantiator(beanManager.getInterceptorModelRegistry().get(getType())); } + @Override + protected void buildInterceptionModel(EnhancedAnnotatedType annotatedType, AbstractInstantiator instantiator) { + /* + * instantiator.getConstructorInjectionPoint() may represent the constructor of the SessionBean subclass which may not have annotations applied + * Therefore, use the component class constructor instead of the one from subclass. + */ + EnhancedAnnotatedConstructor constructor = annotatedType.getDeclaredEnhancedConstructor(instantiator.getConstructorInjectionPoint().getSignature()); + new InterceptionModelInitializer(beanManager, annotatedType, constructor, getBean()).init(); + } + @Override public T produce(CreationalContext ctx) { T result = super.produce(ctx);