1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23 import javax.inject.Singleton;
24
25 import java.util.Collection;
26 import java.util.Collections;
27 import java.util.HashSet;
28 import java.util.Iterator;
29 import java.util.LinkedHashSet;
30 import java.util.Set;
31
32 import org.apache.maven.artifact.Artifact;
33 import org.apache.maven.artifact.ArtifactUtils;
34 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
35 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
36 import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
37 import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
38 import org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException;
39 import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
40 import org.apache.maven.artifact.resolver.filter.CumulativeScopeArtifactFilter;
41 import org.apache.maven.execution.MavenSession;
42 import org.apache.maven.project.MavenProject;
43 import org.apache.maven.project.artifact.ProjectArtifact;
44 import org.apache.maven.repository.RepositorySystem;
45
46
47
48
49
50
51 @Deprecated
52 @Singleton
53 @Named
54 public class DefaultProjectDependenciesResolver implements ProjectDependenciesResolver {
55
56 @Inject
57 private RepositorySystem repositorySystem;
58
59 @Inject
60 private ResolutionErrorHandler resolutionErrorHandler;
61
62 public Set<Artifact> resolve(MavenProject project, Collection<String> scopesToResolve, MavenSession session)
63 throws ArtifactResolutionException, ArtifactNotFoundException {
64 return resolve(Collections.singleton(project), scopesToResolve, session);
65 }
66
67 public Set<Artifact> resolve(
68 MavenProject project,
69 Collection<String> scopesToCollect,
70 Collection<String> scopesToResolve,
71 MavenSession session)
72 throws ArtifactResolutionException, ArtifactNotFoundException {
73 Set<MavenProject> mavenProjects = Collections.singleton(project);
74 return resolveImpl(
75 mavenProjects, scopesToCollect, scopesToResolve, session, getIgnorableArtifacts(mavenProjects));
76 }
77
78 public Set<Artifact> resolve(
79 Collection<? extends MavenProject> projects, Collection<String> scopesToResolve, MavenSession session)
80 throws ArtifactResolutionException, ArtifactNotFoundException {
81 return resolveImpl(projects, null, scopesToResolve, session, getIgnorableArtifacts(projects));
82 }
83
84 public Set<Artifact> resolve(
85 MavenProject project,
86 Collection<String> scopesToCollect,
87 Collection<String> scopesToResolve,
88 MavenSession session,
89 Set<Artifact> ignoreableArtifacts)
90 throws ArtifactResolutionException, ArtifactNotFoundException {
91 return resolveImpl(
92 Collections.singleton(project),
93 scopesToCollect,
94 scopesToResolve,
95 session,
96 getIgnorableArtifacts(ignoreableArtifacts));
97 }
98
99 private Set<Artifact> resolveImpl(
100 Collection<? extends MavenProject> projects,
101 Collection<String> scopesToCollect,
102 Collection<String> scopesToResolve,
103 MavenSession session,
104 Set<String> projectIds)
105 throws ArtifactResolutionException, ArtifactNotFoundException {
106 Set<Artifact> resolved = new LinkedHashSet<>();
107
108 if (projects == null || projects.isEmpty()) {
109 return resolved;
110 }
111
112 if ((scopesToCollect == null || scopesToCollect.isEmpty())
113 && (scopesToResolve == null || scopesToResolve.isEmpty())) {
114 return resolved;
115 }
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 CumulativeScopeArtifactFilter resolutionScopeFilter = new CumulativeScopeArtifactFilter(scopesToResolve);
150
151 CumulativeScopeArtifactFilter collectionScopeFilter = new CumulativeScopeArtifactFilter(scopesToCollect);
152 collectionScopeFilter = new CumulativeScopeArtifactFilter(collectionScopeFilter, resolutionScopeFilter);
153
154 ArtifactResolutionRequest request = new ArtifactResolutionRequest()
155 .setResolveRoot(false)
156 .setResolveTransitively(true)
157 .setCollectionFilter(collectionScopeFilter)
158 .setResolutionFilter(resolutionScopeFilter)
159 .setLocalRepository(session.getLocalRepository())
160 .setOffline(session.isOffline())
161 .setForceUpdate(session.getRequest().isUpdateSnapshots());
162 request.setServers(session.getRequest().getServers());
163 request.setMirrors(session.getRequest().getMirrors());
164 request.setProxies(session.getRequest().getProxies());
165
166 for (MavenProject project : projects) {
167 request.setArtifact(new ProjectArtifact(project));
168 request.setArtifactDependencies(project.getDependencyArtifacts());
169 request.setManagedVersionMap(project.getManagedVersionMap());
170 request.setRemoteRepositories(project.getRemoteArtifactRepositories());
171
172 ArtifactResolutionResult result = repositorySystem.resolve(request);
173
174 try {
175 resolutionErrorHandler.throwErrors(request, result);
176 } catch (MultipleArtifactsNotFoundException e) {
177
178 Collection<Artifact> missing = new HashSet<>(e.getMissingArtifacts());
179
180 for (Iterator<Artifact> it = missing.iterator(); it.hasNext(); ) {
181 String key = ArtifactUtils.key(it.next());
182 if (projectIds.contains(key)) {
183 it.remove();
184 }
185 }
186
187 if (!missing.isEmpty()) {
188 throw e;
189 }
190 }
191
192 resolved.addAll(result.getArtifacts());
193 }
194
195 return resolved;
196 }
197
198 private Set<String> getIgnorableArtifacts(Collection<? extends MavenProject> projects) {
199 Set<String> projectIds = new HashSet<>(projects.size() * 2);
200
201 for (MavenProject p : projects) {
202 String key = ArtifactUtils.key(p.getGroupId(), p.getArtifactId(), p.getVersion());
203 projectIds.add(key);
204 }
205 return projectIds;
206 }
207
208 private Set<String> getIgnorableArtifacts(Iterable<Artifact> artifactIterable) {
209 Set<String> projectIds = new HashSet<>();
210
211 for (Artifact artifact : artifactIterable) {
212 String key = ArtifactUtils.key(artifact);
213 projectIds.add(key);
214 }
215 return projectIds;
216 }
217 }