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 }