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

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

I don't think you can do short circuiting early based on whether the bundles 
export/import the package because you still have the case that the provider of 
the service factory is exporting the package, but is providing a service 
factory on behalf of another bundle.

Also, I'm confused about your scenario, since I don't know what "exports it 
using a factory and registers a service with an interface from this package" 
means.

If your bundle exports a package and registers a service factory for a service 
object implementing an interface from that package, then it shouldn't be 
hitting case 2 in isClassAccessible() since that is for the case where the 
factory provider and the service registerer aren't the same bundle. It sounds 
like you should hit case 1 in isClassAccessible(), since your bundle is the 
creator of the service factory as well as the bundle context used to register 
the service factory. For case 1, we explicitly load the classes to determine 
whether to filter or not, which would then fail.

So, perhaps I don't understand your scenario.
                
> 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
>         Attachments: FELIX-1131.txt
>
>
>  * 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