Return-Path: X-Original-To: apmail-openwebbeans-commits-archive@www.apache.org Delivered-To: apmail-openwebbeans-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 255EEE5DC for ; Mon, 21 Jan 2013 08:40:20 +0000 (UTC) Received: (qmail 15234 invoked by uid 500); 21 Jan 2013 08:40:20 -0000 Delivered-To: apmail-openwebbeans-commits-archive@openwebbeans.apache.org Received: (qmail 15168 invoked by uid 500); 21 Jan 2013 08:40:18 -0000 Mailing-List: contact commits-help@openwebbeans.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openwebbeans.apache.org Delivered-To: mailing list commits@openwebbeans.apache.org Received: (qmail 15109 invoked by uid 99); 21 Jan 2013 08:40:16 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 21 Jan 2013 08:40:16 +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; Mon, 21 Jan 2013 08:40:14 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id C14F223889E2; Mon, 21 Jan 2013 08:39:48 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1436225 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/component/ main/java/org/apache/webbeans/context/creational/ main/java/org/apache/webbeans/inject/ main/java/org/apache/webbeans/inject/instance/ main/java/o... Date: Mon, 21 Jan 2013 08:39:48 -0000 To: commits@openwebbeans.apache.org From: arne@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130121083948.C14F223889E2@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: arne Date: Mon Jan 21 08:39:47 2013 New Revision: 1436225 URL: http://svn.apache.org/viewvc?rev=1436225&view=rev Log: OWB-344: Fixed handling of creational contexts for dependent objects Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/concepts/alternatives/tests/AlternativeOnProducerFieldTest.java Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java?rev=1436225&r1=1436224&r2=1436225&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java Mon Jan 21 08:39:47 2013 @@ -172,6 +172,10 @@ public abstract class AbstractOwbBean injectionTarget.inject(instance, creationalContext); injectionTarget.postConstruct(instance); } + if (getScope().equals(Dependent.class)) + { + ((CreationalContextImpl)creationalContext).addDependent(this, instance); + } return instance; } catch (Exception re) @@ -205,6 +209,14 @@ public abstract class AbstractOwbBean */ public void destroy(T instance, CreationalContext creationalContext) { + if (getScope().equals(Dependent.class) + && creationalContext instanceof CreationalContextImpl + && ((CreationalContextImpl)creationalContext).containsDependent(this, instance)) + { + // we just have to call release, because release will destroy us since we are @Dependent + creationalContext.release(); + return; + } try { if (producer instanceof InjectionTarget) Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java?rev=1436225&r1=1436224&r2=1436225&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java Mon Jan 21 08:39:47 2013 @@ -129,7 +129,24 @@ public class CreationalContextImpl im } } - + public boolean containsDependent(Contextual contextual, Object instance) + { + if (dependentObjects == null) + { + return false; + } + synchronized (this) + { + for (DependentCreationalContext dependentCreationalContext: dependentObjects) + { + if (dependentCreationalContext.getContextual().equals(contextual) && dependentCreationalContext.getInstance() == instance) + { + return true; + } + } + return false; + } + } @SuppressWarnings("unchecked") public void removeAllDependents() @@ -152,9 +169,8 @@ public class CreationalContextImpl im // we don't use an iterator because the destroyal might register a // fresh PreDestroy interceptor as dependent object... DependentCreationalContext dependent = (DependentCreationalContext) dependentObjects.get(0); - dependent.getContextual().destroy((T) dependent.getInstance(), this); - dependentObjects.remove(0); + dependent.getContextual().destroy((T) dependent.getInstance(), this); maxRemoval--; } Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java?rev=1436225&r1=1436224&r2=1436225&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java Mon Jan 21 08:39:47 2013 @@ -134,12 +134,6 @@ public abstract class AbstractInjectable "into an injection point "+ injectionPoint +" that requires a passivation capable dependency"); } } - - // add this dependent into bean dependent list - if (!WebBeansUtil.isStaticInjection(injectionPoint) && WebBeansUtil.isDependent(injectedBean)) - { - creationalContext.addDependent(injectedBean, injected); - } } finally { Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java?rev=1436225&r1=1436224&r2=1436225&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java Mon Jan 21 08:39:47 2013 @@ -37,7 +37,6 @@ import javax.enterprise.util.TypeLiteral import org.apache.webbeans.config.WebBeansContext; import org.apache.webbeans.container.BeanManagerImpl; import org.apache.webbeans.container.InjectionResolver; -import org.apache.webbeans.context.creational.CreationalContextImpl; import org.apache.webbeans.portable.InjectionPointProducer; import org.apache.webbeans.util.ClassUtil; import org.apache.webbeans.util.InjectionExceptionUtil; @@ -131,11 +130,6 @@ public class InstanceImpl implements } instance = (T) beanManager.getReference(bean, null, creationalContext); - - if (isDependentBean && creationalContext instanceof CreationalContextImpl) - { - ((CreationalContextImpl) creationalContext).addDependent(bean, instance); - } } finally { @@ -245,7 +239,7 @@ public class InstanceImpl implements Annotation[] newQualifiers = getAdditionalQualifiers(qualifiers); - InstanceImpl newInstance = new InstanceImpl(sub, injectionPoint, webBeansContext, parentCreationalContext, newQualifiers); + InstanceImpl newInstance = new InstanceImpl(sub, injectionPoint, webBeansContext, parentCreationalContext, newQualifiers); return newInstance; } Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java?rev=1436225&r1=1436224&r2=1436225&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java Mon Jan 21 08:39:47 2013 @@ -65,7 +65,10 @@ public class InjectionPointProducer exte public static void unsetThreadLocal() { Stack stackIP = getStackOfInjectionPoints(); - stackIP.pop(); + if (!stackIP.isEmpty()) + { + stackIP.pop(); + } } /** Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java?rev=1436225&r1=1436224&r2=1436225&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java Mon Jan 21 08:39:47 2013 @@ -195,13 +195,12 @@ public class InjectionTargetImpl exte { List> decorators = interceptorInfo.getDecorators(); Map, Object> instances = new HashMap, Object>(); + CreationalContextImpl creationalContextImpl = (CreationalContextImpl)creationalContext; for (int i = decorators.size(); i > 0; i--) { Decorator decorator = decorators.get(i - 1); - CreationalContextImpl creationalContextImpl = (CreationalContextImpl)creationalContext; creationalContextImpl.putDelegate(delegate); Object decoratorInstance = decorator.create((CreationalContext) creationalContext); - creationalContextImpl.addDependent(decorator, decoratorInstance); instances.put(decorator, decoratorInstance); delegate = pf.createProxyInstance(proxyClass, instance, new DecoratorHandler(interceptorInfo, instances, i - 1, instance)); } Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java?rev=1436225&r1=1436224&r2=1436225&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java Mon Jan 21 08:39:47 2013 @@ -18,11 +18,8 @@ */ package org.apache.webbeans.portable; -import java.lang.reflect.Modifier; -import java.util.Map; import java.util.Set; -import javax.enterprise.context.Dependent; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.AnnotatedMethod; import javax.enterprise.inject.spi.Bean; @@ -63,9 +60,30 @@ public class ProducerMethodProducer creationalContext) { - CreationalContextImpl context = (CreationalContextImpl)creationalContext; - P ownerInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), creationalContext); - return new InjectableMethod(producerMethod.getJavaMember(), ownerInstance, this, context).doInjection(); + P parentInstance = null; + CreationalContext

parentCreationalContext = null; + InjectableMethod m = null; + try + { + parentCreationalContext = webBeansContext.getBeanManagerImpl().createCreationalContext(owner); + + if (!producerMethod.isStatic()) + { + parentInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), parentCreationalContext); + } + + m = new InjectableMethod(producerMethod.getJavaMember(), parentInstance, this, (CreationalContextImpl) parentCreationalContext); + + return m.doInjection(); + + } + finally + { + if (parentCreationalContext != null) + { + parentCreationalContext.release(); + } + } } @Override @@ -74,18 +92,18 @@ public class ProducerMethodProducer parentCreational = null; + CreationalContext

parentCreationalContext = null; InjectableMethod m = null; try { - parentCreational = webBeansContext.getBeanManagerImpl().createCreationalContext(owner); + parentCreationalContext = webBeansContext.getBeanManagerImpl().createCreationalContext(owner); - if (!Modifier.isStatic(disposalMethod.getJavaMember().getModifiers())) + if (!disposalMethod.isStatic()) { - parentInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), parentCreational); + parentInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), parentCreationalContext); } - m = new InjectableMethod(disposalMethod.getJavaMember(), parentInstance, this, (CreationalContextImpl) parentCreational); + m = new InjectableMethod(disposalMethod.getJavaMember(), parentInstance, this, (CreationalContextImpl) parentCreationalContext); m.setDisposable(true); m.setProducerMethodInstance(instance); @@ -94,22 +112,7 @@ public class ProducerMethodProducer, Object> dependents = m.getDependentBeanParameters(); - if(dependents != null) - { - Set> beans = dependents.keySet(); - for(Bean bean : beans) - { - Bean beanTt = (Bean)bean; - beanTt.destroy(dependents.get(beanTt), (CreationalContext) parentCreational); - } - } + parentCreationalContext.release(); } } } Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/concepts/alternatives/tests/AlternativeOnProducerFieldTest.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/concepts/alternatives/tests/AlternativeOnProducerFieldTest.java?rev=1436225&r1=1436224&r2=1436225&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/concepts/alternatives/tests/AlternativeOnProducerFieldTest.java (original) +++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/concepts/alternatives/tests/AlternativeOnProducerFieldTest.java Mon Jan 21 08:39:47 2013 @@ -37,11 +37,6 @@ public class AlternativeOnProducerFieldT { private static final String PACKAGE_NAME = AlternativeOnProducerFieldTest.class.getPackage().getName(); - public AlternativeOnProducerFieldTest() - { - - } - @Test public void testProducerFieldAlternativeNotEnabled() {