Yes Gurkan, I think I know _why_ you introduced it: because the TCK currently needs it. But I honestly think the TCK is wrong here. And this has also been confirmed by Marius and Pete already in the CDITCK-140.
Of course, if we could find a way to resolve those cyclic references _without_ storing those informations inthe CreationalContext into the uppermost instances context, than I would really appreciate that. So I know that my solution is also not perfect. But imo it's the least evil one :) I hope that by discussing all the pros and cons we will find a bullet proof solution which satisfies all our needs! LieGrue, strub --- Gurkan Erdogdu <[email protected]> schrieb am Di, 13.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: Dienstag, 13. April, 2010 10:25 Uhr > With Wrong assumtption I mean that : > Eating client CreationalContext > > BeanManager#getReference > > Then we have to find a solution to to this. > > > Gurkan > > > > > ________________________________ > From: Gurkan Erdogdu <[email protected]> > To: [email protected] > Sent: Tue, April 13, 2010 11:11:26 AM > Subject: Re: svn commit: r933348 - in > /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept: > ApplicationScopedBeanIntereptorHandler.java > DependentScopedBeanInterceptorHandler.java > InterceptorHandler.java NormalScopedBeanInterceptorHand > > Hi; > > CreationalContext is a thread safe, you have to provide > thread safety when running multiple threads and the most > important object in CreationalContext is objectInstance and > its thread safe. > > There is no problem I have seen. Also, your solution eats > client provided CreatinalContext because you create > CreationalContext instead of using client's CC. > > >>>But there is only ONE instance of > MailService#user! And this will got > hit by 10.000 requests from different users concurrently. > What is the problem here? Where is the location that > CreationalContext is updated by multiple threads and not > thread safe? > > So, I really do no understand why you insist on keeping > wrong code there via some assumptions. It will have some > thread safe problem of CreationalContext but it needs > updating not changing logic. > > --Gurkan > > > > > ________________________________ > From: Mark Struberg <[email protected]> > To: [email protected] > Sent: Tue, April 13, 2010 9:35:04 AM > Subject: Re: svn commit: r933348 - in > /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept: > ApplicationScopedBeanIntereptorHandler.java > DependentScopedBeanInterceptorHandler.java > InterceptorHandler.java NormalScopedBeanInterceptorHand > > Gurkan, it's really easy > > the method chain is > NormalScopedBeanInterceptorHandler#invoke > -> super.invoke > -> > NormalScopedBeanInterceptorHandler#aroundInvoke > > and all those functions pass their information NOT by > parameter (super.invoke does it partly) but directly access > NormalScopedBeanInterceptorHandler#creationalContext. > > So since the MethodHandler from an @ApplicationScoped or > @SessionScoped bean may easily get invoked in parallel from > multiple threads, they WILL override each other! > > There is nothing we need to proof with a unit test because > a) this is clear as water > b) such concurrency problems are really hard to proof in a > unit test (you can only 'likely' produce them because we > have no control over thread timing > > The Situation where this may easily occur (and it did > already pretty often on my 4-core workstation and in > production). > > I already posted an example: > > > @SessionScoped public class User [ > public String getEmail().. > } > > @ApplicationScoped class MailService { > private @Inject User usr; > > public void sendMail(String content) { > sendInternal(user.getEmail(), content); > } > } > > > Now imagine you use this MailService in a JSF backing bean > > @RequestScoped > class MailFormBean { > private @Inject MailService mailSvc; > private String content; > ... > > public send() { > mailSvc.sendMail(content); > } > } > > And now consider a webserver with 10.000 different users > clicking on the send button at the same time... > > ALL those MailFormBean instances will use the same instance > of MailService since this is @ApplicationScoped, right? > And the MailService#user is a proxy to the User, still ok? > But there is only ONE instance of MailService#user! And > this will got hit by 10.000 requests from different users > concurrently. > > That's why my change simply passes the CreationalContext > around as parameter. > > I will go on and revert the change back. > > LieGrue, > strub > > --- Gurkan Erdogdu <[email protected]> > schrieb am Di, 13.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: Dienstag, 13. April, 2010 00:18 Uhr > > 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 > > > > __________________________________________________ > Do You Yahoo!? > Sie sind Spam leid? Yahoo! Mail verfügt über einen > herausragenden Schutz gegen Massenmails. > http://mail.yahoo.com > > > > > ___________________________________________________________________ > Yahoo! Türkiye açıldı! http://yahoo.com.tr > İnternet üzerindeki en iyi içeriği Yahoo! Türkiye > sizlere sunuyor! > > > > ___________________________________________________________________ > Yahoo! Türkiye açıldı! http://yahoo.com.tr > İnternet üzerindeki en iyi içeriği Yahoo! Türkiye > sizlere sunuyor! __________________________________________________ Do You Yahoo!? Sie sind Spam leid? Yahoo! Mail verfügt über einen herausragenden Schutz gegen Massenmails. http://mail.yahoo.com
