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

Reply via email to