You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Richard S. Hall (JIRA)" <ji...@apache.org> on 2009/05/07 21:12:45 UTC

[jira] Commented: (FELIX-1131) 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

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

Richard S. Hall commented on FELIX-1131:
----------------------------------------

The only thing we could do in this case is get the service object and test that, which loses lazy creation.

The real question here is whether or not we should be forced to do this, since this example shows, it may not be sufficient to look at the factory class, since it could be registering something via reflection and may not be wired to the same definition of the package as the service object. In other words, we might always have to get the service object eagerly. Thoughts?

> 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: felix-1.6.0
>            Reporter: Guillaume Nodet
>
>  * 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.
-
You can reply to this email to add a comment to the issue online.