Author: rmannibucau Date: Wed Apr 24 12:28:36 2013 New Revision: 1471383 URL: http://svn.apache.org/r1471383 Log: TOMEE-909 getting rid of CdiInterceptor
Removed: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiInterceptor.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/EjbModule.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java tomee/tomee/trunk/container/openejb-core/src/main/resources/META-INF/scan.xml tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulConstructorInjectionTest.java tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessConstructorInjectionTest.java tomee/tomee/trunk/tck/cdi-embedded/src/test/resources/failing.xml Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1471383&r1=1471382&r2=1471383&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java Wed Apr 24 12:28:36 2013 @@ -49,8 +49,10 @@ import org.apache.webbeans.config.WebBea import org.apache.webbeans.container.BeanManagerImpl; import org.apache.webbeans.context.creational.CreationalContextImpl; import org.apache.webbeans.inject.OWBInjector; +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.xbean.recipe.ConstructionException; import javax.ejb.EJBHome; @@ -63,8 +65,8 @@ import javax.ejb.MessageDrivenBean; import javax.ejb.TimedObject; import javax.ejb.Timer; import javax.enterprise.context.ConversationScoped; -import javax.enterprise.context.Dependent; import javax.enterprise.context.spi.CreationalContext; +import javax.enterprise.inject.spi.Decorator; import javax.enterprise.inject.spi.Interceptor; import javax.naming.Context; import javax.naming.Name; @@ -1412,27 +1414,32 @@ public class BeanContext extends Deploym } try { - final Context ctx = this.getJndiEnc(); - final Class beanClass = this.getBeanClass(); + final Context ctx = getJndiEnc(); + final Class beanClass = getBeanClass(); final CurrentCreationalContext<Object> currentCreationalContext = get(CurrentCreationalContext.class); CreationalContext<Object> creationalContext = (currentCreationalContext != null) ? currentCreationalContext.get() : null; - final ConstructorInjectionBean<Object> beanDefinition = createConstructorInjectionBean(webBeansContext); - if (creationalContext == null) { - creationalContext = webBeansContext.getBeanManagerImpl().createCreationalContext(beanDefinition); + final CdiEjbBean cdiEjbBean = get(CdiEjbBean.class); + + if (!CreationalContextImpl.class.isInstance(creationalContext)) { + if (creationalContext == null) { + creationalContext = webBeansContext.getCreationalContextFactory().getCreationalContext(cdiEjbBean); + } else { + creationalContext = webBeansContext.getCreationalContextFactory().wrappedCreationalContext(creationalContext, cdiEjbBean); + } } - final Object rootInstance; - final CdiEjbBean cdiEjbBean = get(CdiEjbBean.class); + Object rootInstance; if (cdiEjbBean != null && CdiEjbBean.EjbInjectionTargetImpl.class.isInstance(cdiEjbBean.getInjectionTarget())) { rootInstance = CdiEjbBean.EjbInjectionTargetImpl.class.cast(cdiEjbBean.getInjectionTarget()).createNewPojo(creationalContext); - } else { - rootInstance = beanDefinition.create(creationalContext); + } else { // not a cdi bean + rootInstance = getManagedClass().newInstance(); } // Create bean instance - final Object beanInstance; + Object beanInstance; + final InjectionProcessor injectionProcessor; if (!isDynamicallyImplemented()) { injectionProcessor = new InjectionProcessor(rootInstance, getInjections(), InjectionProcessor.unwrap(ctx)); @@ -1443,7 +1450,7 @@ public class BeanContext extends Deploym final List<Injection> newInjections = new ArrayList<Injection>(); for (final Injection injection : getInjections()) { if (beanClass.equals(injection.getTarget())) { - final Injection updated = new Injection(injection.getJndiName(), injection.getName(), beanDefinition.getBeanClass()); + final Injection updated = new Injection(injection.getJndiName(), injection.getName(), proxyClass); newInjections.add(updated); } else { newInjections.add(injection); @@ -1452,7 +1459,7 @@ public class BeanContext extends Deploym injections.clear(); injections.addAll(newInjections); - injectionProcessor = new InjectionProcessor(beanDefinition.create(creationalContext), injections, InjectionProcessor.unwrap(ctx)); + injectionProcessor = new InjectionProcessor(rootInstance, injections, InjectionProcessor.unwrap(ctx)); final InvocationHandler handler = (InvocationHandler) injectionProcessor.createInstance(); beanInstance = DynamicProxyImplFactory.newProxy(this, handler); inject(handler, creationalContext); @@ -1480,7 +1487,7 @@ public class BeanContext extends Deploym final Object interceptorInstance = interceptorInjector.createInstance(); try { OWBInjector.inject(webBeansContext.getBeanManagerImpl(), interceptorInstance, creationalContext); - } catch (Throwable t) { + } catch (final Throwable t) { // TODO handle this differently // this is temporary till the injector can be rewritten } @@ -1525,6 +1532,29 @@ public class BeanContext extends Deploym EjbTransactionUtil.afterInvoke(transactionPolicy, callContext); } + // handle cdi decorators + if (cdiEjbBean != null) { + final Class<?> proxyClass = Class.class.cast(Reflections.get(cdiEjbBean.getInjectionTarget(), "proxyClass")); + if (proxyClass != null) { // means interception + final InterceptorResolutionService.BeanInterceptorInfo interceptorInfo = cdiEjbBean.getBeanContext().get(InterceptorResolutionService.BeanInterceptorInfo.class); + if (interceptorInfo.getDecorators() != null && !interceptorInfo.getDecorators().isEmpty()) { + final InterceptorDecoratorProxyFactory pf = webBeansContext.getInterceptorDecoratorProxyFactory(); + + // decorators + final Object instance = beanInstance; + final List<Decorator<?>> decorators = interceptorInfo.getDecorators(); + final Map<Decorator<?>, Object> instances = new HashMap<Decorator<?>, Object>(); + for (int i = decorators.size(); i > 0; i--) { + final Decorator<?> decorator = decorators.get(i - 1); + CreationalContextImpl.class.cast(creationalContext).putDelegate(beanInstance); + final Object decoratorInstance = decorator.create(CreationalContext.class.cast(creationalContext)); + instances.put(decorator, decoratorInstance); + beanInstance = pf.createProxyInstance(proxyClass, instance, new DecoratorHandler(interceptorInfo, instances, i - 1, instance)); + } + } + } + } + return new InstanceContext(this, beanInstance, interceptorInstances, creationalContext); } finally { ThreadContext.exit(oldContext); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java?rev=1471383&r1=1471382&r2=1471383&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java Wed Apr 24 12:28:36 2013 @@ -345,7 +345,7 @@ public class CdiEjbBean<T> extends BaseE } public T createNewPojo(final CreationalContext<T> creationalContext) { - return super.produce(creationalContext); + return super.newInstance(CreationalContextImpl.class.cast(creationalContext)); } } } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java?rev=1471383&r1=1471382&r2=1471383&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java Wed Apr 24 12:28:36 2013 @@ -282,7 +282,6 @@ public class CdiPlugin extends AbstractO bc.set(CdiEjbBean.class, bean); bc.set(CurrentCreationalContext.class, new CurrentCreationalContext()); - bc.addSystemInterceptor(new CdiInterceptor<T>(bean)); validateDisposeMethods(bean); validateScope(bean); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/EjbModule.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/EjbModule.java?rev=1471383&r1=1471382&r2=1471383&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/EjbModule.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/EjbModule.java Wed Apr 24 12:28:36 2013 @@ -186,6 +186,14 @@ public class EjbModule extends Module im this.webapp = webapp; } + // just a helper method to activate cdi + public EjbModule withCdi() { + if (beans == null) { + beans = new Beans(); + } + return this; + } + @Override public String toString() { return "EjbModule{" + Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?rev=1471383&r1=1471382&r2=1471383&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java Wed Apr 24 12:28:36 2013 @@ -468,9 +468,12 @@ public class StatefulContainer implement if (primKey == null) throw new NullPointerException("primKey is null"); - final Class scope = beanContext.get(CdiEjbBean.class).getScope(); - if (callMethod.getDeclaringClass() != BeanContext.Removable.class && scope != Dependent.class) { - throw new UnsupportedOperationException("Can not call EJB Stateful Bean Remove Method without scoped @Dependent. Found scope: @" + scope.getSimpleName()); + final CdiEjbBean cdiEjbBean = beanContext.get(CdiEjbBean.class); + if (cdiEjbBean != null) { + final Class scope = cdiEjbBean.getScope(); + if (callMethod.getDeclaringClass() != BeanContext.Removable.class && scope != Dependent.class) { + throw new UnsupportedOperationException("Can not call EJB Stateful Bean Remove Method without scoped @Dependent. Found scope: @" + scope.getSimpleName()); + } } final boolean internalRemove = BeanContext.Removable.class == callMethod.getDeclaringClass(); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java?rev=1471383&r1=1471382&r2=1471383&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/DynamicProxyImplFactory.java Wed Apr 24 12:28:36 2013 @@ -38,9 +38,9 @@ public class DynamicProxyImplFactory { } public static Object newProxy(BeanContext context, java.lang.reflect.InvocationHandler invocationHandler) { - if (invocationHandler instanceof QueryProxy) { + if (QueryProxy.class.isInstance(invocationHandler)) { EntityManager em = null; - for (Injection injection : context.getInjections()) { + for (final Injection injection : context.getInjections()) { if (QueryProxy.class.equals(injection.getTarget())) { try { em = (EntityManager) context.getJndiEnc().lookup(injection.getJndiName()); @@ -52,7 +52,7 @@ public class DynamicProxyImplFactory { if (em == null) { throw new OpenEJBRuntimeException("can't find the entity manager to use for the dynamic bean " + context.getEjbName()); } - ((QueryProxy) invocationHandler).setEntityManager(em); + QueryProxy.class.cast(invocationHandler).setEntityManager(em); } try { Modified: tomee/tomee/trunk/container/openejb-core/src/main/resources/META-INF/scan.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/resources/META-INF/scan.xml?rev=1471383&r1=1471382&r2=1471383&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/resources/META-INF/scan.xml (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/resources/META-INF/scan.xml Wed Apr 24 12:28:36 2013 @@ -22,7 +22,6 @@ <class>org.apache.openejb.assembler.monitoring.JMXDeployer</class> <class>org.apache.openejb.assembler.classic.cmd.ConfigurationInfoEjb</class> <class>org.apache.openejb.bval.BeanValidationAppendixInterceptor</class> - <class>org.apache.openejb.cdi.CdiInterceptor</class> <class>org.apache.openejb.mgmt.MEJBBean</class> <class>org.apache.openejb.monitoring.StatsInterceptor</class> </classes> Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulConstructorInjectionTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulConstructorInjectionTest.java?rev=1471383&r1=1471382&r2=1471383&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulConstructorInjectionTest.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulConstructorInjectionTest.java Wed Apr 24 12:28:36 2013 @@ -21,7 +21,9 @@ import org.apache.openejb.assembler.clas import org.apache.openejb.assembler.classic.SecurityServiceInfo; import org.apache.openejb.assembler.classic.TransactionServiceInfo; import org.apache.openejb.config.ConfigurationFactory; +import org.apache.openejb.config.EjbModule; import org.apache.openejb.core.ivm.naming.InitContextFactory; +import org.apache.openejb.jee.Beans; import org.apache.openejb.jee.EjbJar; import org.apache.openejb.jee.EnvEntry; import org.apache.openejb.jee.StatefulBean; @@ -69,8 +71,10 @@ public class StatefulConstructorInjectio StatefulBean bean = ejbJar.addEnterpriseBean(new StatefulBean(WidgetBean.class)); bean.getEnvEntry().add(new EnvEntry("count", Integer.class.getName(), "10")); + final EjbModule module = new EjbModule(ejbJar); + module.setBeans(new Beans()); - assembler.createApplication(config.configureApplication(ejbJar)); + assembler.createApplication(config.configureApplication(module)); } Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessConstructorInjectionTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessConstructorInjectionTest.java?rev=1471383&r1=1471382&r2=1471383&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessConstructorInjectionTest.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessConstructorInjectionTest.java Wed Apr 24 12:28:36 2013 @@ -28,6 +28,7 @@ import java.util.List; import java.util.Arrays; import java.util.Stack; +import org.apache.openejb.config.EjbModule; import org.apache.openejb.core.ivm.naming.InitContextFactory; import org.apache.openejb.config.ConfigurationFactory; import org.apache.openejb.assembler.classic.Assembler; @@ -80,8 +81,7 @@ public class StatelessConstructorInjecti StatelessBean bean = ejbJar.addEnterpriseBean(new StatelessBean(WidgetBean.class)); bean.getEnvEntry().add(new EnvEntry("count", Integer.class.getName(), "10")); - - assembler.createApplication(config.configureApplication(ejbJar)); + assembler.createApplication(config.configureApplication(new EjbModule(ejbJar).withCdi())); } Modified: tomee/tomee/trunk/tck/cdi-embedded/src/test/resources/failing.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tck/cdi-embedded/src/test/resources/failing.xml?rev=1471383&r1=1471382&r2=1471383&view=diff ============================================================================== --- tomee/tomee/trunk/tck/cdi-embedded/src/test/resources/failing.xml (original) +++ tomee/tomee/trunk/tck/cdi-embedded/src/test/resources/failing.xml Wed Apr 24 12:28:36 2013 @@ -18,7 +18,7 @@ <suite name="CDI TCK" verbose="0"> <test name="CDI TCK"> <classes> - <class name="org.jboss.jsr299.tck.tests.event.observer.enterprise.EnterpriseEventInheritenceTest"/> + <class name="org.jboss.jsr299.tck.tests.decorators.invocation.EJBDecoratorInvocationTest"/> </classes> </test> </suite>