View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * @deprecated As of 3.2.2, and there is no direct replacement. This is an internal class which was not marked as such,
48   *             but should have been.
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         Logic for transitive global exclusions
129 
130         List<String> exclusions = new ArrayList<String>();
131 
132         for ( Dependency d : project.getDependencies() )
133         {
134             if ( d.getExclusions() != null )
135             {
136                 for ( Exclusion e : d.getExclusions() )
137                 {
138                     exclusions.add(  e.getGroupId() + ":" + e.getArtifactId() );
139                 }
140             }
141         }
142 
143         ArtifactFilter scopeFilter = new ScopeArtifactFilter( scope );
144 
145         ArtifactFilter filter;
146 
147         if ( ! exclusions.isEmpty() )
148         {
149             filter = new AndArtifactFilter( Arrays.asList( new ArtifactFilter[]{
150                 new ExcludesArtifactFilter( exclusions ), scopeFilter } ) );
151         }
152         else
153         {
154             filter = scopeFilter;
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 }