[ 
https://issues.apache.org/jira/browse/FELIX-1131?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13686460#comment-13686460
 ] 

Guillaume Nodet commented on FELIX-1131:
----------------------------------------

In this use case, isAssignableTo falls into the case #3 (The provider does not 
have a wire for the package.) because the provider exports the package, but 
it's not the one imported, so both are incompatible.
So the getRegistration().isClassAccessible(requestClass) method is called but 
returns true because of the use of a factory.
I wonder if we could, even when using a factory, try to load the exposed class 
from the provider bundle and compare it with the requested one instead of 
simply returning true in that case.
                
> ServiceReference.isAssignableTo fails when using a factory that can not see 
> the exported class and the bundle exporting the service does not have a 
> direct wire to this class
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: FELIX-1131
>                 URL: https://issues.apache.org/jira/browse/FELIX-1131
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-1.6.0
>            Reporter: Guillaume Nodet
>            Assignee: Richard S. Hall
>
>  * bundle A defines an interface R and a class S in different packages, whith 
> S implementing R
>  * bundle B defines a class T extending S, it has an import statement on S 
> package, but not on R package
>  * bundle C defines a ServiceFactory that export T service without any import 
> on any package from R, S, T
> in this case, the line 426 of ServiceRegistrationImpl is executed:
>                        allow = 
> getServiceRegistration().isClassAccessible(requestClass);
> which looks like:
>    protected boolean isClassAccessible(Class clazz)
>    {
>        try
>        {
>            // Try to load from the service object or service factory class.
>            Class sourceClass = (m_factory != null)
>                ? m_factory.getClass() : m_svcObj.getClass();
>            Class targetClass = Util.loadClassUsingClass(sourceClass, 
> clazz.getName());
>            return (targetClass == clazz);
>        }
>        catch (Exception ex)
>        {
>            // Ignore this and return false.
>        }
>        return false;
>    }
> So felix checks if the classloader used to load the factory can also load the 
> interface, which is not the case in my example.
> So isClassAccessible returns false and the event is not dispatched to the 
> service listener.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to