I do not know what weld does and but I know what I do

1* Prevent circular injections with using proxy instances.
    I inject proxy instance into bean dependencies not direct bean instances 
while creating bean instances. Otherwise you can not intercept those 
dependencies method calls. Why I set "proxy" instance in creational context is 
that to get proxy instance in chain For example if you have A-->B, 
B-->A,C,C-->A then C gets the proxy instanceof A saved in A's creational 
context that is used in tree. In other words, what I did is that

* BeanManagerImpl#getReferene(A) --> Set proxy instance into creational context 
to inject this proxy into B,C
* Bean#create --> Push actual instance into creational context therefore we can 
get it while intercepting its method in B,C

2* Collect dependencies
* CretionalContext  --> Collect dependenies for later destructing

When you destroy bean instance, you have to give cretional context instance 
that is used for creating the instance.

>>>Imagine a @SessionScoped bean A with a @RequestScoped field B. An
instance of B will never be injected directly but always via a proxy,
and more important, the contextual instance >>>behind the proxy will be
different for each and every request.
We inject proxy instance in B, never inject actual instance B. Where do you see 
the problem in OWB?

>>>My goal is to also get rid of any proxy logic in our CreationalContextIpl 
>>>too...
I explained above why I save proxy instance in creational context.




________________________________
From: Mark Struberg <[email protected]>
To: [email protected]
Sent: Tue, February 9, 2010 11:03:03 PM
Subject: Re: AW: svn commit: r908140 - in 
/openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/container/ 
main/java/org/apache/webbeans/context/ main/java/org/apache/webbeans/intercept/ 
main/java/org/apache/webbeans/util/ test/java/org/apache/webbeans/t...

Hi Gurkan!

I've now looked at weld and from glimpsing over it they are doing it almost the 
same. (Should have looked earlier, could have spared me 2 days debugging and 
profiling). Please look at ClientProxyMethodHandler#currentCreationalContext 
and #getProxiedInstance.


The thing is: creation will go fast and only direct beans must be recorded. But 
NO dependent proxies, because the tree is not static! Imagine a @SessionScoped 
bean A with a @RequestScoped field B. An instance of B will never be injected 
directly but always via a proxy, and more important, the contextual instance 
behind the proxy will be different for each and every request.

Back to weld: somehow the do not only store a CreationalContext but a little 
factory. Maybe that's the trick why they do not need any proxy and stuff in 
their CreationalContextImpl? My goal is to also get rid of any proxy logic in 
our CreationalContextIpl too...

LieGrue,
strub

--- Gurkan Erdogdu <[email protected]> schrieb am Di, 9.2.2010:

> Von: Gurkan Erdogdu <[email protected]>
> Betreff: Re: AW: svn commit: r908140 - in 
> /openwebbeans/trunk/webbeans-impl/src: 
> main/java/org/apache/webbeans/container/ 
> main/java/org/apache/webbeans/context/ 
> main/java/org/apache/webbeans/intercept/ main/java/org/apache/webbeans/util/ 
> test/java/org/apache/webbeans/t...
> An: [email protected]
> Datum: Dienstag, 9. Februar 2010, 21:16
> Mark;
> 
> Could you revert your last changes? I will dig into details
> about this. This part effects lots of place in codebase. 
> 
> Therefore we may get conflicts :(
> 
> Thanks;
> 
> --Gurkan
> 
> 
> 
> 
> ________________________________
> From: Gurkan Erdogdu <[email protected]>
> To: [email protected]
> Sent: Tue, February 9, 2010 9:11:24 PM
> Subject: Re: AW: svn commit: r908140 - in
> /openwebbeans/trunk/webbeans-impl/src:
> main/java/org/apache/webbeans/container/
> main/java/org/apache/webbeans/context/
> main/java/org/apache/webbeans/intercept/
> main/java/org/apache/webbeans/util/
> test/java/org/apache/webbeans/t...
> 
> Hello Mark;
> 
> I think that problem may seems to be removed but there are
> some symptoms/side effects. In BeanManager#getReference
> client gives CreationalContext instance. We have to keep
> this creational context with owner bean as long as bean is
> not destroyed. 
> 
> But in your committed NormalSccopedInterceptorHandler,
> problems are:
> 
> 1* Lost of client provided CreationalContext (Because you
> create a new instance of CreationalContext if thread local
> is empty)
> 2* Remove thread local instance in finally even if bean is
> not destroyed
> 
> 
> 
> Thanks;
> 
> --Gurkan
> 
> 
> 
> ________________________________
> From: Mark Struberg <[email protected]>
> To: [email protected]
> Sent: Tue, February 9, 2010 8:26:24 PM
> Subject: AW: svn commit: r908140 - in
> /openwebbeans/trunk/webbeans-impl/src:
> main/java/org/apache/webbeans/container/
> main/java/org/apache/webbeans/context/
> main/java/org/apache/webbeans/intercept/
> main/java/org/apache/webbeans/util/
> test/java/org/apache/webbeans/t...
> 
> Gurkan, it would be great if you could review my changes,
> because this is a very difficult area!
> 
> txs and LieGrue,
> strub
> 
> --- [email protected]
> <[email protected]>
> schrieb am Di, 9.2.2010:
> 
> > Von: [email protected]
> <[email protected]>
> > Betreff: svn commit: r908140 - in
> /openwebbeans/trunk/webbeans-impl/src:
> main/java/org/apache/webbeans/container/
> main/java/org/apache/webbeans/context/
> main/java/org/apache/webbeans/intercept/
> main/java/org/apache/webbeans/util/
> test/java/org/apache/webbeans/t...
> > An: [email protected]
> > Datum: Dienstag, 9. Februar 2010, 19:11
> > Author: struberg
> > Date: Tue Feb  9 18:11:38 2010
> > New Revision: 908140
> > 
> > URL: http://svn.apache.org/viewvc?rev=908140&view=rev
> > Log:
> > OWB-272 fix memory leak caused by proxies (at least
> most of
> > it)
> > 
> > Modified:
> >    
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
> >    
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java
> >    
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
> >    
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
> >    
> >
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/intercept/webbeans/CallingBusinessInConstructorTest.java
> > 
> > Modified:
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
> > URL: 
> > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=908140&r1=908139&r2=908140&view=diff
> >
> ==============================================================================
> > ---
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
> > (original)
> > +++
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
> > Tue Feb  9 18:11:38 2010
> > @@ -739,9 +739,7 @@
> >          
> >    //Create Managed Bean Proxy
> >              else
> >          
> >    {  
> > -              
> > boolean proxyCacheable =
> >
> WebBeansUtil.isProxyForScopeCachable(bean.getScope());
> > -             
>   
> > -             
>   if
> > (proxyCacheable &&
> this.proxyMap.containsKey(bean))
> > +             
>   if
> > (this.proxyMap.containsKey(bean))
> >              
> >    {
> >               
> 
> >      instance =
> > this.proxyMap.get(bean);
> >              
> >    }
> > @@ -749,11 +747,8 @@
> >              
> >    {
> >               
> 
> >      instance =
> >
> JavassistProxyFactory.createNormalScopedBeanProxy(bean,creationalContext);
> >               
> 
> >      
> > -              
> >     if(proxyCacheable)
> > -              
> >     {
> > -              
> >     
>    this.proxyMap.put(bean,
> > instance);  
> > -              
> >     }    
> > -              
> >    
> > +              
> >     this.proxyMap.put(bean,
> > instance);  
> > +
> >               
> 
> >      //push this proxy instance into
> > creational context
> >               
> 
> >      if(creationalContext instanceof
> > CreationalContextImpl)
> >               
> 
> >      {
> > 
> > Modified:
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java
> > URL: 
> > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java?rev=908140&r1=908139&r2=908140&view=diff
> >
> ==============================================================================
> > ---
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java
> > (original)
> > +++
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java
> > Tue Feb  9 18:11:38 2010
> > @@ -89,8 +89,11 @@
> >       */
> >      public static void
> > initRequestContext(ServletRequestEvent event)
> >      {
> > -        requestContext.set(new
> > RequestContext());// set thread local
> > -      
> > requestContext.get().setActive(true);
> > +        RequestContext rq = new
> > RequestContext();
> > +        rq.setActive(true);
> > +
> > +        requestContext.set(rq);//
> set
> > thread local
> > +        RequestContext rq2 =
> > requestContext.get();
> >          
> >          if(event != null)
> >          {
> > 
> > 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=908140&r1=908139&r2=908140&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
> > Tue Feb  9 18:11:38 2010
> > @@ -32,26 +32,55 @@
> >  {
> >      private static final long
> > serialVersionUID = -7169354477951284657L;
> >  
> > -    private CreationalContext<?>
> > creationalContext;
> > -    
> > -    
> > -    public
> >
> NormalScopedBeanInterceptorHandler(AbstractBean<?>
> > bean, CreationalContext<?> creationalContext)
> > +    // A creationalContext has a very
> short
> > lifespan. So we can use a ThreadLocal to pass it over
> > +    // if we make sure that it is cleaned
> up
> > properly!
> > +    private static
> > ThreadLocal<CreationalContext<Object>>
> > creationalContxt = new
> > ThreadLocal<CreationalContext<Object>>();
> > +
> > +    public
> >
> NormalScopedBeanInterceptorHandler(AbstractBean<?>
> > bean, CreationalContext<?> cc)
> >      {
> >          super(bean);
> > -        this.creationalContext =
> > creationalContext;
> > +      
> > creationalContxt.set((CreationalContext<Object>)
> cc);
> >      }
> >      
> >      @SuppressWarnings("unchecked")
> >      @Override
> >      public Object invoke(Object
> > instance, Method method, Method proceed, Object[]
> arguments)
> > throws Exception
> >      {
> > +        BeanManagerImpl
> beanManager =
> > BeanManagerImpl.getManager();
> > +
> >          //Context of the
> > bean
> > -        Context webbeansContext
> =
> >
> BeanManagerImpl.getManager().getContext(bean.getScope());
> > -        
> > -        //Get bean instance from
> > context
> > -        Object webbeansInstance
> =
> >
> webbeansContext.get((Contextual<Object>)this.bean,
> >
> (CreationalContext<Object>)this.creationalContext);
> > -        
> > -        // TODO Auto-generated
> method
> > stub
> > +        Context webbeansContext
> =
> > beanManager.getContext(bean.getScope());
> > +        Object webbeansInstance
> =
> > webbeansContext.get(this.bean);
> > +              
> >               
> 
> >               
> 
> >               
> 
> >      C
> > +        if (webbeansInstance ==
> null)
> > +        {
> > +          
> > CreationalContext<Object> cc =
> > creationalContxt.get();
> > +
> > +            if (cc ==
> null)
> > +            {
> > +             
>   //
> > we need to create the CreationalContext ourself and
> store
> > it
> > +              
> > try
> > +             
>   {
> > +              
> >     cc =
> (CreationalContext<Object>)
> > beanManager.createCreationalContext(bean);
> > +              
> >     creationalContxt.set(cc);
> > +              
> >     //Get bean instance from
> context
> > +              
> >     webbeansInstance =
> >
> webbeansContext.get((Contextual<Object>)this.bean,
> > cc);
> > +             
>   }
> > +              
> > finally
> > +             
>   {
> > +              
> >     // make sure that we remove
> the cc from the
> > thread in the handler who created it
> > +              
> >     creationalContxt.remove();
> > +             
>   }
> > +            }
> > +            else
> > +            {
> > +              
> > //Get bean instance from context
> > +              
> > webbeansInstance =
> >
> webbeansContext.get((Contextual<Object>)this.bean,
> > cc);
> > +            }
> > +
> > +        }
> > +
> > +
> >          return
> > super.invoke(webbeansInstance, method, proceed,
> arguments);
> >      }
> >      
> > 
> > Modified:
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
> > URL: 
> > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=908140&r1=908139&r2=908140&view=diff
> >
> ==============================================================================
> > ---
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
> > (original)
> > +++
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
> > Tue Feb  9 18:11:38 2010
> > @@ -2297,17 +2297,6 @@
> >  
> >      }    
> >      
> > -    public static boolean
> > isProxyForScopeCachable(Class<? extends
> Annotation>
> > scopeType)
> > -    {
> > -      
> > Asserts.assertNotNull(scopeType, "Scope type is
> null");
> > -      
> > if(scopeType.equals(ApplicationScoped.class))
> > -        {
> > -            return
> true;
> > -        }
> > -        
> > -        return false;
> > -    }
> > -    
> >      public static boolean
> > isDependent(Bean<?> bean)
> >      {
> >      
> >   
> if(bean.getScope().equals(Dependent.class))
> > 
> > Modified:
> >
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/intercept/webbeans/CallingBusinessInConstructorTest.java
> > URL: 
> > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/intercept/webbeans/CallingBusinessInConstructorTest.java?rev=908140&r1=908139&r2=908140&view=diff
> >
> ==============================================================================
> > ---
> >
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/intercept/webbeans/CallingBusinessInConstructorTest.java
> > (original)
> > +++
> >
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/intercept/webbeans/CallingBusinessInConstructorTest.java
> > Tue Feb  9 18:11:38 2010
> > @@ -25,8 +25,10 @@
> >  import
> >
> org.apache.webbeans.test.component.intercept.webbeans.SecureInterceptor;
> >  import org.junit.After;
> >  import org.junit.Before;
> > +import org.junit.Ignore;
> >  import org.junit.Test;
> >  
> > +...@ignore
> >  public class CallingBusinessInConstructorTest
> extends
> > TestContext
> >  {
> >      public
> > CallingBusinessInConstructorTest()
> > 
> > 
> > 
> 

__________________________________________________
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!

Reply via email to