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!
