package test; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.xml.sax.SAXException; import aQute.bnd.build.Project; import aQute.bnd.build.Workspace; import aQute.bnd.header.Parameters; import aQute.bnd.maven.PomParser; import aQute.bnd.maven.support.CachedPom; import aQute.bnd.maven.support.Maven; import aQute.bnd.maven.support.MavenEntry; import aQute.bnd.maven.support.MavenRemoteRepository; import aQute.bnd.maven.support.Pom; import aQute.bnd.maven.support.Pom.Dependency; import aQute.bnd.maven.support.Pom.Scope; import aQute.bnd.maven.support.ProjectPom; import aQute.bnd.osgi.Builder; import aQute.bnd.osgi.Constants; import aQute.bnd.osgi.Jar; import aQute.bnd.osgi.Processor; import aQute.bnd.osgi.Resource; import aQute.bnd.service.Strategy; import aQute.lib.io.IO; import aQute.libg.map.MAP; import junit.framework.TestCase; @SuppressWarnings("resource") public class MavenTest extends TestCase { Processor processor = new Processor(); final static File cwd = new File("").getAbsoluteFile(); static ExecutorService executor = Executors.newCachedThreadPool(); Maven maven = new Maven(executor); /** * A test against maven 2 * * @throws Exception * @throws URISyntaxException */ public void testRemote() throws URISyntaxException, Exception { URI repo = new URI("http://repo1.maven.org/maven2"); MavenEntry entry = maven.getEntry("org.springframework", "spring-aspects", "3.0.5.RELEASE"); entry.remove(); CachedPom pom = maven.getPom("org.springframework", "spring-aspects", "3.0.5.RELEASE", repo); Set<Pom> dependencies = pom.getDependencies(Scope.compile, repo); for (Pom dep : dependencies) { System.err.printf("%20s %-20s %10s%n", dep.getGroupId(), dep.getArtifactId(), dep.getVersion()); } } /** * Check if we get the correct bundles for a project * * @throws Exception */ public void testProjectBundles() throws Exception { // Project project = getProject("maven1"); // // Collection<Container> containers = project.getBuildpath(); // List<String> files = new ArrayList<String>(); // for ( Container c : containers ) { // files.add( c.getFile().getName()); // } // assertTrue(files.remove("bin")); // System.err.println(files); // assertTrue( // files.contains("com.springsource.org.apache.commons.beanutils-1.6.1.jar")); } /** * @throws Exception */ protected static Project getProject(String name) throws Exception { File wsf = IO.getFile(cwd, "testresources/ws"); Workspace ws = Workspace.getWorkspace(wsf); assertNotNull(ws); Project project = ws.getProject(name); assertNotNull(project); return project; } /** * See if we can create a maven repostory as a plugin * * @throws Exception */ public static void testMavenRepo() throws Exception { Workspace ws = Workspace.getWorkspace(cwd.getParentFile()); Maven maven = ws.getMaven(); Processor processor = new Processor(ws); processor.setProperty(Constants.PLUGIN, "aQute.bnd.maven.support.MavenRemoteRepository;repositories=testresources/ws/maven1/m2"); MavenRemoteRepository mr = processor.getPlugin(MavenRemoteRepository.class); assertNotNull(mr); assertEquals(maven, mr.getMaven()); // Cleanup the maven cache so we do not get random results MavenEntry me = maven.getEntry("org.apache.commons", "com.springsource.org.apache.commons.beanutils", "1.6.1"); assertNotNull(me); me.remove(); Map<String,String> map = MAP.$("groupId", "org.apache.commons"); File file = mr.get("com.springsource.org.apache.commons.beanutils", "1.6.1", Strategy.LOWEST, map); assertNotNull(file); assertEquals("com.springsource.org.apache.commons.beanutils-1.6.1.jar", file.getName()); assertTrue(file.isFile()); Map<String,String> map2 = MAP.$("groupId", "org.apache.commons").$("scope", "compile"); file = mr.get("com.springsource.org.apache.commons.beanutils", "1.6.1", Strategy.LOWEST, map2); assertNotNull(file); assertTrue(file.isFile()); assertEquals("compile.lib", file.getName()); String lib = IO.collect(file); System.err.println(lib); lib = lib.replaceAll("org.apache.commons\\+com.springsource.org.apache.commons.beanutils;version=\"1.6.1\"", "1"); lib = lib.replaceAll("org.apache.commons\\+com.springsource.org.apache.commons.collections;version=\"2.1.1\"", "2"); lib = lib.replaceAll("org.apache.commons\\+com.springsource.org.apache.commons.logging;version=\"1.0.4\"", "3"); assertEquals("1\n2\n3\n", lib); } /** * Test parsing a project pom * * @throws Exception */ public static void testProjectPom() throws Exception { Maven maven = new Maven(null); ProjectPom pom = maven.createProjectModel(IO.getFile(cwd, "testresources/ws/maven1/testpom.xml")); assertEquals("artifact", pom.getArtifactId()); assertEquals("group-parent", pom.getGroupId()); assertEquals("1.0.0", pom.getVersion()); assertEquals("Artifact", pom.getName()); assertEquals("Parent Description\n\nDescription artifact", pom.getDescription()); List<Dependency> dependencies = pom.getDependencies(); boolean dep1 = false; // dep1 boolean dep2 = false; // artifact (after macro) boolean dep3 = false; // junit boolean dep4 = false; // easymock for (Dependency dep : dependencies) { String artifactId = dep.getArtifactId(); if ("dep1".equals(artifactId)) { assertFalse(dep1); dep1 = true; assertEquals("xyz", dep.getGroupId()); assertEquals("1.0.1", dep.getVersion()); assertEquals(Pom.Scope.valueOf("compile"), dep.getScope()); } else if ("artifact".equals(artifactId)) { assertFalse(dep2); dep2 = true; assertEquals("group-parent", dep.getGroupId()); assertEquals("1.0.2", dep.getVersion()); assertEquals(Pom.Scope.valueOf("compile"), dep.getScope()); } else if ("junit".equals(artifactId)) { assertFalse(dep3); dep3 = true; assertEquals("junit", dep.getGroupId()); assertEquals("4.0", dep.getVersion()); assertEquals(Pom.Scope.valueOf("test"), dep.getScope()); } else if ("easymock".equals(artifactId)) { assertFalse(dep4); dep4 = true; assertEquals("org.easymock", dep.getGroupId()); assertEquals("2.4", dep.getVersion()); assertEquals(Pom.Scope.valueOf("compile"), dep.getScope()); } else fail("'" + artifactId + "'"); } assertTrue(dep1 && dep2 && dep3 && dep4); assertEquals("aa", pom.getProperty("a")); assertEquals("b from parent", pom.getProperty("b")); assertEquals("aab from parentartifact", pom.getProperty("c")); } /** * Test the maven remote repository */ public static void testMavenRepo1() throws Exception { Maven maven = new Maven(null); MavenRemoteRepository mr = new MavenRemoteRepository(); mr.setMaven(maven); MavenEntry me = maven.getEntry("org.apache.commons", "com.springsource.org.apache.commons.beanutils", "1.6.1"); me.remove(); me = maven.getEntry("org.apache.commons", "com.springsource.org.apache.commons.collections", "2.1.1"); me.remove(); me = maven.getEntry("org.apache.commons", "com.springsource.org.apache.commons.logging", "1.0.4"); me.remove(); mr.setRepositories(new URI[] { IO.getFile(new File("").getAbsoluteFile(), "testresources/ws/maven1/m2").toURI() }); Map<String,String> map = new HashMap<String,String>(); map.put("scope", "compile"); File file = mr.get("org.apache.commons+com.springsource.org.apache.commons.beanutils", "1.6.1", Strategy.LOWEST, map); assertNotNull(file); assertTrue(file.isFile()); assertEquals( "org.apache.commons+com.springsource.org.apache.commons.beanutils;version=\"1.6.1\"\n" + "org.apache.commons+com.springsource.org.apache.commons.collections;version=\"2.1.1\"\n" + "org.apache.commons+com.springsource.org.apache.commons.logging;version=\"1.0.4\"\n", IO.collect(file)); file = mr.get("org.apache.commons+com.springsource.org.apache.commons.beanutils", "1.6.1", Strategy.LOWEST, null); assertEquals("com.springsource.org.apache.commons.beanutils-1.6.1.jar", file.getName()); } public static void testMavenx() throws Exception { Maven maven = new Maven(null); CachedPom pom = maven.getPom("javax.xml.bind", "com.springsource.javax.xml.bind", "2.2.0", new URI("http://repository.springsource.com/maven/bundles/release"), new URI("http://repository.springsource.com/maven/bundles/external")); // Pom pom = maven.getPom("javax.xml.ws", // "com.springsource.javax.xml.ws", "2.1.1", new // URL("http://repository.springsource.com/maven/bundles/release"), new // URL("http://repository.springsource.com/maven/bundles/external")); System.err.println(pom.getGroupId() + " + " + pom.getArtifactId() + "-" + pom.getVersion()); System.err.println(pom.getDependencies(Pom.Scope.compile)); File artifact = pom.getArtifact(); System.err.println(artifact); } /** * Test the pom parser which will turn the pom into a set of properties, * which will make it actually readable according to some. * * @throws Exception */ @SuppressWarnings("restriction") public static void testPomParser() throws Exception { PomParser parser = new PomParser(); Properties p = parser.getProperties(IO.getFile("testresources/ws/maven1/pom.xml")); p.store(System.err, "testing"); assertEquals("Apache Felix Metatype Service", p.get("pom.name")); assertEquals("org.apache.felix", p.get("pom.groupId")); // is from // parent assertEquals("org.apache.felix.metatype", p.get("pom.artifactId")); assertEquals("bundle", p.get("pom.packaging")); Parameters map = parser.parseHeader(p.getProperty("pom.scope.test")); Map<String,String> junit = map.get("junit.junit"); assertNotNull(junit); assertEquals("4.0", junit.get("version")); Map<String,String> easymock = map.get("org.easymock.easymock"); assertNotNull(easymock); assertEquals("2.4", easymock.get("version")); } // public void testDependencies() throws Exception { // MavenDependencyGraph graph; // // graph = new MavenDependencyGraph(); // File home = new File( System.getProperty("user.home")); // File m2 = new File( home, ".m2"); // File m2Repo = new File( m2, "repository"); // if ( m2Repo.isDirectory()) // graph.addRepository( m2Repo.toURI().toURL()); // // graph.addRepository( new URL("http://repo1.maven.org/maven2/")); // graph.addRepository( new // URL("http://repository.springsource.com/maven/bundles/external")); // // graph.root.add( // IO.getFile("testresources/poms/pom-1.xml").toURI().toURL()); // // } // public void testMaven() throws Exception { // MavenRepository maven = new MavenRepository(); // maven.setReporter(processor); // maven.setProperties(new HashMap<String, String>()); // maven.setRoot(processor.getFile("testresources/maven-repo")); // // File files[] = maven.get("activation.activation", null); // assertNotNull(files); // assertEquals("activation-1.0.2.jar", files[0].getName()); // // files = maven.get("biz.aQute.bndlib", null); // assertNotNull(files); // assertEquals(5, files.length); // assertEquals("bndlib-0.0.145.jar", files[0].getName()); // assertEquals("bndlib-0.0.255.jar", files[4].getName()); // // List<String> names = maven.list(null); // System.err.println(names); // assertEquals(13, names.size()); // assertTrue(names.contains("biz.aQute.bndlib")); // assertTrue(names.contains("org.apache.felix.javax.servlet")); // assertTrue(names.contains("org.apache.felix.org.osgi.core")); // // List<Version> versions = // maven.versions("org.apache.felix.javax.servlet"); // assertEquals(1, versions.size()); // versions.contains(new Version("1.0.0")); // // versions = maven.versions("biz.aQute.bndlib"); // assertEquals(5, versions.size()); // versions.contains(new Version("0.0.148")); // versions.contains(new Version("0.0.255")); // } // public void testMavenBsnMapping() throws Exception { // Processor processor = new Processor(); // processor // .setProperty("-plugin", // "aQute.bnd.maven.MavenGroup; groupId=org.apache.felix, // aQute.bnd.maven.MavenRepository"); // MavenRepository maven = new MavenRepository(); // maven.setReporter(processor); // Map<String, String> map = new HashMap<String, String>(); // map.put("root", // IO.getFile(cwd,"testresources/maven-repo").getAbsolutePath()); // maven.setProperties(map); // // File files[] = maven.get("org.apache.felix.framework", null); // assertNotNull(files); // ; // assertEquals(1, files.length); // } public void testPomResource() throws Exception { testPom("pom.xml", "true", "com.example.foo", "1.2.3.qualifier", "com.example", "foo", "1.2.3.qualifier", "url=http://github.com/bndtools,connection=scm:git:https://github.com/bndtools/bnd,developerConnection=scm:git:git@github.com/bndtools/bnd", "Peter.Kriens@aQute.biz;name=\"Peter Kriens\";organization=aQute;roles=\"programmer,gopher\"", null); testPom("pom.xml", "true", "com.example.foo", "1.2.3.qualifier", "com.example", "foo", "1.2.3.qualifier", null, null, null); testPom("pom.xml", "true", "uvw.xyz", "1.2.3", "uvw", "xyz", "1.2.3", null, null, null); testPom("META-INF/maven/abc.def.ghi/jkl/pom.xml", "groupid=abc.def.ghi,artifactid=jkl", "uvw.xyz", "1.2.3", "abc.def.ghi", "jkl", "1.2.3", null, null, "<<EXTERNAL>>"); testPom("META-INF/maven/abc.def.ghi/uvw.xyz/pom.xml", "groupid=abc.def.ghi", "uvw.xyz", "1.2.3", "abc.def.ghi", "uvw.xyz", "1.2.3", null, null, "http://www.apache.org/licenses/LICENSE-2.0"); testPom("META-INF/maven/abc.def.ghi/uvw.xyz/pom.xml", "groupid=abc.def.ghi,version=2.6.8", "uvw.xyz", "1.2.3", "abc.def.ghi", "uvw.xyz", "2.6.8", null, null, "http://www.apache.org/licenses/LICENSE-2.0;description=\"Apache License, Version 2.0\""); testPom("META-INF/maven/pom.xml", "groupid=abc.def.ghi,version=2.6.8,where=META-INF/maven/pom.xml", "uvw.xyz", "1.2.3", "abc.def.ghi", "uvw.xyz", "2.6.8", null, null, "Apache-2.0;description=\"Apache License, Version 2.0\";link=\"http://www.apache.org/licenses/LICENSE-2.0\""); } void testPom(String where, String pom, String bsn, String version, String groupId, String artifactId, String mversion, String scm, String developers, String license) throws IOException, SAXException, ParserConfigurationException, Exception { Builder b = new Builder(); b.setProperty("-pom", pom); b.setBundleSymbolicName(bsn); b.setBundleVersion(version); b.setProperty("-resourceonly", "true"); if (developers != null) b.setProperty(Constants.BUNDLE_DEVELOPERS, developers); if (scm != null) b.setProperty(Constants.BUNDLE_SCM, scm); if (license != null) b.setProperty(Constants.BUNDLE_LICENSE, license); Jar jar = b.build(); assertTrue(b.check()); Resource r = jar.getResource(where); IO.copy(r.openInputStream(), System.out); Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(r.openInputStream()); XPath xpath = XPathFactory.newInstance().newXPath(); assertEquals(groupId, xpath.evaluate("/project/groupId", d)); assertEquals(artifactId, xpath.evaluate("/project/artifactId", d)); assertEquals(mversion, xpath.evaluate("/project/version", d)); assertEquals((developers == null) ? "0" : "1", xpath.evaluate("count(/project/developers)", d)); assertEquals((scm == null) ? "0" : "1", xpath.evaluate("count(/project/scm)", d)); assertEquals(((license == null) || license.trim().equals("<<EXTERNAL>>")) ? "0" : "1", xpath.evaluate("count(/project/licenses)", d)); } }