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 --- gerdo...@apache.org <gerdo...@apache.org> schrieb am Mo, 12.4.2010: > Von: gerdo...@apache.org <gerdo...@apache.org> > 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: comm...@openwebbeans.apache.org > 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