package aQute.bnd.deployer.repository.providers; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.net.URI; import java.util.LinkedList; import java.util.List; import org.osgi.framework.Version; import org.osgi.impl.bundle.bindex.BundleIndexerImpl; import org.osgi.resource.Capability; import org.osgi.resource.Requirement; import org.osgi.resource.Resource; import aQute.bnd.deployer.repository.NullLogService; import aQute.bnd.deployer.repository.api.IRepositoryIndexProcessor; import aQute.bnd.deployer.repository.api.Referral; import aQute.lib.io.IO; import junit.framework.TestCase; @SuppressWarnings("restriction") public class TestObrCapReqParsing extends TestCase { private static List<Resource> parseIndex(InputStream stream, URI baseUri) throws Exception { ObrContentProvider parser = new ObrContentProvider(new BundleIndexerImpl()); final List<Resource> resources = new LinkedList<Resource>(); IRepositoryIndexProcessor processor = new IRepositoryIndexProcessor() { public void processResource(Resource resource) { resources.add(resource); } public void processReferral(URI parentUri, Referral referral, int maxDepth, int currentDepth) {} }; parser.parseIndex(stream, baseUri, processor, new NullLogService()); return resources; } public static void testObrContentCaps() throws Exception { FileInputStream stream = new FileInputStream("testdata/fullobr.xml"); URI baseUri = new File("testdata").toURI(); List<Resource> resources = parseIndex(stream, baseUri); assertEquals(7, resources.size()); Resource resource = resources.get(0); // Check identity List<Capability> idCaps = resource.getCapabilities("osgi.identity"); assertEquals(1, idCaps.size()); assertEquals("name.njbartlett.osgi.emf.minimal", idCaps.get(0).getAttributes().get("osgi.identity")); // Check content List<Capability> contentCaps = resource.getCapabilities("osgi.content"); assertEquals(1, contentCaps.size()); assertEquals( IO.getFile("testdata/bundles/name.njbartlett.osgi.emf.minimal-2.7.0.jar").getAbsoluteFile().toURI(), contentCaps.get(0).getAttributes().get("url")); // Check bundle List<Capability> bundleCaps = resource.getCapabilities("osgi.wiring.bundle"); assertEquals(1, bundleCaps.size()); assertEquals("name.njbartlett.osgi.emf.minimal", bundleCaps.get(0).getAttributes().get("osgi.wiring.bundle")); assertEquals(new Version("2.7.0.201104130744"), bundleCaps.get(0).getAttributes().get("bundle-version")); // Check packages List<Capability> pkgCaps = resource.getCapabilities("osgi.wiring.package"); assertNotNull(pkgCaps); assertEquals(14, pkgCaps.size()); assertEquals("org.eclipse.emf.common", pkgCaps.get(0).getAttributes().get("osgi.wiring.package")); assertEquals(new Version("2.7.0.201104130744"), pkgCaps.get(0).getAttributes().get("version")); assertEquals("org.eclipse.core.runtime,org.eclipse.emf.common.util,org.osgi.framework", pkgCaps.get(0).getDirectives().get("uses")); // Check service capabilities of felix.shell bundle List<Capability> svcCaps = resources.get(4).getCapabilities("osgi.service"); assertNotNull(svcCaps); assertEquals(2, svcCaps.size()); assertEquals("org.apache.felix.shell.ShellService", svcCaps.get(0).getAttributes().get("osgi.service")); assertEquals("org.ungoverned.osgi.service.shell.ShellService", svcCaps.get(1).getAttributes().get("osgi.service")); } public static void testObrContentReqs() throws Exception { FileInputStream stream = new FileInputStream("testdata/fullobr.xml"); URI baseUri = new File("testdata").toURI(); List<Resource> resources = parseIndex(stream, baseUri); assertEquals(7, resources.size()); // Check package imports of emf.minimal 2.7.0 List<Requirement> pkgReqs = resources.get(0).getRequirements("osgi.wiring.package"); assertNotNull(pkgReqs); assertEquals(20, pkgReqs.size()); // Check mandatory/optional and filters assertNull(pkgReqs.get(0).getDirectives().get("resolution")); assertEquals("optional", pkgReqs.get(5).getDirectives().get("resolution")); assertEquals("(&(osgi.wiring.package=javax.crypto)(version>=0.0.0))", pkgReqs.get(0).getDirectives().get("filter")); // Check service requires of felix.shell List<Requirement> svcReqs = resources.get(4).getRequirements("osgi.service"); assertNotNull(svcReqs); assertEquals(2, svcReqs.size()); assertEquals("(osgi.service=org.osgi.service.startlevel.StartLevel)", svcReqs.get(0).getDirectives().get("filter")); assertEquals("(osgi.service=org.osgi.service.packageadmin.PackageAdmin)", svcReqs.get(1).getDirectives().get("filter")); } public static void testObrEEReq() throws Exception { FileInputStream stream = new FileInputStream("testdata/bree-obr.xml"); URI baseUri = new File("testdata").toURI(); List<Resource> resources = parseIndex(stream, baseUri); assertEquals(1, resources.size()); List<Requirement> eeReqs = resources.get(0).getRequirements("osgi.ee"); assertNotNull(eeReqs); assertEquals(1, eeReqs.size()); assertEquals("(|(osgi.ee=J2SE-1.4)(osgi.ee=OSGi/Minimum-1.1))", eeReqs.get(0).getDirectives().get("filter")); } }