Return-Path: X-Original-To: apmail-openejb-commits-archive@www.apache.org Delivered-To: apmail-openejb-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 9A1B263E5 for ; Sun, 26 Jun 2011 07:36:10 +0000 (UTC) Received: (qmail 57956 invoked by uid 500); 26 Jun 2011 07:36:10 -0000 Delivered-To: apmail-openejb-commits-archive@openejb.apache.org Received: (qmail 57874 invoked by uid 500); 26 Jun 2011 07:35:59 -0000 Mailing-List: contact commits-help@openejb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openejb.apache.org Delivered-To: mailing list commits@openejb.apache.org Received: (qmail 57863 invoked by uid 99); 26 Jun 2011 07:35:48 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 26 Jun 2011 07:35:48 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 26 Jun 2011 07:35:43 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 1997823888C2 for ; Sun, 26 Jun 2011 07:35:21 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1139723 - in /openejb/trunk/openejb3: container/openejb-core/src/main/java/org/apache/openejb/ container/openejb-core/src/main/java/org/apache/openejb/cdi/ container/openejb-core/src/test/java/org/apache/openejb/cdi/ tck/cdi-embedded/src/t... Date: Sun, 26 Jun 2011 07:35:20 -0000 To: commits@openejb.apache.org From: dblevins@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110626073521.1997823888C2@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: dblevins Date: Sun Jun 26 07:35:20 2011 New Revision: 1139723 URL: http://svn.apache.org/viewvc?rev=1139723&view=rev Log: OPENEJB-1586: @Dependent instances of an EJB removed when EJB is removed Added: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/cdi/DependentScopedTest.java - copied, changed from r1139700, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/cdi/ApplicationScopedTest.java Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java openejb/trunk/openejb3/tck/cdi-embedded/src/test/resources/all-failing.xml openejb/trunk/openejb3/tck/cdi-embedded/src/test/resources/passing.xml Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1139723&r1=1139722&r2=1139723&view=diff ============================================================================== --- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java (original) +++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java Sun Jun 26 07:35:20 2011 @@ -38,7 +38,10 @@ import javax.ejb.LockType; import javax.ejb.MessageDrivenBean; import javax.ejb.TimedObject; import javax.ejb.Timer; +import javax.enterprise.context.Dependent; +import javax.enterprise.context.spi.Contextual; import javax.enterprise.context.spi.CreationalContext; +import javax.enterprise.inject.spi.Bean; import javax.naming.Context; import javax.persistence.EntityManagerFactory; @@ -65,7 +68,12 @@ import org.apache.openejb.util.Index; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; import org.apache.webbeans.component.AbstractInjectionTargetBean; +import org.apache.webbeans.component.EnterpriseBeanMarker; +import org.apache.webbeans.component.InjectionTargetBean; import org.apache.webbeans.config.WebBeansContext; +import org.apache.webbeans.context.creational.CreationalContextImpl; +import org.apache.webbeans.inject.AbstractInjectable; +import org.apache.webbeans.proxy.JavassistProxyFactory; import org.apache.xbean.recipe.ConstructionException; @@ -1217,10 +1225,7 @@ public class BeanContext extends Deploym final Object beanInstance = injectionProcessor.createInstance(); - beanDefinition.injectSuperFields(beanInstance, creationalContext); - beanDefinition.injectSuperMethods(beanInstance, creationalContext); - beanDefinition.injectFields(beanInstance, creationalContext); - beanDefinition.injectMethods(beanInstance, creationalContext); + inject(beanInstance, creationalContext); // Create interceptors final HashMap interceptorInstances = new HashMap(); @@ -1299,6 +1304,68 @@ public class BeanContext extends Deploym } } + protected X getBean(Class clazz, Bean bean) + { + return clazz.cast(bean); + } + + public void inject(T instance, CreationalContext ctx) + { + + WebBeansContext webBeansContext = getModuleContext().getAppContext().getWebBeansContext(); + + AbstractInjectionTargetBean beanDefinition = get(CdiEjbBean.class); + + final ConstructorInjectionBean beanConstructor = new ConstructorInjectionBean(webBeansContext, beanClass); + + if (beanDefinition == null) { + beanDefinition = beanConstructor; + } + + if(!(ctx instanceof CreationalContextImpl)) + { + ctx = webBeansContext.getCreationalContextFactory().wrappedCreationalContext(ctx, beanDefinition); + } + + Object oldInstanceUnderInjection = AbstractInjectable.instanceUnderInjection.get(); + boolean isInjectionToAnotherBean = false; + try + { + Contextual contextual = null; + if(ctx instanceof CreationalContextImpl) + { + contextual = ((CreationalContextImpl)ctx).getBean(); + isInjectionToAnotherBean = contextual == getBean(InjectionTargetBean.class, beanDefinition) ? false : true; + } + + if(!isInjectionToAnotherBean) + { + AbstractInjectable.instanceUnderInjection.set(instance); + } + + InjectionTargetBean bean = getBean(InjectionTargetBean.class, beanDefinition); + + bean.injectResources(instance, ctx); + bean.injectSuperFields(instance, ctx); + bean.injectSuperMethods(instance, ctx); + bean.injectFields(instance, ctx); + bean.injectMethods(instance, ctx); + } + finally + { + if(oldInstanceUnderInjection != null) + { + AbstractInjectable.instanceUnderInjection.set(oldInstanceUnderInjection); + } + else + { + AbstractInjectable.instanceUnderInjection.set(null); + AbstractInjectable.instanceUnderInjection.remove(); + } + } + + } + public Set> getAsynchronousClasses() { return asynchronousClasses; } Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java?rev=1139723&r1=1139722&r2=1139723&view=diff ============================================================================== --- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java (original) +++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiEjbBean.java Sun Jun 26 07:35:20 2011 @@ -175,6 +175,13 @@ public class CdiEjbBean extends BaseE return points; } + /* (non-Javadoc) + * @see org.apache.webbeans.component.AbstractBean#isPassivationCapable() + */ + @Override + public boolean isPassivationCapable() { + return getWebBeansContext().getBeanManagerImpl().isPassivatingScope(getScope()); + } @SuppressWarnings("unchecked") private List findRemove(Class beanClass, Class beanInterface) { Copied: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/cdi/DependentScopedTest.java (from r1139700, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/cdi/ApplicationScopedTest.java) URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/cdi/DependentScopedTest.java?p2=openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/cdi/DependentScopedTest.java&p1=openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/cdi/ApplicationScopedTest.java&r1=1139700&r2=1139723&rev=1139723&view=diff ============================================================================== --- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/cdi/ApplicationScopedTest.java (original) +++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/cdi/DependentScopedTest.java Sun Jun 26 07:35:20 2011 @@ -25,233 +25,152 @@ import org.apache.openejb.junit.Module; import org.junit.Test; import org.junit.runner.RunWith; -import javax.ejb.Local; -import javax.ejb.Stateful; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.context.spi.Context; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; /** * @version $Rev$ $Date$ */ @RunWith(ApplicationComposer.class) -public class ApplicationScopedTest extends TestCase { +public class DependentScopedTest extends TestCase { @Inject private BeanManager beanManager; @Test public void test() throws Exception { + created.clear(); + destroyed.clear(); - final Context appContext = beanManager.getContext(ApplicationScoped.class); + final Bean colorWheelBean = getBean(ColorWheelLocal.class); + final CreationalContext creationalContext = beanManager.createCreationalContext(colorWheelBean); + final ColorWheelLocal colorWheel = colorWheelBean.create(creationalContext); - final Green green = createAndMutate(appContext, Green.class); + assertEquals(6, created.size()); - final Blue blue = createAndMutate(appContext, Blue.class); + assertEquals(6, colorWheel.getColors().size()); - assertEquals(green.getMessage(), blue.getGreen().getMessage()); + colorWheelBean.destroy(colorWheel, creationalContext); - final BrownLocal brownLocal = createAndMutate(appContext, BrownLocal.class); + assertEquals(6, destroyed.size()); - final Green green2 = brownLocal.getGreen(); - green2.getMessage(); - - final Orange orange = createAndMutate(appContext, Orange.class); - assertNotNull(orange); - assertNotNull(orange.getBlue()); - assertNotNull(orange.getBlue().getGreen()); - assertNotNull(orange.getGreen()); - - final Green greenA = orange.getBlue().getGreen(); - final Green greenB = orange.getGreen(); - - assertSame(greenA, greenB); } - private T createAndMutate(Context context, Class beanType) { - - final Bean bean = (Bean) beanManager.getBeans(beanType).iterator().next(); - - // We haven't created anything yet, so the instance should not exist in the context - assertNull(context.get(bean)); - - - final CreationalContext cc1 = beanManager.createCreationalContext(bean); - - // This should create the instance and put it in the context - final T instance = context.get(bean, cc1); - - - // Assert the instance is now in the context and can be generically retrieved - assertNotNull(context.get(bean)); - - - final String prefix = beanType.getSimpleName(); - - // Mutate the instance... - instance.setMessage(prefix + ": hello application"); - - // Now check the reference in the context - assertEquals(prefix + ": hello application", context.get(bean, cc1).getMessage()); - - // Attempt to create a second instance (should not work) - final CreationalContext cc2 = beanManager.createCreationalContext(bean); - - // We should still have the same mutated instance as before - assertEquals(prefix + ": hello application", context.get(bean, cc2).getMessage()); - - // Mutate the instance one more time - instance.setMessage(prefix + ": hello again application"); - - // And double check that we still just have the single instance in the context - assertEquals(prefix + ": hello again application", context.get(bean).getMessage()); - assertEquals(prefix + ": hello again application", context.get(bean, null).getMessage()); - assertEquals(prefix + ": hello again application", context.get(bean, cc1).getMessage()); - assertEquals(prefix + ": hello again application", context.get(bean, cc2).getMessage()); - - return instance; + private Bean getBean(Class beanType) { + return (Bean) beanManager.getBeans(beanType).iterator().next(); } + @Module public SessionBean getEjbs() { - return new StatefulBean(Brown.class); + return new StatefulBean(ColorWheel.class); } @Module public Beans getBeans() { final Beans beans = new Beans(); +// beans.addManagedClass(ColorWheel.class); + beans.addManagedClass(Red.class); beans.addManagedClass(Orange.class); - beans.addManagedClass(Blue.class); + beans.addManagedClass(Yellow.class); beans.addManagedClass(Green.class); + beans.addManagedClass(Blue.class); + beans.addManagedClass(Violet.class); return beans; } - @Local - public static interface BrownLocal extends Message { + public static final List destroyed = new ArrayList(); + public static final List created = new ArrayList(); - public Green getGreen(); + public static interface ColorWheelLocal { + public List getColors(); } - @Stateful - @ApplicationScoped - public static class Brown implements BrownLocal { - private String id; - - @Inject - private Green green; + public static class ColorWheel implements ColorWheelLocal { - @Override - public String getMessage() { - return id; - } + private List colors = new ArrayList(); - @Override - public void setMessage(String id) { - this.id = id; - } - - @Override - public Green getGreen() { - return green; + @Inject + public void set(Red color) { + colors.add(color); } - } - - @ApplicationScoped - public static class Orange implements Message { - private String id; - private Blue blue; - - public Orange() { - System.out.println(this.getClass().getName()); + @Inject + public void set(Orange color) { + colors.add(color); } - @Override - public String getMessage() { - return id; + @Inject + public void set(Yellow color) { + colors.add(color); } - @Override - public void setMessage(String id) { - this.id = id; - } @Inject - private Green green; + public void set(Green color) { + colors.add(color); + } @Inject - public void setBlue(Blue blue) { - this.blue = blue; + public void set(Blue color) { + colors.add(color); } - public Blue getBlue() { - return blue; + @Inject + public void set(Violet color) { + colors.add(color); } - public Green getGreen() { - return green; + public List getColors() { + return colors; } } - @ApplicationScoped - public static class Blue implements Message { - - private String id; - private Green green; - - public Blue() { - System.out.println(this.getClass().getName()); - } + public static class Color { - @Override - public String getMessage() { - return id; + public Class get() { + return getClass(); } - @Override - public void setMessage(String id) { - this.id = id; + @PostConstruct + public void create() { + created.add(getClass()); } - public Green getGreen() { - return green; + @PreDestroy + public void destroy() { + destroyed.add(getClass()); } + } - @Inject - public void setGreen(Green green) { - this.green = green; - } + public static class Red extends Color { } - @ApplicationScoped - public static class Green implements Message { + public static class Orange extends Color { - private String id; + } - public Green() { - "".length(); - System.out.println(this.getClass().getName()); - } + public static class Yellow extends Color { - @Override - public String getMessage() { - return id; - } + } + + public static class Green extends Color { - @Override - public void setMessage(String id) { - this.id = id; - } } - public static interface Message { + public static class Blue extends Color { - void setMessage(String id); + } + + public static class Violet extends Color { - String getMessage(); } + } Modified: openejb/trunk/openejb3/tck/cdi-embedded/src/test/resources/all-failing.xml URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/tck/cdi-embedded/src/test/resources/all-failing.xml?rev=1139723&r1=1139722&r2=1139723&view=diff ============================================================================== --- openejb/trunk/openejb3/tck/cdi-embedded/src/test/resources/all-failing.xml (original) +++ openejb/trunk/openejb3/tck/cdi-embedded/src/test/resources/all-failing.xml Sun Jun 26 07:35:20 2011 @@ -11,9 +11,9 @@ - + Modified: openejb/trunk/openejb3/tck/cdi-embedded/src/test/resources/passing.xml URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/tck/cdi-embedded/src/test/resources/passing.xml?rev=1139723&r1=1139722&r2=1139723&view=diff ============================================================================== --- openejb/trunk/openejb3/tck/cdi-embedded/src/test/resources/passing.xml (original) +++ openejb/trunk/openejb3/tck/cdi-embedded/src/test/resources/passing.xml Sun Jun 26 07:35:20 2011 @@ -60,12 +60,6 @@ - - - - - - @@ -76,6 +70,11 @@ + + + + + @@ -120,7 +119,6 @@ - @@ -144,8 +142,8 @@ - +