Author: davidb
Date: Tue Mar  1 12:21:55 2016
New Revision: 1733051

URL: http://svn.apache.org/viewvc?rev=1733051&view=rev
Log:
FELIX-5195 Provide-Capability not being processed for Resources

Applying patch in behalf of Stephen Kahmann with many thanks.
This closes #53

Modified:
    
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java
    
felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/DataModelHelperTest.java
    
felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/ResolverImplTest.java
    felix/trunk/bundlerepository/src/test/resources/spec_repository.gz
    felix/trunk/bundlerepository/src/test/resources/spec_repository.xml

Modified: 
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java?rev=1733051&r1=1733050&r2=1733051&view=diff
==============================================================================
--- 
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java
 (original)
+++ 
felix/trunk/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java
 Tue Mar  1 12:21:55 2016
@@ -560,6 +560,7 @@ public class DataModelHelperImpl impleme
         doExports(resource, headers);
         doImports(resource, headers);
         doExecutionEnvironment(resource, headers);
+        doProvides(resource, headers);
     }
 
     private static void doCategories(ResourceImpl resource, Headers headers)
@@ -704,6 +705,17 @@ public class DataModelHelperImpl impleme
         }
     }
 
+    private static void doProvides(ResourceImpl resource, Headers headers) {
+        Clause[] clauses = 
Parser.parseHeader(headers.getHeader(Constants.PROVIDE_CAPABILITY));
+
+        if (clauses != null) {
+            for (Clause clause : clauses) {
+                CapabilityImpl capability = createCapability(clause.getName(), 
clause);
+                resource.addCapability(capability);
+            }
+        }
+    }
+
     private static CapabilityImpl createCapability(String name, Clause clause)
     {
         CapabilityImpl capability = new CapabilityImpl(name);
@@ -713,7 +725,7 @@ public class DataModelHelperImpl impleme
         for (int i = 0; attributes != null && i < attributes.length; i++)
         {
             String key = attributes[i].getName();
-            if (key.equalsIgnoreCase(Constants.PACKAGE_SPECIFICATION_VERSION) 
|| key.equalsIgnoreCase(Constants.VERSION_ATTRIBUTE))
+            if (key.equalsIgnoreCase(Constants.PACKAGE_SPECIFICATION_VERSION) 
|| key.equalsIgnoreCase(Constants.VERSION_ATTRIBUTE) || 
key.equalsIgnoreCase("version:Version"))
             {
                 continue;
             }
@@ -846,6 +858,11 @@ public class DataModelHelperImpl impleme
         {
             v = clause.getAttribute(Constants.BUNDLE_VERSION_ATTRIBUTE);
         }
+        if (v == null)
+        {
+            v = clause.getAttribute("version:Version");
+        }
+
         return VersionCleaner.clean(v);
     }
 

Modified: 
felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/DataModelHelperTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/DataModelHelperTest.java?rev=1733051&r1=1733050&r2=1733051&view=diff
==============================================================================
--- 
felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/DataModelHelperTest.java
 (original)
+++ 
felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/DataModelHelperTest.java
 Tue Mar  1 12:21:55 2016
@@ -19,13 +19,20 @@
 package org.apache.felix.bundlerepository.impl;
 
 import java.net.URL;
+import java.util.Map;
 import java.util.jar.Attributes;
 
 import junit.framework.TestCase;
+import org.apache.felix.bundlerepository.Capability;
 import org.apache.felix.bundlerepository.DataModelHelper;
 import org.apache.felix.bundlerepository.Repository;
 import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.utils.manifest.Clause;
+import org.osgi.framework.Constants;
+
 import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 public class DataModelHelperTest extends TestCase
 {
@@ -65,7 +72,49 @@ public class DataModelHelperTest extends
         
r.setFilter("(&(package=javax.transaction)(partial=true)(mandatory:<*partial))");
         
assertEquals("(&(package=javax.transaction)(partial=true)(mandatory:<*partial))",
 r.getFilter());
     }
-    
+
+    public void testCapabilities() throws Exception {
+        Attributes attr = new Attributes();
+        attr.putValue("Manifest-Version", "1.0");
+        attr.putValue("Bundle-Name", "Apache Felix Utils");
+        attr.putValue("Bundle-Version", "0.1.0.SNAPSHOT");
+        attr.putValue("Bundle-ManifestVersion", "2");
+        attr.putValue("Bundle-License", 
"http://www.apache.org/licenses/LICENSE-2.0.txt";);
+        attr.putValue("Bundle-Description", "Utility classes for OSGi.");
+        attr.putValue("Import-Package", 
"org.osgi.framework;version=\"[1.4,2)\"");
+        attr.putValue("Bundle-SymbolicName", "org.apache.felix.utils");
+        attr.putValue("Provide-Capability", 
"osgi.extender;osgi.extender=\"osgi.component\";uses:=\"\n" +
+                " 
org.osgi.service.component\";version:Version=\"1.3\",osgi.service;objectCl\n" +
+                " 
ass:List<String>=\"org.osgi.service.component.runtime.ServiceComponentRu\n" +
+                " ntime\";uses:=\"org.osgi.service.component.runtime\"");
+
+        Resource resource = dmh.createResource(attr);
+
+        assertEquals(3, resource.getCapabilities().length);
+
+        Capability bundleCap = null;
+        Capability osgiExtenderCap = null;
+        Capability osgiServiceCap = null;
+
+        for (Capability capability : resource.getCapabilities()) {
+            if (capability.getName().equals("bundle")) {
+                bundleCap = capability;
+            } else if (capability.getName().equals("osgi.extender")) {
+                osgiExtenderCap = capability;
+            } else {
+                osgiServiceCap = capability;
+            }
+        }
+
+        assertNotNull(bundleCap);
+        assertNotNull(osgiExtenderCap);
+        assertNotNull(osgiServiceCap);
+
+        assertEquals("osgi.extender", osgiExtenderCap.getName());
+        assertEquals("osgi.component", 
osgiExtenderCap.getPropertiesAsMap().get("osgi.extender"));
+        assertEquals("1.3.0", 
osgiExtenderCap.getPropertiesAsMap().get(Constants.VERSION_ATTRIBUTE).toString());
+    }
+
     public void testGzipResource() throws Exception {
         URL urlArchive = getClass().getResource("/spec_repository.gz");
         assertNotNull("GZ archive was not found", urlArchive);

Modified: 
felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/ResolverImplTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/ResolverImplTest.java?rev=1733051&r1=1733050&r2=1733051&view=diff
==============================================================================
--- 
felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/ResolverImplTest.java
 (original)
+++ 
felix/trunk/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/ResolverImplTest.java
 Tue Mar  1 12:21:55 2016
@@ -60,9 +60,7 @@ public class ResolverImplTest extends Te
     {
         URL url = getClass().getResource("/spec_repository.xml");
         RepositoryAdminImpl repoAdmin = createRepositoryAdmin();
-        RepositoryImpl repo = (RepositoryImpl) repoAdmin.addRepository(url);
-
-        System.out.println(repo.getResources().length + " Resources in Repo");
+        repoAdmin.addRepository(url);
 
         Resolver resolver = repoAdmin.resolver();
 
@@ -71,6 +69,46 @@ public class ResolverImplTest extends Te
 
         Requirement[] requirements = { requirement };
 
+        Resource[] discoverResources = 
repoAdmin.discoverResources(requirements);
+        assertNotNull(discoverResources);
+        assertEquals(1, discoverResources.length);
+
+        resolver.add(discoverResources[0]);
+        assertTrue("Resolver could not resolve", resolver.resolve());
+    }
+
+    public void testSpec2() throws Exception
+    {
+        URL url = getClass().getResource("/spec_repository.xml");
+        RepositoryAdminImpl repoAdmin = createRepositoryAdmin();
+        repoAdmin.addRepository(url);
+
+        Resolver resolver = repoAdmin.resolver();
+
+        // Create a Local Resource with an extender capability
+        CapabilityImpl capability = new CapabilityImpl("osgi.extender");
+        capability.addProperty("osgi.extender", "osgi.component");
+        capability.addProperty("version", "Version", "1.3");
+
+        org.apache.felix.bundlerepository.Capability[] capabilities = { 
capability };
+
+        Resource resource = EasyMock.createMock(Resource.class);
+        
EasyMock.expect(resource.getSymbolicName()).andReturn("com.test.bundleA").anyTimes();
+        EasyMock.expect(resource.getRequirements()).andReturn(null).anyTimes();
+        
EasyMock.expect(resource.getCapabilities()).andReturn(capabilities).anyTimes();
+        
EasyMock.expect(resource.getURI()).andReturn("http://test.com";).anyTimes();
+        EasyMock.expect(resource.isLocal()).andReturn(true).anyTimes();
+
+        EasyMock.replay(resource);
+
+        resolver.add(resource);
+
+        // Set the requirements to get the bundle
+        RequirementImpl requirement = new RequirementImpl("foo");
+        requirement.setFilter("(bar=bread)");
+
+        Requirement[] requirements = { requirement };
+
         Resource[] discoverResources = 
repoAdmin.discoverResources(requirements);
         assertNotNull(discoverResources);
         assertEquals(1, discoverResources.length);

Modified: felix/trunk/bundlerepository/src/test/resources/spec_repository.gz
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/test/resources/spec_repository.gz?rev=1733051&r1=1733050&r2=1733051&view=diff
==============================================================================
Binary files - no diff available.

Modified: felix/trunk/bundlerepository/src/test/resources/spec_repository.xml
URL: 
http://svn.apache.org/viewvc/felix/trunk/bundlerepository/src/test/resources/spec_repository.xml?rev=1733051&r1=1733050&r2=1733051&view=diff
==============================================================================
--- felix/trunk/bundlerepository/src/test/resources/spec_repository.xml 
(original)
+++ felix/trunk/bundlerepository/src/test/resources/spec_repository.xml Tue Mar 
 1 12:21:55 2016
@@ -44,6 +44,27 @@
       <directive name='filter' value='(osgi.wiring.package=com.foo)'/>
     </requirement>
   </resource>
+    <resource>
+        <capability namespace='osgi.identity'>
+            <attribute name='osgi.identity' 
value='org.apache.felix.bundlerepository.test_file_5'/>
+            <attribute name='type' value='osgi.bundle'/>
+            <attribute name='version' type='Version' value='2.2.3.something'/>
+            <attribute name='license' 
value='http://www.opensource.org/licenses/mytestlicense2' />
+        </capability>
+        <capability namespace='osgi.content'>
+            <attribute name='osgi.content' 
value='a1c64578808c38a63cd6563e9936f025638aeaf9de70f36765367db81c0afc38'/>
+            <attribute name='url' value='repo_files/test_file_5.jar'/>
+            <attribute name='size' type='Long' value='3'/>
+            <attribute name='mime' value='application/vnd.osgi.bundle'/>
+        </capability>
+        <capability namespace='foo'>
+            <attribute name='bar' value='bread'/>
+        </capability>
+        <requirement namespace="osgi.extender">
+            <directive name="filter" 
value="(&amp;(osgi.extender=osgi.component)(version&gt;=1.0.0)(!(version&gt;=2.0.0)))"/>
+            <directive name="effective" value="active"/>
+        </requirement>
+    </resource>
   <resource>
     <capability namespace='osgi.identity'>
       <attribute name='osgi.identity' value='org.apache.sshd.core'/>


Reply via email to