[ 
https://issues.apache.org/jira/browse/FELIX-4727?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Thomas Watson updated FELIX-4727:
---------------------------------
    Description: 
The overall design of org.apache.felix.resolver.WrappedResource is that it is 
an internal type to the ResolverImpl and is not exposed to external code.  The 
fact that it does not pay attention to the namespace param is an oversite, but 
not one that effects the ResolverImpl since it uses a null param anyway and 
does its own filtering of the capabilities.

But there are cases where this type will get exposed to code outside the 
resolver implementation.  One example is when ResolverImpl.mergeUses is called 
and does a ArrayList.contains.  Typically the types in the list are provided by 
the ResolveContext implementation.  If a WrappedCapability is passed to the 
ArrayList.contains method then it does an equals call across all values in the 
list.  If a ResolveContext capability implementation of that equals method 
calls getResource on  WrappedCapability then it will be exposed to the 
WrappedResource.  I know of one case where this causes issues when the client 
code is trying to get the osgi.identity capability of the WrappedResource.  All 
capabilities are being returned but the first one is not the expected 
osgi.identity.

Here is a stacktrace from Aries:

Caused by: java.lang.NullPointerException
        at 
org.apache.aries.subsystem.obr.internal.FelixResourceAdapter.equals(FelixResourceAdapter.java:44)
        at java.util.ArrayList.indexOf(ArrayList.java:319)
        at java.util.ArrayList.contains(ArrayList.java:302)
        at 
org.apache.felix.resolver.ResolverImpl.mergeUses(ResolverImpl.java:955)
        at 
org.apache.felix.resolver.ResolverImpl.calculatePackageSpaces(ResolverImpl.java:767)
        at 
org.apache.felix.resolver.ResolverImpl.calculatePackageSpaces(ResolverImpl.java:715)
        at 
org.apache.felix.resolver.ResolverImpl.calculatePackageSpaces(ResolverImpl.java:715)
        at 
org.apache.felix.resolver.ResolverImpl.calculatePackageSpaces(ResolverImpl.java:715)
        at org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:249)
        at 
org.apache.aries.subsystem.core.internal.SubsystemResource.computeDependencies(SubsystemResource.java:410)
        at 
org.apache.aries.subsystem.core.internal.SubsystemResource.computeDependencies(SubsystemResource.java:393)
        at 
org.apache.aries.subsystem.core.internal.SubsystemResource.<init>(SubsystemResource.java:101)
        at 
org.apache.aries.subsystem.core.internal.SubsystemResource.<init>(SubsystemResource.java:92)
        at 
org.apache.aries.subsystem.core.internal.InstallAction.createSubsystemResource(InstallAction.java:128)
        at 
org.apache.aries.subsystem.core.internal.InstallAction.run(InstallAction.java:62)

  was:
The overall design of org.apache.felix.resolver.WrappedResource is that it is 
an internal type to the ResolverImpl and is not exposed to external code.  The 
fact that it does not pay attention to the namespace param is an oversite, but 
not one that effects the ResolverImpl since it uses a null param anyway and 
does its own filtering of the capabilities.

But there is a case where this type will get exposed to code outside the 
resolver implementation.  That is when calling 
org.osgi.service.resolver.ResolveContext.insertHostedCapability(List<Capability>,
 HostedCapability).

If the implementation of that method calls getResource on any of the 
capabilities of the list or the HostedCapability they will be exposed to the 
WrappedResource.  I know of one case where this causes issues when the client 
code is trying to get the osgi.identity capability of the WrappedResource.  All 
capabilities are being returned by the first one is not the expected 
osgi.identity.


> WrappedResource.getCapabilities ignores the namespace param
> -----------------------------------------------------------
>
>                 Key: FELIX-4727
>                 URL: https://issues.apache.org/jira/browse/FELIX-4727
>             Project: Felix
>          Issue Type: Bug
>          Components: Resolver
>         Environment: All
>            Reporter: Thomas Watson
>
> The overall design of org.apache.felix.resolver.WrappedResource is that it is 
> an internal type to the ResolverImpl and is not exposed to external code.  
> The fact that it does not pay attention to the namespace param is an 
> oversite, but not one that effects the ResolverImpl since it uses a null 
> param anyway and does its own filtering of the capabilities.
> But there are cases where this type will get exposed to code outside the 
> resolver implementation.  One example is when ResolverImpl.mergeUses is 
> called and does a ArrayList.contains.  Typically the types in the list are 
> provided by the ResolveContext implementation.  If a WrappedCapability is 
> passed to the ArrayList.contains method then it does an equals call across 
> all values in the list.  If a ResolveContext capability implementation of 
> that equals method calls getResource on  WrappedCapability then it will be 
> exposed to the WrappedResource.  I know of one case where this causes issues 
> when the client code is trying to get the osgi.identity capability of the 
> WrappedResource.  All capabilities are being returned but the first one is 
> not the expected osgi.identity.
> Here is a stacktrace from Aries:
> Caused by: java.lang.NullPointerException
>       at 
> org.apache.aries.subsystem.obr.internal.FelixResourceAdapter.equals(FelixResourceAdapter.java:44)
>       at java.util.ArrayList.indexOf(ArrayList.java:319)
>       at java.util.ArrayList.contains(ArrayList.java:302)
>       at 
> org.apache.felix.resolver.ResolverImpl.mergeUses(ResolverImpl.java:955)
>       at 
> org.apache.felix.resolver.ResolverImpl.calculatePackageSpaces(ResolverImpl.java:767)
>       at 
> org.apache.felix.resolver.ResolverImpl.calculatePackageSpaces(ResolverImpl.java:715)
>       at 
> org.apache.felix.resolver.ResolverImpl.calculatePackageSpaces(ResolverImpl.java:715)
>       at 
> org.apache.felix.resolver.ResolverImpl.calculatePackageSpaces(ResolverImpl.java:715)
>       at org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:249)
>       at 
> org.apache.aries.subsystem.core.internal.SubsystemResource.computeDependencies(SubsystemResource.java:410)
>       at 
> org.apache.aries.subsystem.core.internal.SubsystemResource.computeDependencies(SubsystemResource.java:393)
>       at 
> org.apache.aries.subsystem.core.internal.SubsystemResource.<init>(SubsystemResource.java:101)
>       at 
> org.apache.aries.subsystem.core.internal.SubsystemResource.<init>(SubsystemResource.java:92)
>       at 
> org.apache.aries.subsystem.core.internal.InstallAction.createSubsystemResource(InstallAction.java:128)
>       at 
> org.apache.aries.subsystem.core.internal.InstallAction.run(InstallAction.java:62)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to