On Nov 24, 2008, at 5:14 PM, Gili wrote:
> Paul Sandoz (via Nabble) wrote:
> >  > Why is IoCComponentProviderFactory.getComponentProvider() being
> >  > invoked on
> >  > "internal" Jersey classes such as
> >  > com.sun.jersey.multipart.impl.MultiPartConfigProvider?
> >  >
> >
> > Cause i have yet to work out a way of filtering out the Jersey
> > components. I suppose i could do it by package name but that seems
> > wrong, i think i require a special annotation.
> [snip]
>  > Null should be returned if the component provider cannot support  
> the
>  > class.
>
>         When you finally implement this, wouldn't this mean the  
> component
> provider must never return null?
No.
> My point is that if you're going to
> allow null anyway then it might not make a difference whether you pass
> it Jersey-specific classes or not because the ComponentProvider can  
> just
> return null (filtering them beforehand might improve performance  
> slightly).
>
Tis a good point. The main reason do to this is to reduce the noise.  
But i am inclined to leave things as they are.
> > W.r.t. getInjectableInstance the parameter passed in should be from
> > the ComponentProvider .getInstance method, the return value should  
> be
> > the underlying component instance that is proxied or the parameter
> > that is passed in otherwise.
>
>         Paul, I think this method needs to return a Class, not an  
> Object. CGLIB
> proxies are simply subclasses of the underlying class which means  
> that I
> have an object of type Foo$$EnhancerByGuice$$45c70c66
> whose superclass is Foo which you want. There is no way for me to give
> you an unproxied instance; rather, I can point you to the class  
> level to
> look at.
>
The important point here is that the returned instance can be injected  
on by Jersey correctly. That is why the method is called  
getInjectableInstance. The single use-case that has been driving this  
so far has been Spring-AOP, where proxy by encapsulation can occur  
rather than proxy by extension (see snippet of Spring-based code at  
end of email).
Given an instance of Foo and an instance of Foo$$EnhancerByGuice$ 
$45c70c66 are the fields on the class Foo accessible and can those  
fields be modified when given an instance of Foo$$EnhancerByGuice$ 
$45c70c66. If so then getInjectableInstance can just return the  
instance that is passed in.
Paul.
     private static Object getInjectableInstance(Object o) {
         if (AopUtils.isAopProxy(o)) {
             final Advised aopResource = (Advised)o;
             try {
                 return aopResource.getTargetSource().getTarget();
             } catch (Exception e) {
                 LOGGER.log(Level.SEVERE, "Could not get target object  
from proxy.", e);
                 throw new RuntimeException("Could not get target  
object from proxy.", e);
             }
         } else {
             return o;
         }
     }