felix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Guillaume Nodet (JIRA)" <j...@apache.org>
Subject [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
Date Wed, 13 May 2009 13:50:45 GMT

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

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

Just had a chat with Peter Kriens and B.J. about that and their answer was that the isAssignable
should only fail if you *know* that the classes are incompatible (wired to different packages).
So if the exporter has no wire to the package, we should just return true and not try to load
the class at all.

> 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.


Mime
View raw message