X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.support.maven%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fmaven%2FMavenManager.java;h=1a2ab09c912737979270849e527e8f8fa98215b1;hb=31858bf96e11953b30711376be853d47e8f8e081;hp=8aea79af3a48f59b846d2cc2e6efddab90985c95;hpb=370e17b89b62de8a5af827a209a9aaf07e2f0842;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java b/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java index 8aea79af3..1a2ab09c9 100644 --- a/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java +++ b/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java @@ -2,18 +2,24 @@ package org.argeo.slc.maven; import java.io.File; import java.util.List; +import java.util.Set; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.factory.ArtifactFactory; +import org.apache.maven.artifact.metadata.ArtifactMetadataSource; import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.embedder.MavenEmbedder; -import org.apache.maven.embedder.MavenEmbedderException; - +import org.apache.maven.artifact.resolver.ArtifactResolutionResult; +import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.project.MavenProject; import org.argeo.slc.SlcException; +import org.argeo.slc.maven.embedder.MavenEmbedderException; +import org.codehaus.plexus.embed.Embedder; public class MavenManager { + private final Log log = LogFactory.getLog(getClass()); private String localRepositoryPath = System.getProperty("user.home") @@ -23,14 +29,22 @@ public class MavenManager { private List remoteRepositoriesInternal; private List remoteRepositories = new Vector(); - private MavenEmbedder mavenEmbedder; + private SlcMavenEmbedder mavenEmbedder; + private ClassLoader classLoader; + private Boolean offline = false; public void init() { try { - mavenEmbedder = new MavenEmbedder(); - mavenEmbedder.setOffline(true); - mavenEmbedder.setClassLoader(Thread.currentThread() - .getContextClassLoader()); + mavenEmbedder = new SlcMavenEmbedder(); + mavenEmbedder.setOffline(offline); + // mavenEmbedder.setAlignWithUserInstallation(true); + if (classLoader != null) + mavenEmbedder.setClassLoader(classLoader); + else + mavenEmbedder.setClassLoader(getClass().getClassLoader()); + // else + // mavenEmbedder.setClassLoader(Thread.currentThread() + // .getContextClassLoader()); mavenEmbedder.start(); mavenEmbedder.setLocalRepositoryDirectory(new File( @@ -45,15 +59,54 @@ public class MavenManager { remoteRepository.getUrl(), remoteRepository.getId()); remoteRepositoriesInternal.add(repository); } - + MavenFile mavenFile = new MavenFile(); - mavenFile.setGroupId("org.argeo.slc.runtime"); - mavenFile.setArtifactId("org.argeo.slc.specs"); - mavenFile.setVersion("0.11.3-SNAPSHOT"); + mavenFile.setGroupId("org.argeo.slc.dist"); + mavenFile.setArtifactId("org.argeo.slc.sdk"); + mavenFile.setVersion("0.12.2-SNAPSHOT"); + mavenFile.setType("pom"); Artifact artifact = resolve(mavenFile); - log.debug("Dependencies of "+artifact); - for(Object obj : artifact.getDependencyTrail()){ - log.debug(" "+obj); + log.debug("Location of " + artifact + " : " + artifact.getFile()); + // log.debug("Dependencies of " + artifact); + // for (Object obj : artifact.getDependencyTrail()) { + // log.debug(" " + obj); + // } + + File pomFile = new File( + "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk/pom.xml"); + MavenProject project = mavenEmbedder + .readProjectWithDependencies(pomFile); + // MavenProject project = mavenEmbedder + // .readProjectWithDependencies(artifact.getFile()); + + // EventMonitor eventMonitor = new EventMonitor() { + // + // public void startEvent(String eventName, String target, + // long timestamp) { + // log.debug(eventName + ", " + target + ", " + timestamp); + // } + // + // public void errorEvent(String eventName, String target, + // long timestamp, Throwable cause) { + // log.debug(eventName + ", " + target + ", " + timestamp); + // } + // + // public void endEvent(String eventName, String target, + // long timestamp) { + // log.debug(eventName + ", " + target + ", " + timestamp); + // } + // }; + // + // String[] goals = { "clean", "install" }; + // mavenEmbedder.execute(project, Arrays.asList(goals), + // eventMonitor, + // null, null, pomFile.getParentFile()); + + Set transitDeps = getTransitiveProjectDependencies( + project, remoteRepositoriesInternal, localRepository); + log.debug(transitDeps.size() + " dependencies for " + artifact); + for (Object obj : transitDeps) { + log.debug(" " + obj); } } catch (Exception e) { @@ -61,6 +114,38 @@ public class MavenManager { } } + @SuppressWarnings("unchecked") + public Set getTransitiveProjectDependencies(MavenProject project, + List remoteRepos, ArtifactRepository local) { + Embedder embedder = mavenEmbedder.getEmbedder(); + try { + ArtifactFactory artifactFactory = (ArtifactFactory) embedder + .lookup(ArtifactFactory.ROLE); + + ArtifactResolver artifactResolver = (ArtifactResolver) embedder + .lookup(ArtifactResolver.ROLE); + + ArtifactMetadataSource artifactMetadataSource = (ArtifactMetadataSource) embedder + .lookup(ArtifactMetadataSource.ROLE); + + Set artifacts = project.createArtifacts(artifactFactory, + null, null); + + ArtifactResolutionResult arr = artifactResolver + .resolveTransitively(artifacts, project.getArtifact(), + local, remoteRepos, artifactMetadataSource, null); + + return arr.getArtifacts(); + } catch (Exception e) { + throw new SlcException("Cannot resolve dependency for " + project, + e); + } + // Order, just for display + // Set dependencies = new TreeSet(new ArtifactComparator()); + // dependencies.addAll(arr.getArtifacts()); + // return dependencies; + } + private Artifact resolve(MavenFile mavenDistribution) { try { Artifact artifact; @@ -112,4 +197,12 @@ public class MavenManager { this.remoteRepositories = remoteRepositories; } + public void setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + public void setOffline(Boolean offline) { + this.offline = offline; + } + }