1 package org.apache.maven.shared.transfer.dependencies.resolve.internal;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Iterator;
25 import java.util.List;
26
27 import org.apache.maven.RepositoryUtils;
28 import org.apache.maven.artifact.handler.ArtifactHandler;
29 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
30 import org.apache.maven.model.DependencyManagement;
31 import org.apache.maven.model.Model;
32 import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
33 import org.apache.maven.shared.artifact.filter.resolve.transform.SonatypeAetherFilterTransformer;
34 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
35 import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
36
37 import org.sonatype.aether.RepositorySystem;
38 import org.sonatype.aether.RepositorySystemSession;
39 import org.sonatype.aether.artifact.Artifact;
40 import org.sonatype.aether.artifact.ArtifactType;
41 import org.sonatype.aether.artifact.ArtifactTypeRegistry;
42 import org.sonatype.aether.collection.CollectRequest;
43 import org.sonatype.aether.collection.DependencyCollectionException;
44 import org.sonatype.aether.graph.Dependency;
45 import org.sonatype.aether.graph.DependencyFilter;
46 import org.sonatype.aether.repository.RemoteRepository;
47 import org.sonatype.aether.resolution.ArtifactResolutionException;
48 import org.sonatype.aether.resolution.ArtifactResult;
49 import org.sonatype.aether.util.artifact.DefaultArtifact;
50 import org.sonatype.aether.util.artifact.DefaultArtifactType;
51
52
53
54
55 class Maven30DependencyResolver
56 implements MavenDependencyResolver
57 {
58 private final RepositorySystem repositorySystem;
59
60 private final ArtifactHandlerManager artifactHandlerManager;
61
62 private final RepositorySystemSession session;
63
64 private final List<RemoteRepository> aetherRepositories;
65
66 Maven30DependencyResolver( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
67 RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
68 {
69 super();
70 this.repositorySystem = repositorySystem;
71 this.artifactHandlerManager = artifactHandlerManager;
72 this.session = session;
73 this.aetherRepositories = aetherRepositories;
74 }
75
76 @Override
77
78 public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( DependableCoordinate coordinate,
79 TransformableFilter dependencyFilter )
80
81 throws DependencyResolverException
82 {
83 ArtifactTypeRegistry typeRegistry =
84 (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
85 ArtifactHandlerManager.class, artifactHandlerManager );
86
87 Dependency aetherRoot = toDependency( coordinate, typeRegistry );
88
89 CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
90
91 return resolveDependencies( aetherRepositories, dependencyFilter, request );
92 }
93
94 @Override
95
96 public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Model model,
97 TransformableFilter dependencyFilter )
98
99 throws DependencyResolverException
100 {
101
102 ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( model.getPackaging() );
103
104 String extension = artifactHandler != null ? artifactHandler.getExtension() : null;
105
106 Artifact aetherArtifact =
107 new DefaultArtifact( model.getGroupId(), model.getArtifactId(), extension, model.getVersion() );
108
109 Dependency aetherRoot = new Dependency( aetherArtifact, null );
110
111 CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
112
113 ArtifactTypeRegistry typeRegistry =
114 (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
115 ArtifactHandlerManager.class, artifactHandlerManager );
116
117 List<Dependency> aetherDependencies = new ArrayList<Dependency>( model.getDependencies().size() );
118 for ( org.apache.maven.model.Dependency mavenDependency : model.getDependencies() )
119 {
120 aetherDependencies.add( toDependency( mavenDependency, typeRegistry ) );
121 }
122 request.setDependencies( aetherDependencies );
123
124 DependencyManagement mavenDependencyManagement = model.getDependencyManagement();
125 if ( mavenDependencyManagement != null )
126 {
127 List<Dependency> aetherManagerDependencies =
128 new ArrayList<Dependency>( mavenDependencyManagement.getDependencies().size() );
129
130 for ( org.apache.maven.model.Dependency mavenDependency : mavenDependencyManagement.getDependencies() )
131 {
132 aetherManagerDependencies.add( toDependency( mavenDependency, typeRegistry ) );
133 }
134
135 request.setManagedDependencies( aetherManagerDependencies );
136 }
137
138 return resolveDependencies( aetherRepositories, dependencyFilter, request );
139 }
140
141 @Override
142
143 public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Collection<org.apache.maven.model.Dependency> mavenDependencies,
144 Collection<org.apache.maven.model.Dependency> managedMavenDependencies,
145 TransformableFilter filter )
146
147 throws DependencyResolverException
148 {
149 ArtifactTypeRegistry typeRegistry =
150 (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
151 ArtifactHandlerManager.class, artifactHandlerManager );
152
153 final Class<?>[] argClasses =
154 new Class<?>[] { org.apache.maven.model.Dependency.class, ArtifactTypeRegistry.class };
155
156 List<Dependency> aetherDependencies = new ArrayList<Dependency>( mavenDependencies.size() );
157
158 if ( mavenDependencies != null )
159 {
160 aetherDependencies = new ArrayList<Dependency>( mavenDependencies.size() );
161
162 for ( org.apache.maven.model.Dependency mavenDependency : mavenDependencies )
163 {
164 Object[] args = new Object[] { mavenDependency, typeRegistry };
165
166 Dependency aetherDependency =
167 (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
168
169 aetherDependencies.add( aetherDependency );
170 }
171 }
172
173 List<Dependency> aetherManagedDependencies = null;
174
175 if ( managedMavenDependencies != null )
176 {
177 aetherManagedDependencies = new ArrayList<Dependency>( managedMavenDependencies.size() );
178
179 for ( org.apache.maven.model.Dependency mavenDependency : managedMavenDependencies )
180 {
181 Object[] args = new Object[] { mavenDependency, typeRegistry };
182
183 Dependency aetherDependency =
184 (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
185
186 aetherManagedDependencies.add( aetherDependency );
187 }
188 }
189
190 CollectRequest request =
191 new CollectRequest( aetherDependencies, aetherManagedDependencies, aetherRepositories );
192
193 return resolveDependencies( aetherRepositories, filter, request );
194 }
195
196
197 private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( List<RemoteRepository> aetherRepositories,
198 TransformableFilter dependencyFilter,
199 CollectRequest request )
200 throws DependencyResolverException
201
202 {
203 try
204 {
205 DependencyFilter depFilter = null;
206 if ( dependencyFilter != null )
207 {
208 depFilter = dependencyFilter.transform( new SonatypeAetherFilterTransformer() );
209 }
210
211 final List<ArtifactResult> dependencyResults =
212 repositorySystem.resolveDependencies( session, request, depFilter );
213
214
215 return new Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult>()
216 {
217 @Override
218 public Iterator<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> iterator()
219 {
220
221 Collection<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> artResults =
222 new ArrayList<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult>( dependencyResults.size() );
223
224
225 for ( ArtifactResult artifactResult : dependencyResults )
226 {
227 artResults.add( new Maven30ArtifactResult( artifactResult ) );
228 }
229
230 return artResults.iterator();
231 }
232 };
233 }
234 catch ( ArtifactResolutionException e )
235 {
236 throw new Maven30DependencyResolverException( e );
237 }
238 catch ( DependencyCollectionException e )
239 {
240 throw new Maven30DependencyResolverException( e );
241 }
242 }
243
244
245
246
247
248
249
250
251 private static Dependency toDependency( DependableCoordinate coordinate, ArtifactTypeRegistry stereotypes )
252 {
253 ArtifactType stereotype = stereotypes.get( coordinate.getType() );
254 if ( stereotype == null )
255 {
256 stereotype = new DefaultArtifactType( coordinate.getType() );
257 }
258
259 Artifact artifact =
260 new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(), null,
261 coordinate.getVersion(), null, stereotype );
262
263 return new Dependency( artifact, null );
264 }
265
266 private static Dependency toDependency( org.apache.maven.model.Dependency mavenDependency,
267 ArtifactTypeRegistry typeRegistry )
268 throws DependencyResolverException
269 {
270 Class<?>[] argClasses = new Class<?>[] { org.apache.maven.model.Dependency.class, ArtifactTypeRegistry.class };
271
272 Object[] args = new Object[] { mavenDependency, typeRegistry };
273
274 return (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
275 }
276 }