package aQute.bnd.deployer.repository.wrapper;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import aQute.bnd.build.Workspace;
import aQute.bnd.jpm.Repository;
import aQute.bnd.osgi.resource.CapReqBuilder;
import aQute.bnd.service.repository.InfoRepository;
import aQute.bnd.version.Version;
import aQute.lib.deployer.InfoFileRepo;
import aQute.lib.io.IO;
import aQute.lib.utf8properties.UTF8Properties;
import aQute.libg.map.MAP;
import junit.framework.TestCase;
public class TestWrapper extends TestCase {
private File tmp;
public void setUp() throws Exception {
tmp = IO.getFile("generated/tmp/test/" + getName());
System.setProperty("jpm4j.in.test", "true");
tmp.mkdirs();
IO.delete(tmp);
tmp.mkdirs();
}
public void tearDown() throws Exception {
IO.delete(tmp);
}
/**
* Could not find an Import-Service capability // This turned out to be
* caused by a toLowerCase in the filter :-(
*/
public void testImportService() throws Exception {
InfoRepositoryWrapper iw = getRepo();
Requirement cr = new CapReqBuilder("osgi.service").filter("(objectClass=org.slf4j.Logger)")
.addDirective("effective", "active")
.buildSyntheticRequirement();
Map<Requirement,Collection<Capability>> provider = iw.findProviders(Collections.singleton(cr));
assertNotNull(provider);
assertEquals(1, provider.size());
Capability cap = provider.values().iterator().next().iterator().next();
Resource resource = cap.getResource();
assertNotNull(resource);
List<Capability> capabilities = resource.getCapabilities("osgi.identity");
assertEquals(1, capabilities.size());
Capability identity = capabilities.iterator().next();
assertEquals("osgi.logger.provider", identity.getAttributes().get("osgi.identity"));
}
/**
* Attributes do not properly encode lists (they are encoded as "[a,b]",
* e.g. there is a toString somewhere // This turned out to be caused by the
* PersistentResource.getAttr conversion/type guessing. We always turned an
* object into a string; so lists became strings.
*/
public void testListsBecomeStrings() throws Exception {
InfoRepositoryWrapper iw = getRepo();
Requirement cr = new CapReqBuilder("osgi.service").filter("(objectClass=osgi.enroute.logger.api.LoggerAdmin)")
.addDirective("effective", "active")
.buildSyntheticRequirement();
Map<Requirement,Collection<Capability>> provider = iw.findProviders(Collections.singleton(cr));
assertEquals(1, provider.size());
}
public void testJPMRepoBasic() throws Exception {
try (Repository repo = getJpmRepo();) {
testRepo(1, repo);
}
}
public void testFileRepoBasic() throws Exception {
try (InfoFileRepo repo = getFileRepo(true);) {
testRepo(1, repo);
}
}
public void testFileRepoBasicWithoutIndex() throws Exception {
try (InfoFileRepo repo = getFileRepo(false);) {
testRepo(0, repo);
}
}
private void testRepo(int count, InfoRepository... repo) throws Exception, FileNotFoundException, IOException {
List<InfoRepository> repos = Arrays.asList(repo);
for (InfoRepository r : repos) {
assertNotNull(r.get("biz.aQute.jpm.daemon", new Version("1.1.0"), null));
}
InfoRepositoryWrapper iw = new InfoRepositoryWrapper(tmp, repos);
Requirement req = CapReqBuilder.createBundleRequirement("biz.aQute.jpm.daemon", null)
.buildSyntheticRequirement();
Map<Requirement,Collection<Capability>> result = iw.findProviders(Arrays.asList(req));
assertNotNull(result);
assertEquals(count, result.size());
iw.close();
iw = new InfoRepositoryWrapper(tmp, repos);
result = iw.findProviders(Arrays.asList(req));
assertNotNull(result);
assertEquals(count, result.size());
iw.close();
for (InfoRepository r : repos) {
if (r instanceof Closeable)
((Closeable) r).close();
}
}
/**
* Test the augments facility. This allows us to add caps/reqs to bundles
* with a file from the workspace.
*/
public void testAugment() throws Exception {
Repository repo = getJpmRepo();
augmentTest(repo);
}
public void testFileRepoAugment() throws Exception {
InfoFileRepo repo = getFileRepo(true);
augmentTest(repo);
}
private void augmentTest(InfoRepository repo) throws Exception, IOException {
assertNotNull(repo.get("biz.aQute.jpm.daemon", new Version("1.1.0"), null));
InfoRepositoryWrapper iw = new InfoRepositoryWrapper(tmp, Collections.singleton(repo));
Properties augments = new UTF8Properties();
augments.load(new StringReader("biz.aQute.jpm.daemon: cap=test;test=1\n"));
iw.addAugment(augments);
//
// Get the test and identity capability
//
Requirement testreq = new CapReqBuilder("test").filter("(test=1)").buildSyntheticRequirement();
Requirement identity = new CapReqBuilder("osgi.identity").filter("(osgi.identity=biz.aQute.jpm.daemon)")
.buildSyntheticRequirement();
Map<Requirement,Collection<Capability>> result = iw.findProviders(Arrays.asList(testreq, identity));
assertNotNull(result);
assertEquals(2, result.size());
//
// Test if they come from the same resource
//
Capability testcap = result.get(testreq).iterator().next();
Capability identitycap = result.get(identity).iterator().next();
assertNotNull(testcap);
assertNotNull(identitycap);
assertEquals(testcap.getResource(), identitycap.getResource());
iw.close();
}
/**
* Test the augments facility. This allows us to add caps/reqs to bundles
* with a file from the workspace.
*/
public void testAugment2() throws Exception {
File cache = new File("generated/tmp/test/cache");
IO.deleteWithException(cache);
Workspace ws = Workspace.getWorkspace(IO.getFile("testdata/ws"));
assertNotNull(ws);
Repository repo = ws.getPlugin(Repository.class);
assertNotNull(repo);
assertNotNull(repo.get("biz.aQute.jpm.daemon", new Version("1.1.0"), null));
org.osgi.service.repository.Repository osgi = ws.getPlugin(org.osgi.service.repository.Repository.class);
//
// Get the test and identity capability
//
Requirement testreq = new CapReqBuilder("test").filter("(test=1)").buildSyntheticRequirement();
Requirement identity = new CapReqBuilder("osgi.identity").filter("(osgi.identity=biz.aQute.jpm.daemon)")
.buildSyntheticRequirement();
Map<Requirement,Collection<Capability>> result = osgi.findProviders(Arrays.asList(testreq, identity));
assertNotNull(result);
assertEquals(2, result.size());
//
// Test if they come from the same resource
//
Capability testcap = result.get(testreq).iterator().next();
Capability identitycap = result.get(identity).iterator().next();
assertNotNull(testcap);
assertNotNull(identitycap);
assertEquals(testcap.getResource(), identitycap.getResource());
}
private Repository getJpmRepo() {
Repository repo = new Repository();
repo.setProperties(MAP.$("location", tmp.getAbsolutePath()).$("index", "testdata/ws/cnf/jpm4j.json"));
return repo;
}
private InfoRepositoryWrapper getRepo() throws Exception {
Repository repo = getJpmRepo();
InfoRepositoryWrapper iw = new InfoRepositoryWrapper(tmp, Collections.singleton(repo));
return iw;
}
private InfoFileRepo getFileRepo(boolean info) throws Exception, FileNotFoundException {
InfoFileRepo repo = new InfoFileRepo();
repo.setProperties(MAP.$("location", tmp.getAbsolutePath()).$("index", "" + info));
Collection<File> files = IO.tree(IO.getFile("testdata/ws/cnf/jar"), "*.jar");
for (File f : files) {
repo.put(new FileInputStream(f), null);
}
return repo;
}
}