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