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 @Named
52 @Singleton
53 @Deprecated
54 public class DefaultProjectDependenciesResolver implements ProjectDependenciesResolver {
55
56 private final RepositorySystem repositorySystem;
57
58 private final ResolutionErrorHandler resolutionErrorHandler;
59
60 @Inject
61 public DefaultProjectDependenciesResolver(
62 RepositorySystem repositorySystem, ResolutionErrorHandler resolutionErrorHandler) {
63 this.repositorySystem = repositorySystem;
64 this.resolutionErrorHandler = resolutionErrorHandler;
65 }
66
67 @Override
68 public Set<Artifact> resolve(MavenProject project, Collection<String> scopesToResolve, MavenSession session)
69 throws ArtifactResolutionException, ArtifactNotFoundException {
70 return resolve(Collections.singleton(project), scopesToResolve, session);
71 }
72
73 @Override
74 public Set<Artifact> resolve(
75 MavenProject project,
76 Collection<String> scopesToCollect,
77 Collection<String> scopesToResolve,
78 MavenSession session)
79 throws ArtifactResolutionException, ArtifactNotFoundException {
80 Set<MavenProject> mavenProjects = Collections.singleton(project);
81 return resolveImpl(
82 mavenProjects, scopesToCollect, scopesToResolve, session, getIgnorableArtifacts(mavenProjects));
83 }
84
85 @Override
86 public Set<Artifact> resolve(
87 Collection<? extends MavenProject> projects, Collection<String> scopesToResolve, MavenSession session)
88 throws ArtifactResolutionException, ArtifactNotFoundException {
89 return resolveImpl(projects, null, scopesToResolve, session, getIgnorableArtifacts(projects));
90 }
91
92 @Override
93 public Set<Artifact> resolve(
94 MavenProject project,
95 Collection<String> scopesToCollect,
96 Collection<String> scopesToResolve,
97 MavenSession session,
98 Set<Artifact> ignorableArtifacts)
99 throws ArtifactResolutionException, ArtifactNotFoundException {
100 return resolveImpl(
101 Collections.singleton(project),
102 scopesToCollect,
103 scopesToResolve,
104 session,
105 getIgnorableArtifacts(ignorableArtifacts));
106 }
107
108 private Set<Artifact> resolveImpl(
109 Collection<? extends MavenProject> projects,
110 Collection<String> scopesToCollect,
111 Collection<String> scopesToResolve,
112 MavenSession session,
113 Set<String> projectIds)
114 throws ArtifactResolutionException, ArtifactNotFoundException {
115 Set<Artifact> resolved = new LinkedHashSet<>();
116
117 if (projects == null || projects.isEmpty()) {
118 return resolved;
119 }
120
121 if ((scopesToCollect == null || scopesToCollect.isEmpty())
122 && (scopesToResolve == null || scopesToResolve.isEmpty())) {
123 return resolved;
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
150
151
152
153
154
155
156
157
158 CumulativeScopeArtifactFilter resolutionScopeFilter = new CumulativeScopeArtifactFilter(scopesToResolve);
159
160 CumulativeScopeArtifactFilter collectionScopeFilter = new CumulativeScopeArtifactFilter(scopesToCollect);
161 collectionScopeFilter = new CumulativeScopeArtifactFilter(collectionScopeFilter, resolutionScopeFilter);
162
163 ArtifactResolutionRequest request = new ArtifactResolutionRequest()
164 .setResolveRoot(false)
165 .setResolveTransitively(true)
166 .setCollectionFilter(collectionScopeFilter)
167 .setResolutionFilter(resolutionScopeFilter)
168 .setLocalRepository(session.getLocalRepository())
169 .setOffline(session.isOffline())
170 .setForceUpdate(session.getRequest().isUpdateSnapshots());
171 request.setServers(session.getRequest().getServers());
172 request.setMirrors(session.getRequest().getMirrors());
173 request.setProxies(session.getRequest().getProxies());
174
175 for (MavenProject project : projects) {
176 request.setArtifact(new ProjectArtifact(project));
177 request.setArtifactDependencies(project.getDependencyArtifacts());
178 request.setManagedVersionMap(project.getManagedVersionMap());
179 request.setRemoteRepositories(project.getRemoteArtifactRepositories());
180
181 ArtifactResolutionResult result = repositorySystem.resolve(request);
182
183 try {
184 resolutionErrorHandler.throwErrors(request, result);
185 } catch (MultipleArtifactsNotFoundException e) {
186
187 Collection<Artifact> missing = new HashSet<>(e.getMissingArtifacts());
188
189 for (Iterator<Artifact> it = missing.iterator(); it.hasNext(); ) {
190 String key = ArtifactUtils.key(it.next());
191 if (projectIds.contains(key)) {
192 it.remove();
193 }
194 }
195
196 if (!missing.isEmpty()) {
197 throw e;
198 }
199 }
200
201 resolved.addAll(result.getArtifacts());
202 }
203
204 return resolved;
205 }
206
207 private Set<String> getIgnorableArtifacts(Collection<? extends MavenProject> projects) {
208 Set<String> projectIds = new HashSet<>(projects.size() * 2);
209
210 for (MavenProject p : projects) {
211 String key = ArtifactUtils.key(p.getGroupId(), p.getArtifactId(), p.getVersion());
212 projectIds.add(key);
213 }
214 return projectIds;
215 }
216
217 private Set<String> getIgnorableArtifacts(Iterable<Artifact> artifactIterable) {
218 Set<String> projectIds = new HashSet<>();
219
220 for (Artifact artifact : artifactIterable) {
221 String key = ArtifactUtils.key(artifact);
222 projectIds.add(key);
223 }
224 return projectIds;
225 }
226 }