[FELIX-4370] Additional work to support the OSGi Repository Service.

Improved the mapping between OBR and OSGi namespaces.
This also fixes an OSGi Repository CT failure:
  RepositoryTest.testRepositoryContent()


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1591679 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixCapabilityAdapter.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixCapabilityAdapter.java
index 5d3e7bb..957950b 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixCapabilityAdapter.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixCapabilityAdapter.java
@@ -15,8 +15,11 @@
 
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import org.osgi.framework.namespace.BundleNamespace;
+import org.osgi.framework.namespace.PackageNamespace;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Resource;
 
@@ -39,17 +42,42 @@
         if (convertedAttributes == null)
         {
             Map<String, Object> orgMap = capability.getPropertiesAsMap();
-            HashMap<String, Object> converted = new HashMap<String, Object>(orgMap.size());
+            HashMap<String, Object> converted = new HashMap<String, Object>(orgMap.size() + 2);
 
             for (Map.Entry<String, Object> entry : orgMap.entrySet())
             {
                 converted.put(NamespaceTranslator.getOSGiNamespace(entry.getKey()), entry.getValue());
             }
-            convertedAttributes = converted; // Cache the result
+
+            if (BundleNamespace.BUNDLE_NAMESPACE.equals(getNamespace()))
+            {
+                defaultAttribute(orgMap, converted, BundleNamespace.BUNDLE_NAMESPACE,
+                    orgMap.get(org.apache.felix.bundlerepository.Resource.SYMBOLIC_NAME));
+                defaultAttribute(orgMap, converted, BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE,
+                    orgMap.get(org.apache.felix.bundlerepository.Resource.VERSION));
+            }
+            else if (PackageNamespace.PACKAGE_NAMESPACE.equals(getNamespace()))
+            {
+                Capability bundleCap = getBundleCapability();
+                if (bundleCap != null)
+                {
+                    defaultAttribute(orgMap, converted, PackageNamespace.CAPABILITY_BUNDLE_SYMBOLICNAME_ATTRIBUTE,
+                        bundleCap.getAttributes().get(BundleNamespace.BUNDLE_NAMESPACE));
+                    defaultAttribute(orgMap, converted, PackageNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE,
+                        bundleCap.getAttributes().get(BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE));
+                }
+            }
+            convertedAttributes = converted;
         }
         return convertedAttributes;
     }
 
+    private void defaultAttribute(Map<String, Object> orgMap, Map<String, Object> converted, String newAttr, Object defVal)
+    {
+        if (converted.get(newAttr) == null)
+            converted.put(newAttr, defVal);
+    }
+
     public Map<String, String> getDirectives()
     {
         return Collections.emptyMap();
@@ -65,6 +93,18 @@
         return resource;
     }
 
+    private Capability getBundleCapability()
+    {
+        if (resource == null)
+            return null;
+
+        List<Capability> caps = resource.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE);
+        if (caps.size() > 0)
+            return caps.get(0);
+        else
+            return null;
+    }
+
     @Override
     public boolean equals(Object o)
     {
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixResourceAdapter.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixResourceAdapter.java
index 90689f6..8ba993a 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixResourceAdapter.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/FelixResourceAdapter.java
@@ -16,7 +16,6 @@
 import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -38,25 +37,23 @@
 
     public List<Capability> getCapabilities(String namespace)
     {
+        ArrayList<Capability> result = new ArrayList<Capability>();
+
         if (namespace == null || namespace.equals(IdentityNamespace.IDENTITY_NAMESPACE))
         {
-            // TODO cater for null request
-            Object type = resource.getProperties().get(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE);
             OSGiCapabilityImpl c = OSGiRepositoryImpl.newOSGiIdentityCapability(resource);
             c.setResource(this);
-            return Collections.<Capability>singletonList(c);
+            result.add(c);
         }
-        if (namespace.equals(ContentNamespace.CONTENT_NAMESPACE))
+        if (namespace == null || namespace.equals(ContentNamespace.CONTENT_NAMESPACE))
         {
-            // TODO cater for null request
             OSGiCapabilityImpl c = OSGiRepositoryImpl.newOSGiContentCapability(resource.getURI(), resource.getSize());
             c.setResource(this);
-            return Collections.<Capability>singletonList(c);
+            result.add(c);
         }
 
         namespace = NamespaceTranslator.getFelixNamespace(namespace);
         org.apache.felix.bundlerepository.Capability[] capabilities = resource.getCapabilities();
-        ArrayList<Capability> result = new ArrayList<Capability>(capabilities.length);
         for (org.apache.felix.bundlerepository.Capability capability : capabilities)
         {
             if (namespace != null && !capability.getName().equals(namespace))
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryImpl.java
index b5c9fca..d571dfb 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryImpl.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryImpl.java
@@ -25,7 +25,6 @@
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -41,7 +40,6 @@
 import org.osgi.resource.Capability;
 import org.osgi.resource.Namespace;
 import org.osgi.resource.Requirement;
-import org.osgi.resource.Resource;
 import org.osgi.service.repository.ContentNamespace;
 import org.osgi.service.repository.Repository;
 
@@ -107,28 +105,21 @@
     private void addResourceForIdentity(final org.apache.felix.bundlerepository.Resource res, Filter filter, List<Capability> caps)
         throws Exception
     {
-        OSGiCapabilityImpl idCap = newOSGiIdentityCapability(res);
+        List<Capability> idCaps = new FelixResourceAdapter(res).getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE);
+        if (idCaps.size() == 0)
+            return;
+
+        Capability idCap = idCaps.get(0); // there should only be one osgi.identity anyway
         if (filter != null)
         {
             if (!filter.matches(idCap.getAttributes()))
                 return;
         }
-
-        OSGiCapabilityImpl contentCap = newOSGiContentCapability(res.getURI(), res.getSize());
-
-        List<OSGiCapabilityImpl> capabilities = Arrays.<OSGiCapabilityImpl>asList(idCap, contentCap);
-        Resource resource =
-            new OSGiResourceImpl(capabilities, Collections.<Requirement>emptyList());
-
-        for (OSGiCapabilityImpl c : capabilities)
-        {
-            c.setResource(resource);
-        }
-
         caps.add(idCap);
     }
 
-    static OSGiCapabilityImpl newOSGiIdentityCapability(org.apache.felix.bundlerepository.Resource res) {
+    static OSGiCapabilityImpl newOSGiIdentityCapability(org.apache.felix.bundlerepository.Resource res)
+    {
         @SuppressWarnings("unchecked")
         Map<String, Object> idAttrs = new HashMap<String, Object>(res.getProperties());
 
@@ -144,7 +135,8 @@
     static OSGiCapabilityImpl newOSGiContentCapability(final String uri, long size)
     {
         LazyValue<String, Object> lazyValue =
-            new LazyValue<String, Object>(ContentNamespace.CONTENT_NAMESPACE, new Callable<Object>() {
+            new LazyValue<String, Object>(ContentNamespace.CONTENT_NAMESPACE, new Callable<Object>()
+            {
                 public Object call() throws Exception
                 {
                     // This is expensive to do, so only compute it when actually obtained...
diff --git a/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryImplTest.java b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryImplTest.java
index c00a2cc..7bc728a 100644
--- a/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryImplTest.java
+++ b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryImplTest.java
@@ -34,7 +34,9 @@
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Version;
+import org.osgi.framework.namespace.BundleNamespace;
 import org.osgi.framework.namespace.IdentityNamespace;
+import org.osgi.framework.namespace.PackageNamespace;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
@@ -44,7 +46,7 @@
 
 public class OSGiRepositoryImplTest extends TestCase
 {
-    public void testIdentityAndContentCapabilities() throws Exception
+    public void testCapabilities() throws Exception
     {
         RepositoryAdminImpl repoAdmin = createRepositoryAdmin();
         URL url = getClass().getResource("/another_repository.xml");
@@ -74,7 +76,10 @@
         assertEquals(0, res.getRequirements(null).size());
         assertEquals(1, res.getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE).size());
         assertEquals(1, res.getCapabilities(ContentNamespace.CONTENT_NAMESPACE).size());
-        assertEquals(2, res.getCapabilities(null).size());
+        assertEquals(1, res.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE).size());
+        assertEquals(8, res.getCapabilities(PackageNamespace.PACKAGE_NAMESPACE).size());
+        assertEquals(1, res.getCapabilities("foo").size());
+        assertEquals(12, res.getCapabilities(null).size());
 
         Capability contentCap = res.getCapabilities(ContentNamespace.CONTENT_NAMESPACE).iterator().next();
         assertEquals("4b68ab3847feda7d6c62c1fbcbeebfa35eab7351ed5e78f4ddadea5df64b8015",
@@ -83,6 +88,21 @@
                 contentCap.getAttributes().get(ContentNamespace.CAPABILITY_URL_ATTRIBUTE));
         assertEquals(1L, contentCap.getAttributes().get(ContentNamespace.CAPABILITY_SIZE_ATTRIBUTE));
         assertEquals("application/vnd.osgi.bundle", contentCap.getAttributes().get(ContentNamespace.CAPABILITY_MIME_ATTRIBUTE));
+
+        Capability bundleCap = res.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE).iterator().next();
+        assertEquals("2", bundleCap.getAttributes().get("manifestversion"));
+        assertEquals("dummy", bundleCap.getAttributes().get(BundleNamespace.BUNDLE_NAMESPACE));
+        assertEquals(Version.parseVersion("1.0.0.SNAPSHOT"), bundleCap.getAttributes().get(BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE));
+        assertEquals("Unnamed - dummy", bundleCap.getAttributes().get("presentationname"));
+
+        Capability packageCap = res.getCapabilities(PackageNamespace.PACKAGE_NAMESPACE).get(7);
+        assertEquals("org.apache.commons.logging", packageCap.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE));
+        assertEquals(Version.parseVersion("1.0.4"), packageCap.getAttributes().get(PackageNamespace.CAPABILITY_VERSION_ATTRIBUTE));
+        assertEquals("dummy", packageCap.getAttributes().get(PackageNamespace.CAPABILITY_BUNDLE_SYMBOLICNAME_ATTRIBUTE));
+        assertEquals(Version.parseVersion("1.0.0.SNAPSHOT"), packageCap.getAttributes().get(PackageNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE));
+
+        Capability fooCap = res.getCapabilities("foo").iterator().next();
+        assertEquals("someVal", fooCap.getAttributes().get("someKey"));
     }
 
     public void testIdentityCapabilityFilter() throws Exception