Please look at AbstractContext, creationalContextMap#putIfAbsent call
2010/4/12 Mark Struberg <[email protected]>
> Sorry, I think we need to rollback the rollback, since this re-introduces
> really heavy concurrency problems.
>
> @SessionScoped public class User [
> public String getEmail()..
> }
>
> @ApplicationScoped class MailService {
> private @Inject User usr;
>
> public void sendMail(String content) {
> sendInternal(user.getEmail(), content);
> }
> }
>
> now, with this change whenever 2 threads (from 2 sessions of a webserver)
> invoke sendMail and hit the user.getEmail() the
> NormalScopedBeanInterceptorHandler gets called and those 2 threads override
> each other the
> private transient WeakReference<CreationalContext<?>> creationalContext =
> null;
> because there is only one single proxy instance being used by those 2
> threads.
>
> Got me?
>
> LieGrue,
> strub
>
> --- [email protected] <[email protected]> schrieb am Mo, 12.4.2010:
>
> > Von: [email protected] <[email protected]>
> > Betreff: svn commit: r933348 - in
> /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept:
> ApplicationScopedBeanIntereptorHandler.java
> DependentScopedBeanInterceptorHandler.java InterceptorHandler.java
> NormalScopedBeanInterceptorHandler.java
> > An: [email protected]
> > Datum: Montag, 12. April, 2010 20:20 Uhr
> > Author: gerdogdu
> > Date: Mon Apr 12 18:20:06 2010
> > New Revision: 933348
> >
> > URL: http://svn.apache.org/viewvc?rev=933348&view=rev
> > Log:
> > [OWB-351] OWB picks up @SessionScoped contextual instances
> > from expired sessions. Corrects eating client provided
> > creational context via BeanManager#getReference
> >
> > Modified:
> >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
> >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java
> >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
> >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
> >
> > Modified:
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
> > URL:
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java?rev=933348&r1=933347&r2=933348&view=diff
> >
> ==============================================================================
> > ---
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
> > (original)
> > +++
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
> > Mon Apr 12 18:20:06 2010
> > @@ -21,7 +21,6 @@ package org.apache.webbeans.intercept;
> > import javax.enterprise.context.spi.CreationalContext;
> >
> > import org.apache.webbeans.component.OwbBean;
> > -import
> > org.apache.webbeans.context.creational.CreationalContextImpl;
> >
> >
> > /**
> > @@ -43,7 +42,7 @@ public class ApplicationScopedBeanIntere
> > /**
> > * Creates a new handler.
> > * @param bean bean
> > - * @param creationalContext
> > creational context
> > + * @param creationalContext
> > creaitonal context
> > */
> > public
> > ApplicationScopedBeanIntereptorHandler(OwbBean<?>
> > bean, CreationalContext<?> creationalContext)
> > {
> > @@ -53,11 +52,11 @@ public class
> > ApplicationScopedBeanIntere
> > /**
> > * {...@inheritdoc}
> > */
> > - protected Object
> > getContextualInstance(OwbBean<Object> bean,
> > CreationalContextImpl<?> creationalContext)
> > + protected Object
> > getContextualInstance(OwbBean<Object> bean)
> > {
> > if (cachedInstance
> > == null)
> > {
> > - cachedInstance =
> > super.getContextualInstance(bean, creationalContext);
> > + cachedInstance =
> > super.getContextualInstance(bean);
> > }
> >
> > return
> > cachedInstance;
> >
> > Modified:
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java
> > URL:
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java?rev=933348&r1=933347&r2=933348&view=diff
> >
> ==============================================================================
> > ---
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java
> > (original)
> > +++
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java
> > Mon Apr 12 18:20:06 2010
> > @@ -67,12 +67,10 @@ public class
> > DependentScopedBeanIntercep
> > /**
> > * {...@inheritdoc}
> > */
> > - protected Object callAroundInvokes(Method
> > proceed, Object[] arguments, List<InterceptorData>
> > stack,
> > -
> >
> >
> > CreationalContextImpl<?> cc)
> > - throws Exception
> > + protected Object callAroundInvokes(Method
> > proceed, Object[] arguments, List<InterceptorData>
> > stack) throws Exception
> > {
> >
> > InvocationContextImpl impl = new
> > InvocationContextImpl(this.bean, this.actualInstance
> > ,proceed, arguments, stack, InterceptorType.AROUND_INVOKE);
> > -
> > impl.setCreationalContext(cc);
> > +
> > impl.setCreationalContext(creationalContext);
> >
> > return
> > impl.proceed();
> > }
> >
> > Modified:
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
> > URL:
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java?rev=933348&r1=933347&r2=933348&view=diff
> >
> ==============================================================================
> > ---
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
> > (original)
> > +++
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
> > Mon Apr 12 18:20:06 2010
> > @@ -169,13 +169,11 @@ public abstract class
> > InterceptorHandler
> > * @param method business method
> > * @param proceed proceed method
> > * @param arguments method arguments
> > - * @param creationalContext bean
> > creational context
> > + * @param ownerCreationalContext
> > bean creational context
> > * @return method result
> > * @throws Exception for exception
> > */
> > - public Object invoke(Object instance, Method
> > method, Method proceed, Object[] arguments,
> > -
> >
> > CreationalContextImpl<?>
> > creationalContext)
> > - throws Exception
> > + public Object invoke(Object instance, Method
> > method, Method proceed, Object[] arguments,
> > CreationalContextImpl<?> ownerCreationalContext)
> > throws Exception
> > {
> > //Result of
> > invocation
> > Object result =
> > null;
> > @@ -212,7 +210,7 @@ public abstract class
> > InterceptorHandler
> >
> >
> > ((ProxyObject)delegate).setHandler(this.delegateHandler);
> >
> >
> > // Gets component
> > decorator stack
> > -
> > decorators =
> > WebBeansDecoratorConfig.getDecoratorStack(injectionTarget,
> > instance, delegate, creationalContext);
> >
> >
> > +
> > decorators =
> > WebBeansDecoratorConfig.getDecoratorStack(injectionTarget,
> > instance, delegate, ownerCreationalContext);
> >
> >
> >
> > //Sets decorator
> > stack of delegate
> >
> >
> > this.delegateHandler.setDecorators(decorators);
> >
> >
> > @@ -249,10 +247,7 @@ public abstract class
> > InterceptorHandler
> >
> > // Call Around
> > Invokes
> >
> > if
> >
> (WebBeansUtil.isContainsInterceptorMethod(this.interceptedMethodMap.get(method),
> > InterceptorType.AROUND_INVOKE))
> >
> > {
> > -
> > return
> > callAroundInvokes(method, arguments,
> > -
> >
> >
> >
> >
> InterceptorUtil.getInterceptorMethods(this.interceptedMethodMap.get(method),
> > -
> >
> >
> >
> >
> >
> > InterceptorType.AROUND_INVOKE),
> > -
> >
> >
> > creationalContext);
> > +
> > return
> > callAroundInvokes(method, arguments,
> >
> InterceptorUtil.getInterceptorMethods(this.interceptedMethodMap.get(method),
> > InterceptorType.AROUND_INVOKE));
> >
> > }
> >
> >
> >
> > }
> > @@ -307,9 +302,7 @@ public abstract class
> > InterceptorHandler
> > * @return return of method
> > * @throws Exception for any exception
> > */
> > - protected abstract Object
> > callAroundInvokes(Method interceptedMethod, Object[]
> > arguments,
> > -
> >
> >
> > List<InterceptorData> stack,
> > CreationalContextImpl<?> creationalContext)
> > - throws Exception;
> > + protected abstract Object
> > callAroundInvokes(Method interceptedMethod, Object[]
> > arguments, List<InterceptorData> stack) throws
> > Exception;
> >
> > /**
> > *
> >
> > Modified:
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
> > URL:
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java?rev=933348&r1=933347&r2=933348&view=diff
> >
> ==============================================================================
> > ---
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
> > (original)
> > +++
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
> > Mon Apr 12 18:20:06 2010
> > @@ -18,6 +18,7 @@
> > */
> > package org.apache.webbeans.intercept;
> >
> > +import java.lang.ref.WeakReference;
> > import java.lang.reflect.Method;
> > import java.util.List;
> >
> > @@ -42,6 +43,9 @@ public class NormalScopedBeanInterceptor
> > /**Serial id*/
> > private static final long
> > serialVersionUID = 1L;
> >
> > + /**Creational context*/
> > + private transient
> > WeakReference<CreationalContext<?>>
> > creationalContext = null;
> > +
> > /**
> > * Creates a new bean instance
> > * @param bean bean
> > @@ -50,6 +54,7 @@ public class NormalScopedBeanInterceptor
> > public
> > NormalScopedBeanInterceptorHandler(OwbBean<?> bean,
> > CreationalContext<?> creationalContext)
> > {
> > super(bean);
> > + this.creationalContext = new
> > WeakReference<CreationalContext<?>>(creationalContext);
> > }
> >
> > /**
> > @@ -58,38 +63,21 @@ public class
> > NormalScopedBeanInterceptor
> > @Override
> > public Object invoke(Object
> > instance, Method method, Method proceed, Object[] arguments)
> > throws Exception
> > {
> > - CreationalContextImpl<?>
> > creationalContext = null;
> > -
> > - //Context of the bean
> > - Context webbeansContext =
> > getBeanManager().getContext(bean.getScope());
> > -
> > - if (webbeansContext instanceof
> > AbstractContext)
> > - {
> > -
> > creationalContext = (CreationalContextImpl<?>)
> > ((AbstractContext)webbeansContext).getCreationalContext(bean);
> > - }
> > - if (creationalContext ==
> > null)
> > - {
> > - // if there was
> > no CreationalContext set from external, we create a new one
> > -
> > creationalContext = (CreationalContextImpl<?>)
> > CreationalContextFactory.getInstance().getCreationalContext(bean);
> > - }
> > -
> > //Get instance from
> > context
> > - Object webbeansInstance =
> > getContextualInstance((OwbBean<Object>) this.bean,
> > creationalContext);
> > + Object webbeansInstance =
> > getContextualInstance((OwbBean<Object>) this.bean);
> >
> > //Call super
> > - return
> > super.invoke(webbeansInstance, method, proceed, arguments,
> > creationalContext);
> > + return
> > super.invoke(webbeansInstance, method, proceed, arguments,
> > (CreationalContextImpl<?>)
> > this.creationalContext.get());
> > }
> >
> > /**
> > * {...@inheritdoc}
> > */
> > - protected Object callAroundInvokes(Method
> > proceed, Object[] arguments, List<InterceptorData>
> > stack, CreationalContextImpl<?> creationalContext)
> > - throws Exception
> > + protected Object callAroundInvokes(Method
> > proceed, Object[] arguments, List<InterceptorData>
> > stack) throws Exception
> > {
> > - InvocationContextImpl impl =
> > new InvocationContextImpl(this.bean,
> > -
> >
> >
> >
> > getContextualInstance((OwbBean<Object>)
> > this.bean, creationalContext),
> > + InvocationContextImpl impl =
> > new InvocationContextImpl(this.bean,
> > getContextualInstance((OwbBean<Object>) this.bean),
> >
> >
> >
> >
> > proceed, arguments, stack, InterceptorType.AROUND_INVOKE);
> > -
> > impl.setCreationalContext(creationalContext);
> > +
> > impl.setCreationalContext(creationalContext.get());
> >
> > return
> > impl.proceed();
> >
> > @@ -99,10 +87,9 @@ public class
> > NormalScopedBeanInterceptor
> > /**
> > * Gets instance from context.
> > * @param bean bean instance
> > - * @param creationalContext
> > * @return the underlying contextual
> > instance, either cached or resolved from the context
> > */
> > - protected Object
> > getContextualInstance(OwbBean<Object> bean,
> > CreationalContextImpl<?> creationalContext)
> > + protected Object
> > getContextualInstance(OwbBean<Object> bean)
> > {
> > Object
> > webbeansInstance = null;
> >
> > @@ -117,8 +104,22 @@ public class
> > NormalScopedBeanInterceptor
> > return
> > webbeansInstance;
> > }
> >
> > + if (webbeansContext instanceof
> > AbstractContext)
> > + {
> > +
> > CreationalContext<?> cc =
> > ((AbstractContext)webbeansContext).getCreationalContext(bean);
> > + if (cc != null)
> > + {
> > +
> > creationalContext = new
> > WeakReference<CreationalContext<?>>(cc);
> > + }
> > + }
> > + if (creationalContext ==
> > null)
> > + {
> > + // if there was
> > no CreationalContext set from external, we create a new one
> > +
> > creationalContext = new
> >
> WeakReference<CreationalContext<?>>(CreationalContextFactory.getInstance().getCreationalContext(bean));
> > + }
> > +
> > // finally, we
> > create a new contextual instance
> > - webbeansInstance =
> > webbeansContext.get((Contextual<Object>)this.bean,
> > (CreationalContext<Object>) creationalContext);
> > + webbeansInstance =
> > webbeansContext.get((Contextual<Object>)this.bean,
> > (CreationalContext<Object>) creationalContext.get());
> >
> > return
> > webbeansInstance;
> > }
> >
> >
> >
>
> __________________________________________________
> Do You Yahoo!?
> Sie sind Spam leid? Yahoo! Mail verfügt über einen herausragenden Schutz
> gegen Massenmails.
> http://mail.yahoo.com
>
--
Gurkan Erdogdu
http://gurkanerdogdu.blogspot.com