You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ar...@apache.org on 2013/01/21 09:39:48 UTC
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...
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<T>
injectionTarget.inject(instance, creationalContext);
injectionTarget.postConstruct(instance);
}
+ if (getScope().equals(Dependent.class))
+ {
+ ((CreationalContextImpl<T>)creationalContext).addDependent(this, instance);
+ }
return instance;
}
catch (Exception re)
@@ -205,6 +209,14 @@ public abstract class AbstractOwbBean<T>
*/
public void destroy(T instance, CreationalContext<T> creationalContext)
{
+ if (getScope().equals(Dependent.class)
+ && creationalContext instanceof CreationalContextImpl
+ && ((CreationalContextImpl<T>)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<T> 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<T> im
// we don't use an iterator because the destroyal might register a
// fresh PreDestroy interceptor as dependent object...
DependentCreationalContext<T> dependent = (DependentCreationalContext<T>) 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<T> 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<T> implements
Annotation[] newQualifiers = getAdditionalQualifiers(qualifiers);
- InstanceImpl<U> newInstance = new InstanceImpl(sub, injectionPoint, webBeansContext, parentCreationalContext, newQualifiers);
+ InstanceImpl<U> newInstance = new InstanceImpl<U>(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<InjectionPoint> 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<T> exte
{
List<Decorator<?>> decorators = interceptorInfo.getDecorators();
Map<Decorator<?>, Object> instances = new HashMap<Decorator<?>, Object>();
+ CreationalContextImpl<T> creationalContextImpl = (CreationalContextImpl<T>)creationalContext;
for (int i = decorators.size(); i > 0; i--)
{
Decorator<?> decorator = decorators.get(i - 1);
- CreationalContextImpl<T> creationalContextImpl = (CreationalContextImpl<T>)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<T, P
@Override
public T produce(CreationalContext<T> creationalContext)
{
- CreationalContextImpl<T> context = (CreationalContextImpl<T>)creationalContext;
- P ownerInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), creationalContext);
- return new InjectableMethod<T>(producerMethod.getJavaMember(), ownerInstance, this, context).doInjection();
+ P parentInstance = null;
+ CreationalContext<P> parentCreationalContext = null;
+ InjectableMethod<T> m = null;
+ try
+ {
+ parentCreationalContext = webBeansContext.getBeanManagerImpl().createCreationalContext(owner);
+
+ if (!producerMethod.isStatic())
+ {
+ parentInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), parentCreationalContext);
+ }
+
+ m = new InjectableMethod<T>(producerMethod.getJavaMember(), parentInstance, this, (CreationalContextImpl<T>) parentCreationalContext);
+
+ return m.doInjection();
+
+ }
+ finally
+ {
+ if (parentCreationalContext != null)
+ {
+ parentCreationalContext.release();
+ }
+ }
}
@Override
@@ -74,18 +92,18 @@ public class ProducerMethodProducer<T, P
if (disposalMethod != null)
{
P parentInstance = null;
- CreationalContext<P> parentCreational = null;
+ CreationalContext<P> parentCreationalContext = null;
InjectableMethod<T> 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<T>(disposalMethod.getJavaMember(), parentInstance, this, (CreationalContextImpl<T>) parentCreational);
+ m = new InjectableMethod<T>(disposalMethod.getJavaMember(), parentInstance, this, (CreationalContextImpl<T>) parentCreationalContext);
m.setDisposable(true);
m.setProducerMethodInstance(instance);
@@ -94,22 +112,7 @@ public class ProducerMethodProducer<T, P
}
finally
{
- if (owner.getScope().equals(Dependent.class))
- {
- owner.destroy(parentInstance, parentCreational);
- }
-
- //Destroy dependent parameters
- Map<Bean<?>, Object> dependents = m.getDependentBeanParameters();
- if(dependents != null)
- {
- Set<Bean<?>> beans = dependents.keySet();
- for(Bean<?> bean : beans)
- {
- Bean<Object> beanTt = (Bean<Object>)bean;
- beanTt.destroy(dependents.get(beanTt), (CreationalContext<Object>) 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()
{