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

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

I think perhaps the issue is in ServiceRegistrationImpl.isClassAccessible(). In 
this method it tries to get the service type from the registered service object 
and in the case of a service factory will use that instead of the service 
object. Currently, if the factory is used to retrieve the service type and the 
type is not found, it does a comparison to null which will always return false. 
Maybe we need to do something like this instead:

    private 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 ((m_factory != null) && (targetClass == null)) ? true : 
(targetClass == clazz);
        }
        catch (Exception ex)
        {
            // Ignore this and return false.
        }
        return false;
    }

So if the factory doesn't have access, we always return true instead of always 
returning false. We could potentially try to make a more fine-grained decision 
by getting the bundle associated with the service factory class and return true 
when the type if not found if the factory type comes from a bundle other than 
the registering bundle. This assumes that extenders register services using the 
context of the bundle they are extending and not their own.

Thoughts?

> Usage of BundleContext.getServiceReferences results in failure to activate 
> components
> -------------------------------------------------------------------------------------
>
>                 Key: FELIX-1754
>                 URL: https://issues.apache.org/jira/browse/FELIX-1754
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: felix-2.2.0
>            Reporter: Matthew Sykes
>            Priority: Minor
>         Attachments: assignable.diff
>
>
> I'm attempting to move some code from Equinox to Felix that makes use of the 
> declarative services 1.1 runtime.  Many of the components in our bundles 
> declare multiple 'provide' elements in the service declaration .  In general 
> these services consist of a standardized interface in one package and 
> extensions to that interface in another.  Depending on the requirements of 
> the code using the component, other bundles will declare their components 
> with references to either the standardized interface or the extended 
> interface.
> The issue I'm seeing is that the Felix SCR fails to activate some components 
> because it's failing to resolve references to the service provided by another 
> component.  It turns out that the SCR is using 
> BundleContext.getServiceReferences instead of 
> BundleContext.getAllServiceReferences to locate candidate services when 
> resolving references.  Unfortunately, the getServiceReference flavor requires 
> that the using bundle have access to all class names under which the target 
> service was registered - not just the interface associated with the reference.
> Given the use-case I've described and the behavior of Equinox, I believe the 
> Felix SCR should be using BundleContext.getAllServiceReferences(..) to 
> resolve references and rely on the bundle creator to define the correct 
> imports.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to