You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by Cristiano <cv...@gmail.com> on 2019/01/22 11:21:45 UTC

[BundleRepository] Anyone knows the reason findProviders() is merging attributes from Identity and Content capabilities?

Hello devs,

I'm integrating BundleRepository with a ResolveContext and I found a 
problem while trying to get some capabilities from repository when using 
R5 spec findProviders().

I have discovered that findProviders's result is not returning a Content 
capability only one Identity capability containing attributes from both 
Identity and Content.

I did a debug and found that BR's SpecXMLPullParser class is the 
responsible for merging those attributes into one identity capability.

Anyone knows what is the reason for that ?   this behavior is not 
following the spec, right ?

thanks,

Cristiano


Below is some methods taken from SpecXMLPullParser that shows the 
current behavior:

>     private static Capability parseCapability(XmlPullParser reader, 
> ResourceImpl resource, URI baseUri) throws Exception
>     {
>         String namespace = reader.getAttributeValue(null, NAMESPACE);
>         if (IdentityNamespace.IDENTITY_NAMESPACE.equals(namespace))
>         {
> *parseIdentityNamespace(reader, resource);**
> **            return null;*
>         }
>         if (ContentNamespace.CONTENT_NAMESPACE.equals(namespace))
>         {
>             if (resource.getURI() == null)
>             {
> *  parseContentNamespace(reader, resource, baseUri);**
> **                return null;*
>             }
>             // if the URI is already set, this is a second 
> osgi.content capability.
>             // The first content capability, which is the main one, is 
> stored in the Resource.
>             // Subsequent content capabilities are stored are ordinary 
> capabilities.
>         }

>     private static Resource parseResource(XmlPullParser reader, URI 
> baseUri) throws Exception
>     {
>         ResourceImpl resource = new ResourceImpl();
>         try
>         {
>             int event;
>             while ((event = reader.nextTag()) == XmlPullParser.START_TAG)
>             {
>                 String element = reader.getName();
>                 if (CAPABILITY.equals(element))
>                 {
>                     Capability capability = parseCapability(reader, 
> resource, baseUri);
> *if (capability != null)*
>                         resource.addCapability(capability);
>                 }
>                 else if (REQUIREMENT.equals(element))
>                 {
>                     Requirement requirement = parseRequirement(reader);
>                     if (requirement != null) {
>                         resource.addRequire(requirement);
>                     }
>                 }
>                 else
>                 {
>                     PullParser.ignoreTag(reader);
>                 }
>             }
>
>             PullParser.sanityCheckEndElement(reader, event, RESOURCE);
>             return resource;
>         }
>         catch (Exception e)
>         {
>             throw new Exception("Error while parsing resource " + 
> resource.getId() + " at line " + reader.getLineNumber() + " and column 
> " + reader.getColumnNumber(), e);
>         }
>     }

>     private static void parseIdentityNamespace(XmlPullParser reader, 
> ResourceImpl resource) throws Exception
>     {
>         Map<String, Object> attributes = new HashMap<String, Object>();
>         parseAttributesDirectives(reader, attributes, new 
> HashMap<String, String>(), CAPABILITY);
>         // TODO need to cater for the singleton directive...
>
>         for (Map.Entry<String, Object> entry : attributes.entrySet())
>         {
> *if (IdentityNamespace.IDENTITY_NAMESPACE.equals(entry.getKey()))**
> **                resource.put(Resource.SYMBOLIC_NAME, entry.getValue());*
>             else
>                 resource.put(entry.getKey(), entry.getValue());
>         }
>     }