As long as the CreationalContext related with the bean is in the
AbstractContext#CreationalContextMap, no thread can override it, just use
old creational context.

2010/4/13 Gurkan Erdogdu <[email protected]>

> >>>....But if in the meantime _another_ thread overwrites this
> NormalScopedBeanInterceptorHan
> >>>dler.creationalContext (by using the same proxy instance), then we get
> into troubles.
>
> Where is the location of this code, i.e _another_ thread overwrites this
> NormalScopedBeanInterceptorHandler.creationalContext
>
> Thanks;
>
> --Gurkan
>
>
> 2010/4/13 Mark Struberg <[email protected]>
>
> This makes no difference, really.
>> The problem is that we store a CreationalContext as a member in
>> NormalScopedBeanInterceptorHandler. And subsequent function calls rely on
>> it. But if in the meantime _another_ thread overwrites this
>> NormalScopedBeanInterceptorHandler.creationalContext (by using the same
>> proxy instance), then we get into troubles.
>>
>> Tbis is hard to debug and write tests for, but this is really obvious from
>> looking at the code. And I already had this problem in my apps. It's not
>> funny to randomly pickup instances from other sessions...
>>
>> LieGrue,
>> strub
>>
>> --- Gurkan Erdogdu <[email protected]> schrieb am Mo, 12.4.2010:
>>
>> > Von: Gurkan Erdogdu <[email protected]>
>> > Betreff: Re: svn commit: r933348 - in
>> /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept:
>> ApplicationScopedBeanIntereptorHandler.java
>> DependentScopedBeanInterceptorHandler.java  InterceptorHandler.java
>> NormalScopedBeanInterceptorHand
>> > An: [email protected]
>> > Datum: Montag, 12. April, 2010 22:29 Uhr
>> > 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
>> >
>>
>>
>> __________________________________________________
>> 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
>



-- 
Gurkan Erdogdu
http://gurkanerdogdu.blogspot.com

Reply via email to