]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java
3ef373ffa05ffc8fcce96f2574e19b5d55903a12
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.maven / src / main / java / org / argeo / slc / maven / MavenManager.java
1 package org.argeo.slc.maven;
2
3 import java.io.File;
4 import java.util.List;
5 import java.util.Set;
6 import java.util.Vector;
7
8 import org.apache.commons.logging.Log;
9 import org.apache.commons.logging.LogFactory;
10 import org.apache.maven.artifact.Artifact;
11 import org.apache.maven.artifact.factory.ArtifactFactory;
12 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
13 import org.apache.maven.artifact.repository.ArtifactRepository;
14 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
15 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
16 import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
17 import org.apache.maven.artifact.resolver.ArtifactResolver;
18 import org.apache.maven.embedder.MavenEmbedderException;
19 import org.apache.maven.project.MavenProject;
20 import org.apache.maven.project.artifact.InvalidDependencyVersionException;
21 import org.argeo.slc.SlcException;
22 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
23 import org.codehaus.plexus.embed.Embedder;
24
25 public class MavenManager {
26
27 private final Log log = LogFactory.getLog(getClass());
28
29 private String localRepositoryPath = System.getProperty("user.home")
30 + File.separator + ".m2" + File.separator + "repository";
31
32 private ArtifactRepository localRepository;
33 private List<ArtifactRepository> remoteRepositoriesInternal;
34 private List<RemoteRepository> remoteRepositories = new Vector<RemoteRepository>();
35
36 private SlcMavenEmbedder mavenEmbedder;
37 private ClassLoader classLoader;
38 private Boolean offline = false;
39
40 public void init() {
41 try {
42 mavenEmbedder = new SlcMavenEmbedder();
43 mavenEmbedder.setOffline(offline);
44 //mavenEmbedder.setAlignWithUserInstallation(true);
45 if (classLoader != null)
46 mavenEmbedder.setClassLoader(classLoader);
47 else
48 mavenEmbedder.setClassLoader(getClass().getClassLoader());
49 // else
50 // mavenEmbedder.setClassLoader(Thread.currentThread()
51 // .getContextClassLoader());
52 mavenEmbedder.start();
53
54 mavenEmbedder.setLocalRepositoryDirectory(new File(
55 localRepositoryPath));
56
57 localRepository = mavenEmbedder.getLocalRepository();
58
59 remoteRepositoriesInternal = new Vector<ArtifactRepository>();
60 for (RemoteRepository remoteRepository : remoteRepositories) {
61
62 ArtifactRepository repository = mavenEmbedder.createRepository(
63 remoteRepository.getUrl(), remoteRepository.getId());
64 remoteRepositoriesInternal.add(repository);
65 }
66
67 MavenFile mavenFile = new MavenFile();
68 mavenFile.setGroupId("org.argeo.slc.dist");
69 mavenFile.setArtifactId("org.argeo.slc.sdk");
70 mavenFile.setVersion("0.12.2-SNAPSHOT");
71 mavenFile.setType("pom");
72 Artifact artifact = resolve(mavenFile);
73 log.debug("Location of " + artifact + " : " + artifact.getFile());
74 // log.debug("Dependencies of " + artifact);
75 // for (Object obj : artifact.getDependencyTrail()) {
76 // log.debug(" " + obj);
77 // }
78
79 MavenProject project = mavenEmbedder
80 .readProjectWithDependencies(new File(
81 "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk/pom.xml"));
82 // MavenProject project = mavenEmbedder
83 // .readProjectWithDependencies(artifact.getFile());
84
85 log.debug("Dependencies of " + artifact);
86 for (Object obj : getTransitiveProjectDependencies(project,
87 remoteRepositoriesInternal, localRepository)) {
88 log.debug(" " + obj);
89 }
90
91 } catch (Exception e) {
92 throw new SlcException("Cannot initialize Maven manager", e);
93 }
94 }
95
96 public Set getTransitiveProjectDependencies(MavenProject project,
97 List remoteRepos, ArtifactRepository local) {
98 Embedder embedder = mavenEmbedder.getEmbedder();
99 try {
100 ArtifactFactory artifactFactory = (ArtifactFactory) embedder
101 .lookup(ArtifactFactory.ROLE);
102
103 ArtifactResolver artifactResolver = (ArtifactResolver) embedder
104 .lookup(ArtifactResolver.ROLE);
105
106 ArtifactMetadataSource artifactMetadataSource = (ArtifactMetadataSource) embedder
107 .lookup(ArtifactMetadataSource.ROLE);
108
109 Set artifacts = project
110 .createArtifacts(artifactFactory, null, null);
111
112 ArtifactResolutionResult arr = artifactResolver
113 .resolveTransitively(artifacts, project.getArtifact(),
114 local, remoteRepos, artifactMetadataSource, null);
115
116 return arr.getArtifacts();
117 } catch (Exception e) {
118 throw new SlcException("Cannot resolve dependency for " + project,
119 e);
120 }
121 // Order, just for display
122 // Set dependencies = new TreeSet(new ArtifactComparator());
123 // dependencies.addAll(arr.getArtifacts());
124 // return dependencies;
125 }
126
127 private Artifact resolve(MavenFile mavenDistribution) {
128 try {
129 Artifact artifact;
130 if (mavenDistribution.getClassifier() == null) {
131 artifact = mavenEmbedder.createArtifact(mavenDistribution
132 .getGroupId(), mavenDistribution.getArtifactId(),
133 mavenDistribution.getVersion(),
134 Artifact.SCOPE_PROVIDED, mavenDistribution.getType());
135 } else {
136 artifact = mavenEmbedder.createArtifactWithClassifier(
137 mavenDistribution.getGroupId(), mavenDistribution
138 .getArtifactId(), mavenDistribution
139 .getVersion(), mavenDistribution.getType(),
140 mavenDistribution.getClassifier());
141 }
142
143 mavenEmbedder.resolve(artifact, remoteRepositoriesInternal,
144 localRepository);
145
146 return artifact;
147 } catch (Exception e) {
148 throw new SlcException("Cannot resolve artifact.", e);
149 }
150 }
151
152 public File getPackageLocation(MavenFile mavenDistribution) {
153 return resolve(mavenDistribution).getFile();
154 }
155
156 public void destroy() {
157 try {
158 if (mavenEmbedder != null) {
159 mavenEmbedder.stop();
160 }
161 } catch (MavenEmbedderException e) {
162 log.error("Cannot destroy Maven manager", e);
163 }
164 }
165
166 public void setLocalRepositoryPath(String localRepositoryPath) {
167 this.localRepositoryPath = localRepositoryPath;
168 }
169
170 public List<RemoteRepository> getRemoteRepositories() {
171 return remoteRepositories;
172 }
173
174 public void setRemoteRepositories(List<RemoteRepository> remoteRepositories) {
175 this.remoteRepositories = remoteRepositories;
176 }
177
178 public void setClassLoader(ClassLoader classLoader) {
179 this.classLoader = classLoader;
180 }
181
182 public void setOffline(Boolean offline) {
183 this.offline = offline;
184 }
185
186 }