package aQute.bnd.repository.maven.pom.provider;
import java.io.File;
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import org.osgi.framework.namespace.IdentityNamespace;
import org.osgi.resource.Capability;
import org.osgi.resource.Resource;
import org.osgi.service.repository.RequirementBuilder;
import org.osgi.util.promise.Promise;
import aQute.bnd.build.Workspace;
import aQute.bnd.http.HttpClient;
import aQute.bnd.osgi.Processor;
import aQute.bnd.osgi.repository.XMLResourceParser;
import aQute.bnd.version.Version;
import aQute.lib.io.IO;
import aQute.lib.strings.Strings;
import aQute.libg.reporter.slf4j.Slf4jReporter;
import aQute.maven.api.Archive;
import aQute.maven.api.Revision;
import aQute.maven.provider.MavenBackingRepository;
import aQute.maven.provider.MavenRepository;
import aQute.service.reporter.Reporter;
import junit.framework.TestCase;
public class PomRepositoryTest extends TestCase {
static final String MAVEN_REPO_LOCAL = System.getProperty("maven.repo.local", "~/.m2/repository");
Reporter reporter = new Slf4jReporter(PomRepositoryTest.class);
File tmp = IO.getFile("generated/tmp");
File localRepo = IO.getFile(MAVEN_REPO_LOCAL);
File location = IO.getFile(tmp, "index.xml");
HttpClient client;
protected void setUp() {
IO.delete(tmp);
tmp.mkdirs();
client = new HttpClient();
}
protected void tearDown() {
client.close();
}
/**
* this test fails on Travis
*
* <pre>
* aQute.bnd.repository.maven.pom.provider.PomRepositoryTest > testPom FAILED
junit.framework.AssertionFailedError: expected:<8> but was:<3>
at junit.framework.Assert.fail(Assert.java:57)
at junit.framework.Assert.failNotEquals(Assert.java:329)
at junit.framework.Assert.assertEquals(Assert.java:78)
at junit.framework.Assert.assertEquals(Assert.java:234)
at junit.framework.Assert.assertEquals(Assert.java:241)
at junit.framework.TestCase.assertEquals(TestCase.java:409)
at aQute.bnd.repository.maven.pom.provider.PomRepositoryTest.testPom(PomRepositoryTest.java:46)
* </pre>
*
* @throws Exception
*/
public void testPom() throws Exception {
// for (int i = 0; i < 100; i++) {
// MavenRepository mr = getRepo();
//
// Revision revision = Program.valueOf("org.apache.aries.blueprint",
// "org.apache.aries.blueprint.cm")
// .version("1.0.8");
//
// Traverser t = new Traverser(mr, revision, Processor.getExecutor());
// Map<Archive,Resource> value = t.getResources().getValue();
// assertEquals(8, value.size());
// assertAllBndCap(value);
// }
}
public void testDependenciesWithVersionRanges() throws Exception {
BndPomRepository bpr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
bpr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("revision", "com.mchange:mchange-commons-java:0.2.10");
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("name", "test");
bpr.setProperties(config);
List<String> list = bpr.list(null);
for (String bsn : list) {
SortedSet<Version> versions = bpr.versions(bsn);
assertEquals(1, versions.size());
Version v = versions.first();
switch (bsn) {
case "log4j:log4j" :
assertEquals("1.2.14", v.toString());
break;
case "com.typesafe.config" :
assertEquals("1.2.1", v.toString());
break;
case "com.mchange:mchange-commons-java" :
assertEquals("0.2.10", v.toString());
break;
case "slf4j.api" :
assertEquals("1.7.5", v.toString());
break;
default :
fail(bsn);
}
}
assertNotNull(list);
assertEquals(4, list.size());
}
public void testBndPomRepoFile() throws Exception {
BndPomRepository bpr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
bpr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("pom", "testdata/pomrepo/simple.xml");
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("name", "test");
bpr.setProperties(config);
List<String> list = bpr.list(null);
assertNotNull(list);
assertEquals(1, list.size());
}
public void testBndPomRepoFileExistingParent() throws Exception {
BndPomRepository bpr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
bpr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("pom", "testdata/pomrepo/existing-parent.xml");
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("name", "test");
bpr.setProperties(config);
List<String> list = bpr.list(null);
assertNotNull(list);
assertEquals(1, list.size());
}
public void testBndPomRepoFileMissingParent() throws Exception {
BndPomRepository bpr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
bpr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("pom", "testdata/pomrepo/missing-parent.xml");
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("name", "test");
bpr.setProperties(config);
try {
bpr.list(null);
fail("Should throw IllegalArgumentException on missing parent pom.");
} catch (Exception iae) {
// This exception is expected!
}
}
public void testEntityPom() throws Exception {
BndPomRepository bpr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
bpr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("pom", "testdata/pomrepo/entity.xml");
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("name", "test");
bpr.setProperties(config);
List<String> list = bpr.list(null);
assertNotNull(list);
assertEquals(1, list.size());
}
public void testBndPomRepoFileNoDeps() throws Exception {
BndPomRepository bpr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
bpr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("pom", "testdata/pomrepo/simple-nodeps.xml");
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("name", "test");
bpr.setProperties(config);
List<String> list = bpr.list(null);
assertNotNull(list);
assertEquals(0, list.size());
}
public void testBndPomRepoURI() throws Exception {
final BndPomRepository bpr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
bpr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("pom",
"https://repo1.maven.org/maven2/org/apache/felix/org.apache.felix.gogo.shell/0.12.0/org.apache.felix.gogo.shell-0.12.0.pom");
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("name", "test");
bpr.setProperties(config);
List<String> list = bpr.list(null);
assertNotNull(list);
assertEquals(1, list.size());
RequirementBuilder builder = bpr.newRequirementBuilder("osgi.identity");
builder.addDirective("filter", "(osgi.identity=org.apache.felix.gogo.runtime)");
Promise<Collection<Resource>> providers = bpr.findProviders(builder.buildExpression());
Collection<Resource> resources = providers.getValue();
assertFalse(resources.isEmpty());
assertEquals(1, resources.size());
}
public void testBndPomRepoRefresh() throws Exception {
BndPomRepository bpr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
bpr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("pom", "testdata/pomrepo/simple.xml");
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("name", "test");
bpr.setProperties(config);
List<String> list = bpr.list(null);
assertNotNull(list);
assertEquals(1, list.size());
try {
bpr.refresh();
} catch (Throwable t) {
fail();
}
}
public void testRepository() throws Exception {
MavenRepository repo = getRepo();
Revision revision = Revision.valueOf("bcel:bcel:5.1");
PomRepository pom = new PomRepository(repo, client, location).revisions(Collections.singleton(revision));
assertTrue(location.isFile());
try (XMLResourceParser xp = new XMLResourceParser(location);) {
List<Resource> parse = xp.parse();
assertEquals(parse.size(), pom.getResources().size());
}
}
public void testSearchRepoSimple() throws Exception {
BndPomRepository mcsr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
mcsr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("query", "q=g:biz.aQute.bnd+a:biz.aQute.bnd+AND+v:3.2.0");
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("name", "test");
mcsr.setProperties(config);
List<String> list = mcsr.list(null);
assertNotNull(list);
assertEquals(1, list.size());
}
public void testSearchRepoNoUrls() throws Exception {
BndPomRepository mcsr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
mcsr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("query", "q=g:biz.aQute.bnd+a:biz.aQute.bnd+AND+v:3.2.0");
config.put("name", "test");
mcsr.setProperties(config);
List<String> list = mcsr.list(null);
assertNotNull(list);
assertEquals(1, list.size());
}
public void testSearchRepoMultipleConfigurationsDontBreak() throws Exception {
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
BndPomRepository mcsrBnd320 = new BndPomRepository();
mcsrBnd320.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("query", "q=g:biz.aQute.bnd+a:biz.aQute.bnd+AND+v:3.2.0");
config.put("name", "bnd320");
mcsrBnd320.setProperties(config);
BndPomRepository mcsrBnd330 = new BndPomRepository();
mcsrBnd330.setRegistry(w);
config = new HashMap<>();
config.put("query", "q=g:biz.aQute.bnd+a:biz.aQute.bnd+AND+v:3.3.0");
config.put("name", "bnd330");
mcsrBnd330.setProperties(config);
List<String> list320 = mcsrBnd320.list(null);
assertNotNull(list320);
assertEquals(1, list320.size());
List<String> list330 = mcsrBnd330.list(null);
assertNotNull(list330);
assertEquals(1, list330.size());
// check the first repo to make sure it's there.
RequirementBuilder builder = mcsrBnd320.newRequirementBuilder("osgi.identity");
builder.addDirective("filter", "(&(osgi.identity=biz.aQute.bnd)(version>=3.2.0)(!(version>=3.3.0)))");
Promise<Collection<Resource>> providers = mcsrBnd320.findProviders(builder.buildExpression());
Collection<Resource> resources = providers.getValue();
assertFalse(resources.isEmpty());
assertEquals(1, resources.size());
// make sure it's not in the second repo, otherwise the caches are
// messed up.
providers = mcsrBnd330.findProviders(builder.buildExpression());
resources = providers.getValue();
assertTrue(resources.isEmpty());
assertEquals(0, resources.size());
}
/**
* This test occasionally fails on Travis.
*
* <pre>
aQute.bnd.repository.maven.pom.provider.PomRepositoryTest > testSearchRepoAllVersions FAILED
junit.framework.AssertionFailedError: expected:<1> but was:<2>
at junit.framework.Assert.fail(Assert.java:57)
at junit.framework.Assert.failNotEquals(Assert.java:329)
at junit.framework.Assert.assertEquals(Assert.java:78)
at junit.framework.Assert.assertEquals(Assert.java:234)
at junit.framework.Assert.assertEquals(Assert.java:241)
at junit.framework.TestCase.assertEquals(TestCase.java:409)
at aQute.bnd.repository.maven.pom.provider.PomRepositoryTest.testSearchRepoAllVersions(PomRepositoryTest.java:220)
* </pre>
*/
public void testSearchRepoAllVersions() throws Exception {
// BndPomRepository mcsr = new BndPomRepository();
// Workspace w = Workspace.createStandaloneWorkspace(new Processor(),
// tmp.toURI());
// w.setBase(tmp);
// mcsr.setRegistry(w);
//
// Map<String,String> config = new HashMap<>();
// config.put("query",
// "q=g:biz.aQute.bnd+AND+a:biz.aQute.bnd&core=gav&rows=100");
// config.put("name", "test");
// mcsr.setProperties(config);
//
// List<String> list = mcsr.list(null);
// assertNotNull(list);
// // All the results are represented by a single bsn
// assertEquals(1, list.size());
// SortedSet<Version> versions = mcsr.versions("biz.aQute.bnd");
// assertTrue(versions.size() >= 4);
}
public void testSearchRepoFailNoQuery() throws Exception {
BndPomRepository mcsr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
mcsr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("name", "test");
try {
mcsr.setProperties(config);
fail();
} catch (Exception e) {
assertEquals("Neither pom, revision nor query property are set", e.getMessage());
}
}
public void testSearchRepoFailNoName() throws Exception {
BndPomRepository mcsr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
mcsr.setRegistry(w);
Map<String,String> config = new HashMap<>();
config.put("query", "q=g:biz.aQute.bnd+a:biz.aQute.bnd+AND+v:3.2.0");
try {
mcsr.setProperties(config);
fail();
} catch (Exception e) {
assertEquals("Must get a name", e.getMessage());
}
}
public void testNonStandardClassifierDependencies() throws Exception {
BndPomRepository mcsr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
mcsr.setRegistry(w);
File local = new File(tmp, "m2-repository");
local.mkdirs();
Map<String,String> config = new HashMap<>();
config.put("name", "pmd");
config.put("revision", "net.sourceforge.pmd:pmd-java:5.2.3");
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("local", local.getAbsolutePath());
mcsr.setProperties(config);
List<String> list = mcsr.list(null);
assertNotNull(list);
URL url = new URL(tmp.toURI().toURL(),
"m2-repository/net/sourceforge/saxon/saxon/9.1.0.8/saxon-9.1.0.8-dom.jar");
File dom = new File(url.getFile());
assertTrue(dom.exists());
// I'm assuming because we don't have a way of currently "getting" such
// a classified artifact from the repo that we'd have to encode the
// classifier in the bsn of the classified jar if it's not a bundle.
// Something like:
// File file = mcsr.get("net.sourceforge.pmd:pmd-java:dom", new
// Version("5.2.3"), null);
// assertNotNull(file);
}
public void testMultipleRevisions() throws Exception {
BndPomRepository mcsr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
mcsr.setRegistry(w);
File local = new File(tmp, "m2-repository");
local.mkdirs();
Map<String,String> config = new HashMap<>();
config.put("name", "test-dependencies");
String revisions = Strings.join(new String[] {
"biz.aQute.bnd:biz.aQute.junit:3.3.0", "biz.aQute.bnd:biz.aQute.launcher:3.3.0",
"biz.aQute.bnd:biz.aQute.remote.launcher:3.3.0", "biz.aQute.bnd:biz.aQute.tester:3.3.0"
});
config.put("revision", revisions);
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("local", local.getAbsolutePath());
mcsr.setProperties(config);
List<String> list = mcsr.list(null);
assertNotNull(list);
assertEquals(4, list.size());
RequirementBuilder builder = mcsr.newRequirementBuilder("osgi.identity");
builder.addAttribute("filter", "(osgi.identity=biz.aQute.tester)");
Promise<Collection<Resource>> providers = mcsr.findProviders(builder.buildExpression());
Collection<Resource> resources = providers.getValue();
assertFalse(resources.isEmpty());
}
public void testMultiplePomFiles() throws Exception {
BndPomRepository mcsr = new BndPomRepository();
Workspace w = Workspace.createStandaloneWorkspace(new Processor(), tmp.toURI());
w.setBase(tmp);
mcsr.setRegistry(w);
File local = new File(tmp, "m2-repository");
local.mkdirs();
Map<String,String> config = new HashMap<>();
config.put("name", "test-dependencies");
String pomFiles = Strings.join(new String[] {
"testdata/pomrepo/simple.xml",
"https://repo1.maven.org/maven2/org/apache/felix/org.apache.felix.gogo.shell/0.12.0/org.apache.felix.gogo.shell-0.12.0.pom"
});
config.put("pom", pomFiles);
config.put("snapshotUrls", "https://repo1.maven.org/maven2/");
config.put("releaseUrls", "https://repo1.maven.org/maven2/");
config.put("local", local.getAbsolutePath());
mcsr.setProperties(config);
List<String> list = mcsr.list(null);
assertNotNull(list);
assertEquals(2, list.size());
RequirementBuilder builder = mcsr.newRequirementBuilder("osgi.identity");
builder.addAttribute("filter", "(osgi.identity=org.apache.felix.gogo.shell)");
Promise<Collection<Resource>> providers = mcsr.findProviders(builder.buildExpression());
Collection<Resource> resources = providers.getValue();
assertFalse(resources.isEmpty());
builder = mcsr.newRequirementBuilder("osgi.identity");
builder.addAttribute("filter", "(osgi.identity=osgi.core)");
providers = mcsr.findProviders(builder.buildExpression());
resources = providers.getValue();
assertFalse(resources.isEmpty());
}
MavenRepository getRepo() throws Exception {
List<MavenBackingRepository> central = MavenBackingRepository.create("https://repo1.maven.org/maven2/",
reporter, localRepo, client);
List<MavenBackingRepository> apache = MavenBackingRepository
.create("https://repository.apache.org/content/groups/snapshots/", reporter, localRepo, client);
MavenRepository mr = new MavenRepository(localRepo, "test", central, apache, Processor.getExecutor(), reporter,
null);
return mr;
}
void assertAllBndCap(Map<Archive,Resource> value) {
for (Resource resource : value.values()) {
List<Capability> capabilities = resource.getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE);
assertNotNull(capabilities);
assertEquals(1, capabilities.size());
capabilities = resource.getCapabilities("bnd.info");
Capability c = capabilities.get(0);
String a = (String) c.getAttributes().get("name");
Archive archive = Archive.valueOf(a);
assertNotNull(archive);
}
}
}