1 package org.apache.maven;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.Collection;
23 import java.util.Collections;
24 import java.util.HashSet;
25 import java.util.Iterator;
26 import java.util.LinkedHashSet;
27 import java.util.Set;
28
29 import org.apache.maven.artifact.Artifact;
30 import org.apache.maven.artifact.ArtifactUtils;
31 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
32 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
33 import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
34 import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
35 import org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException;
36 import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
37 import org.apache.maven.artifact.resolver.filter.CumulativeScopeArtifactFilter;
38 import org.apache.maven.execution.MavenSession;
39 import org.apache.maven.project.MavenProject;
40 import org.apache.maven.project.artifact.ProjectArtifact;
41 import org.apache.maven.repository.RepositorySystem;
42 import org.codehaus.plexus.component.annotations.Component;
43 import org.codehaus.plexus.component.annotations.Requirement;
44
45 @Component(role = ProjectDependenciesResolver.class)
46 public class DefaultProjectDependenciesResolver
47 implements ProjectDependenciesResolver
48 {
49
50 @Requirement
51 private RepositorySystem repositorySystem;
52
53 @Requirement
54 private ResolutionErrorHandler resolutionErrorHandler;
55
56 public Set<Artifact> resolve( MavenProject project, Collection<String> scopesToResolve, MavenSession session )
57 throws ArtifactResolutionException, ArtifactNotFoundException
58 {
59 return resolve( Collections.singleton( project ), scopesToResolve, session );
60 }
61
62 public Set<Artifact> resolve( MavenProject project, Collection<String> scopesToCollect,
63 Collection<String> scopesToResolve, MavenSession session )
64 throws ArtifactResolutionException, ArtifactNotFoundException
65 {
66 Set<MavenProject> mavenProjects = Collections.singleton( project );
67 return resolveImpl( mavenProjects, scopesToCollect, scopesToResolve, session,
68 getIgnorableArtifacts( mavenProjects ) );
69 }
70
71 public Set<Artifact> resolve( Collection<? extends MavenProject> projects, Collection<String> scopesToResolve,
72 MavenSession session )
73 throws ArtifactResolutionException, ArtifactNotFoundException
74 {
75 return resolveImpl( projects, null, scopesToResolve, session, getIgnorableArtifacts( projects ) );
76 }
77
78 public Set<Artifact> resolve( MavenProject project, Collection<String> scopesToCollect,
79 Collection<String> scopesToResolve, MavenSession session,
80 Set<Artifact> ignoreableArtifacts )
81 throws ArtifactResolutionException, ArtifactNotFoundException
82 {
83 return resolveImpl( Collections.singleton( project ), scopesToCollect, scopesToResolve, session,
84 getIgnorableArtifacts( ignoreableArtifacts ) );
85 }
86
87
88 private Set<Artifact> resolveImpl( Collection<? extends MavenProject> projects, Collection<String> scopesToCollect,
89 Collection<String> scopesToResolve, MavenSession session,
90 Set<String> projectIds )
91 throws ArtifactResolutionException, ArtifactNotFoundException
92 {
93 Set<Artifact> resolved = new LinkedHashSet<Artifact>();
94
95 if ( projects == null || projects.isEmpty() )
96 {
97 return resolved;
98 }
99
100 if ( ( scopesToCollect == null || scopesToCollect.isEmpty() ) &&
101 ( scopesToResolve == null || scopesToResolve.isEmpty() ) )
102 {
103 return resolved;
104 }
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137 CumulativeScopeArtifactFilter resolutionScopeFilter = new CumulativeScopeArtifactFilter( scopesToResolve );
138
139 CumulativeScopeArtifactFilter collectionScopeFilter = new CumulativeScopeArtifactFilter( scopesToCollect );
140 collectionScopeFilter = new CumulativeScopeArtifactFilter( collectionScopeFilter, resolutionScopeFilter );
141
142 ArtifactResolutionRequest request =
143 new ArtifactResolutionRequest().setResolveRoot( false ).setResolveTransitively( true ).setCollectionFilter(
144 collectionScopeFilter ).setResolutionFilter( resolutionScopeFilter ).setLocalRepository(
145 session.getLocalRepository() ).setOffline( session.isOffline() ).setForceUpdate(
146 session.getRequest().isUpdateSnapshots() );
147 request.setServers( session.getRequest().getServers() );
148 request.setMirrors( session.getRequest().getMirrors() );
149 request.setProxies( session.getRequest().getProxies() );
150
151 for ( MavenProject project : projects )
152 {
153 request.setArtifact( new ProjectArtifact( project ) );
154 request.setArtifactDependencies( project.getDependencyArtifacts() );
155 request.setManagedVersionMap( project.getManagedVersionMap() );
156 request.setRemoteRepositories( project.getRemoteArtifactRepositories() );
157
158 ArtifactResolutionResult result = repositorySystem.resolve( request );
159
160 try
161 {
162 resolutionErrorHandler.throwErrors( request, result );
163 }
164 catch ( MultipleArtifactsNotFoundException e )
165 {
166
167 Collection<Artifact> missing = new HashSet<Artifact>( e.getMissingArtifacts() );
168
169 for ( Iterator<Artifact> it = missing.iterator(); it.hasNext(); )
170 {
171 String key = ArtifactUtils.key( it.next() );
172 if ( projectIds.contains( key ) )
173 {
174 it.remove();
175 }
176 }
177
178 if ( !missing.isEmpty() )
179 {
180 throw e;
181 }
182 }
183
184 resolved.addAll( result.getArtifacts() );
185 }
186
187 return resolved;
188 }
189
190
191 private Set<String> getIgnorableArtifacts( Collection<? extends MavenProject> projects )
192 {
193 Set<String> projectIds = new HashSet<String>( projects.size() * 2 );
194
195 for ( MavenProject p : projects )
196 {
197 String key = ArtifactUtils.key( p.getGroupId(), p.getArtifactId(), p.getVersion() );
198 projectIds.add( key );
199 }
200 return projectIds;
201 }
202
203 private Set<String> getIgnorableArtifacts( Iterable<Artifact> artifactIterable )
204 {
205 Set<String> projectIds = new HashSet<String>();
206
207 for ( Artifact artifact : artifactIterable )
208 {
209 String key = ArtifactUtils.key( artifact );
210 projectIds.add( key );
211 }
212 return projectIds;
213 }
214
215 }