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.List;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.Iterator;
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.EclipseAetherFilterTransformer;
34 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
35 import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
36 import org.eclipse.aether.RepositorySystem;
37 import org.eclipse.aether.RepositorySystemSession;
38 import org.eclipse.aether.artifact.Artifact;
39 import org.eclipse.aether.artifact.ArtifactType;
40 import org.eclipse.aether.artifact.ArtifactTypeRegistry;
41 import org.eclipse.aether.artifact.DefaultArtifact;
42 import org.eclipse.aether.artifact.DefaultArtifactType;
43 import org.eclipse.aether.collection.CollectRequest;
44 import org.eclipse.aether.graph.Dependency;
45 import org.eclipse.aether.graph.DependencyFilter;
46 import org.eclipse.aether.repository.RemoteRepository;
47 import org.eclipse.aether.resolution.ArtifactResult;
48 import org.eclipse.aether.resolution.DependencyRequest;
49 import org.eclipse.aether.resolution.DependencyResolutionException;
50 import org.eclipse.aether.resolution.DependencyResult;
51
52
53
54
55 class Maven31DependencyResolver
56 implements MavenDependencyResolver
57 {
58 private RepositorySystem repositorySystem;
59
60 private ArtifactHandlerManager artifactHandlerManager;
61
62 private final RepositorySystemSession session;
63
64 private final List<RemoteRepository> aetherRepositories;
65
66 Maven31DependencyResolver( 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 throws DependencyResolverException
81
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 throws DependencyResolverException
147
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> aetherDeps = null;
157
158 if ( mavenDependencies != null )
159 {
160 aetherDeps = 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 aetherDeps.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 = new CollectRequest( aetherDeps, aetherManagedDependencies, aetherRepositories );
191
192 return resolveDependencies( aetherRepositories, filter, request );
193 }
194
195
196 private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( List<RemoteRepository> aetherRepositories,
197 TransformableFilter dependencyFilter,
198 CollectRequest request )
199 throws DependencyResolverException
200
201 {
202 try
203 {
204 DependencyFilter depFilter = null;
205 if ( dependencyFilter != null )
206 {
207 depFilter = dependencyFilter.transform( new EclipseAetherFilterTransformer() );
208 }
209
210 DependencyRequest depRequest = new DependencyRequest( request, depFilter );
211
212 final DependencyResult dependencyResults = repositorySystem.resolveDependencies( session, depRequest );
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.getArtifactResults().size() );
223
224
225 for ( ArtifactResult artifactResult : dependencyResults.getArtifactResults() )
226 {
227 artResults.add( new Maven31ArtifactResult( artifactResult ) );
228 }
229
230 return artResults.iterator();
231 }
232 };
233 }
234 catch ( DependencyResolutionException e )
235 {
236 throw new Maven31DependencyResolverException( e );
237 }
238 }
239
240
241
242
243
244
245
246
247 private static Dependency toDependency( DependableCoordinate coordinate, ArtifactTypeRegistry stereotypes )
248 {
249 ArtifactType stereotype = stereotypes.get( coordinate.getType() );
250 if ( stereotype == null )
251 {
252 stereotype = new DefaultArtifactType( coordinate.getType() );
253 }
254
255 Artifact artifact =
256 new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(), null,
257 coordinate.getVersion(), null, stereotype );
258
259 return new Dependency( artifact, null );
260 }
261
262 private static Dependency toDependency( org.apache.maven.model.Dependency root, ArtifactTypeRegistry typeRegistry )
263 throws DependencyResolverException
264 {
265 Class<?>[] argClasses = new Class<?>[] { org.apache.maven.model.Dependency.class, ArtifactTypeRegistry.class };
266
267 Object[] args = new Object[] { root, typeRegistry };
268
269 return (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
270 }
271 }