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  @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         Logic for transitive global exclusions
120 
121         List<String> exclusions = new ArrayList<String>();
122 
123         for ( Dependency d : project.getDependencies() )
124         {
125             if ( d.getExclusions() != null )
126             {
127                 for ( Exclusion e : d.getExclusions() )
128                 {
129                     exclusions.add(  e.getGroupId() + ":" + e.getArtifactId() );
130                 }
131             }
132         }
133 
134         ArtifactFilter scopeFilter = new ScopeArtifactFilter( scope );
135 
136         ArtifactFilter filter;
137 
138         if ( ! exclusions.isEmpty() )
139         {
140             filter = new AndArtifactFilter( Arrays.asList( new ArtifactFilter[]{
141                 new ExcludesArtifactFilter( exclusions ), scopeFilter } ) );
142         }
143         else
144         {
145             filter = scopeFilter;
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 }