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.Collections;
25  import java.util.Iterator;
26  import java.util.List;
27  
28  import org.apache.maven.RepositoryUtils;
29  import org.apache.maven.artifact.handler.ArtifactHandler;
30  import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
31  import org.apache.maven.model.DependencyManagement;
32  import org.apache.maven.model.Model;
33  import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
34  import org.apache.maven.shared.artifact.filter.resolve.transform.SonatypeAetherFilterTransformer;
35  import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
36  import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
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 implements MavenDependencyResolver
56  {
57      private static final Class<?>[] ARG_CLASSES = new Class<?>[] {org.apache.maven.model.Dependency.class,
58              ArtifactTypeRegistry.class};
59      private final RepositorySystem repositorySystem;
60      private final ArtifactHandlerManager artifactHandlerManager;
61      private final RepositorySystemSession session;
62      private final List<RemoteRepository> aetherRepositories;
63  
64      Maven30DependencyResolver( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
65              RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
66      {
67          super();
68          this.repositorySystem = repositorySystem;
69          this.artifactHandlerManager = artifactHandlerManager;
70          this.session = session;
71          this.aetherRepositories = aetherRepositories;
72      }
73  
74      
75  
76  
77  
78  
79  
80  
81      private static Dependency toDependency( DependableCoordinate coordinate, ArtifactTypeRegistry stereotypes )
82      {
83          ArtifactType stereotype = stereotypes.get( coordinate.getType() );
84          if ( stereotype == null )
85          {
86              stereotype = new DefaultArtifactType( coordinate.getType() );
87          }
88  
89          Artifact artifact = new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(),
90                  coordinate.getClassifier(), null, coordinate.getVersion(), null, stereotype );
91  
92          return new Dependency( artifact, null );
93      }
94  
95      private static Dependency toDependency( org.apache.maven.model.Dependency mavenDependency,
96              ArtifactTypeRegistry typeRegistry ) throws DependencyResolverException
97      {
98          Object[] args = new Object[] {mavenDependency, typeRegistry};
99  
100         return Invoker.invoke( RepositoryUtils.class, "toDependency", ARG_CLASSES, args );
101     }
102 
103     @Override
104     
105     public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies(
106             DependableCoordinate coordinate, TransformableFilter dependencyFilter )
107         
108             throws DependencyResolverException
109     {
110         ArtifactTypeRegistry typeRegistry = createTypeRegistry();
111 
112         Dependency aetherRoot = toDependency( coordinate, typeRegistry );
113 
114         CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
115 
116         return resolveDependencies( dependencyFilter, request );
117     }
118 
119     private ArtifactTypeRegistry createTypeRegistry() throws DependencyResolverException
120     {
121         return Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry", ArtifactHandlerManager.class,
122                 artifactHandlerManager );
123     }
124 
125     @Override
126     
127     public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Model model,
128             TransformableFilter dependencyFilter )
129         
130             throws DependencyResolverException
131     {
132         
133         ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( model.getPackaging() );
134 
135         String extension = artifactHandler != null ? artifactHandler.getExtension() : null;
136 
137         Artifact aetherArtifact = new DefaultArtifact( model.getGroupId(), model.getArtifactId(), extension,
138                 model.getVersion() );
139 
140         Dependency aetherRoot = new Dependency( aetherArtifact, null );
141 
142         CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
143 
144         request.setDependencies( resolveDependencies( model.getDependencies() ) );
145 
146         DependencyManagement mavenDependencyManagement = model.getDependencyManagement();
147         if ( mavenDependencyManagement != null )
148         {
149             request.setManagedDependencies( resolveDependencies( mavenDependencyManagement.getDependencies() ) );
150         }
151 
152         return resolveDependencies( dependencyFilter, request );
153     }
154 
155     
156 
157 
158 
159 
160     
161     private List<Dependency> resolveDependencies( Collection<org.apache.maven.model.Dependency> mavenDependencies )
162             throws DependencyResolverException
163     
164     {
165         if ( mavenDependencies == null )
166         {
167             return Collections.emptyList();
168         }
169 
170         ArtifactTypeRegistry typeRegistry = createTypeRegistry();
171 
172         List<Dependency> aetherDependencies = new ArrayList<>( mavenDependencies.size() );
173 
174         for ( org.apache.maven.model.Dependency mavenDependency : mavenDependencies )
175         {
176             aetherDependencies.add( toDependency( mavenDependency, typeRegistry ) );
177         }
178 
179         return aetherDependencies;
180     }
181 
182     @Override
183     
184     public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies(
185             Collection<org.apache.maven.model.Dependency> mavenDependencies,
186             Collection<org.apache.maven.model.Dependency> managedMavenDependencies, TransformableFilter filter )
187         
188             throws DependencyResolverException
189     {
190 
191         List<Dependency> aetherDependencies = resolveDependencies( mavenDependencies );
192 
193         List<Dependency> aetherManagedDependencies = resolveDependencies( managedMavenDependencies );
194 
195         CollectRequest request = new CollectRequest( aetherDependencies, aetherManagedDependencies,
196                 aetherRepositories );
197 
198         return resolveDependencies( filter, request );
199     }
200 
201     
202     private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies(
203             TransformableFilter dependencyFilter, CollectRequest request ) throws DependencyResolverException
204     
205     {
206         try
207         {
208             DependencyFilter depFilter = null;
209             if ( dependencyFilter != null )
210             {
211                 depFilter = dependencyFilter.transform( new SonatypeAetherFilterTransformer() );
212             }
213 
214             final List<ArtifactResult> dependencyResults = repositorySystem.resolveDependencies( session, request,
215                     depFilter );
216 
217             
218             return new Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult>()
219             {
220                 @Override
221                 public Iterator<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> iterator()
222                 {
223                     
224                     Collection<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> artResults =
225                             new ArrayList<>(
226                             dependencyResults.size() );
227                     
228 
229                     for ( ArtifactResult artifactResult : dependencyResults )
230                     {
231                         artResults.add( new Maven30ArtifactResult( artifactResult ) );
232                     }
233 
234                     return artResults.iterator();
235                 }
236             };
237         }
238         catch ( ArtifactResolutionException e )
239         {
240             throw new Maven30DependencyResolverException( e );
241         }
242         catch ( DependencyCollectionException e )
243         {
244             throw new Maven30DependencyResolverException( e );
245         }
246     }
247 }