RepositoryServiceRepository implements org.apache.aries.subsystem.core.repository.Repository { @SuppressWarnings("unchecked") public Collection<Capability> findProviders(Requirement requirement) { Set<Capability> result = new HashSet<Capability>(); ServiceReference<?>[] references; try { references = context.getAllServiceReferences("org.osgi.service.repository.Repository", null); if (references == null) return result; } catch (InvalidSyntaxException e) { throw new IllegalStateException(e); } for (ServiceReference<?> reference : references) { Object repository = context.getService(reference); if (repository == null) continue; try { Class<?> clazz = repository.getClass(); Class<?> repoInterface = null; while (clazz != null && repoInterface == null) { for (Class<?> intf : clazz.getInterfaces()) { if (Repository.class.getName().equals(intf.getName())) { repoInterface = intf; break; } } clazz = clazz.getSuperclass(); } if (repoInterface == null) { continue; } Map<Requirement, Collection<Capability>> map; try { Method method = repoInterface.getMethod("findProviders", Collection.class); map = (Map<Requirement, Collection<Capability>>)method.invoke(repository, Collections.singleton(requirement)); } catch (Exception e) { throw new SubsystemException(e); } Collection<Capability> capabilities = map.get(requirement); if (capabilities == null) continue; result.addAll(capabilities); } finally { context.ungetService(reference); } } return result; } RepositoryServiceRepository();   RepositoryServiceRepository(BundleContext ctx); @SuppressWarnings("unchecked") Collection<Capability> findProviders(Requirement requirement); @Override Map<Requirement, Collection<Capability>> findProviders(Collection<? extends Requirement> requirements);  }
@Test public void testFindProviders() throws Exception { BundleContext bc = EasyMock.createNiceMock(BundleContext.class); RepositoryServiceRepository rsr = new RepositoryServiceRepository(bc); @SuppressWarnings("unchecked") ServiceReference<Object> sr = EasyMock.createMock(ServiceReference.class); @SuppressWarnings("unchecked") ServiceReference<Object> sr2 = EasyMock.createMock(ServiceReference.class); @SuppressWarnings("unchecked") ServiceReference<Object> sr3 = EasyMock.createMock(ServiceReference.class); EasyMock.expect(bc.getAllServiceReferences("org.osgi.service.repository.Repository", null)). andReturn(new ServiceReference[] {sr, sr2, sr3}).anyTimes(); TestRepository tr = new TestRepository(); EasyMock.expect(bc.getService(sr)).andReturn(tr).anyTimes(); ToastRepository tr2 = new ToastRepository(); EasyMock.expect(bc.getService(sr2)).andReturn(tr2).anyTimes(); Repository tr3 = Creator.create(); EasyMock.expect(bc.getService(sr3)).andReturn(tr3).anyTimes(); EasyMock.replay(bc); Map<String, String> dirs = Collections.singletonMap("filter", "(org.foo=bar)"); Requirement req = new TestRequirement("org.foo", dirs); Collection<Capability> res = rsr.findProviders(req); assertEquals(1, res.size()); Capability cap = res.iterator().next(); assertEquals("org.foo", cap.getNamespace()); assertEquals(1, cap.getAttributes().size()); assertEquals("bar", cap.getAttributes().get("org.foo")); Map<String, String> dirs2 = Collections.singletonMap("filter", "(org.foo=b)"); Requirement req2 = new TestRequirement("poing", dirs2); Collection<Capability> res2 = rsr.findProviders(req2); assertEquals(1, res2.size()); Capability cap2 = res2.iterator().next(); assertEquals("poing", cap2.getNamespace()); assertEquals(1, cap2.getAttributes().size()); assertEquals("b", cap2.getAttributes().get("org.foo")); Map<String, String> dirs3 = Collections.singletonMap("filter", "(x=y)"); Requirement req3 = new TestRequirement("ns1", dirs3); Collection<Capability> res3 = rsr.findProviders(req3); assertEquals(1, res3.size()); Capability cap3 = res3.iterator().next(); assertEquals("ns1", cap3.getNamespace()); assertEquals(1, cap3.getAttributes().size()); assertEquals("y", cap3.getAttributes().get("x")); }