View Javadoc
1   package org.apache.maven.shared.transfer.dependencies.collect.internal;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.util.ArrayList;
23  import java.util.List;
24  
25  import org.apache.maven.RepositoryUtils;
26  import org.apache.maven.artifact.handler.ArtifactHandler;
27  import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
28  import org.apache.maven.model.Model;
29  import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
30  import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
31  import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollector;
32  import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;
33  import org.eclipse.aether.RepositorySystem;
34  import org.eclipse.aether.RepositorySystemSession;
35  import org.eclipse.aether.artifact.Artifact;
36  import org.eclipse.aether.artifact.ArtifactTypeRegistry;
37  import org.eclipse.aether.artifact.DefaultArtifact;
38  import org.eclipse.aether.collection.CollectRequest;
39  import org.eclipse.aether.collection.DependencyCollectionException;
40  import org.eclipse.aether.graph.Dependency;
41  import org.eclipse.aether.repository.RemoteRepository;
42  
43  /**
44   * Maven 3.1+ implementation of the {@link DependencyCollector}
45   * 
46   * @author Robert Scholte
47   *
48   */
49  class Maven31DependencyCollector
50      implements MavenDependencyCollector
51  {
52      private final RepositorySystem repositorySystem;
53  
54      private final ArtifactHandlerManager artifactHandlerManager;
55      
56      private final RepositorySystemSession session;
57      
58      private final List<RemoteRepository> aetherRepositories;
59      
60      Maven31DependencyCollector( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
61                                  RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
62      {
63          super();
64          this.repositorySystem = repositorySystem;
65          this.artifactHandlerManager = artifactHandlerManager;
66          this.session = session;
67          this.aetherRepositories = aetherRepositories;
68      }
69  
70      @Override
71      public CollectorResult collectDependencies( org.apache.maven.model.Dependency root )
72          throws DependencyCollectorException
73      {
74          ArtifactTypeRegistry typeRegistry =
75                          (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
76                                                                 ArtifactHandlerManager.class, artifactHandlerManager );
77  
78          CollectRequest request = new CollectRequest();
79          request.setRoot( toDependency( root, typeRegistry ) );
80  
81          return collectDependencies( request );
82      }
83  
84      @Override
85      public CollectorResult collectDependencies( DependableCoordinate root )
86          throws DependencyCollectorException
87      {
88          ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getType() );
89          
90          String extension = artifactHandler != null ? artifactHandler.getExtension() : null;
91          
92          Artifact aetherArtifact = new DefaultArtifact( root.getGroupId(), root.getArtifactId(), root.getClassifier(),
93                                                         extension, root.getVersion() );
94          
95          CollectRequest request = new CollectRequest();
96          request.setRoot( new Dependency( aetherArtifact, null ) );
97  
98          return collectDependencies( request );
99      }
100     
101     @Override
102     public CollectorResult collectDependencies( Model root )
103         throws DependencyCollectorException
104     {
105         // Are there examples where packaging and type are NOT in sync
106         ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getPackaging() );
107         
108         String extension = artifactHandler != null ? artifactHandler.getExtension() : null;
109         
110         Artifact aetherArtifact =
111             new DefaultArtifact( root.getGroupId(), root.getArtifactId(), extension, root.getVersion() );
112         
113         CollectRequest request = new CollectRequest();
114         request.setRoot( new Dependency( aetherArtifact, null ) );
115         
116         ArtifactTypeRegistry typeRegistry =
117                         (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
118                                                                ArtifactHandlerManager.class, artifactHandlerManager );
119 
120         List<Dependency> aetherDependencies = new ArrayList<Dependency>( root.getDependencies().size() );
121         for ( org.apache.maven.model.Dependency mavenDependency : root.getDependencies() )
122         {
123             aetherDependencies.add( toDependency( mavenDependency, typeRegistry ) );
124         }
125         request.setDependencies( aetherDependencies );
126 
127         if ( root.getDependencyManagement() != null )
128         {
129             List<Dependency> aetherManagerDependencies =
130                 new ArrayList<Dependency>( root.getDependencyManagement().getDependencies().size() );
131             
132             for ( org.apache.maven.model.Dependency mavenDependency : root.getDependencyManagement().getDependencies() )
133             {
134                 aetherManagerDependencies.add( toDependency( mavenDependency, typeRegistry ) );
135             }
136             
137             request.setManagedDependencies( aetherManagerDependencies );
138         }
139 
140         return collectDependencies( request );
141     }
142 
143     private CollectorResult collectDependencies( CollectRequest request )
144         throws DependencyCollectorException
145     {
146         request.setRepositories( aetherRepositories );
147 
148         try
149         {
150             return new Maven31CollectorResult( repositorySystem.collectDependencies( session, request ) );
151         }
152         catch ( DependencyCollectionException e )
153         {
154             throw new DependencyCollectorException( e.getMessage(), e );
155         }
156     }
157 
158     private static Dependency toDependency( org.apache.maven.model.Dependency root, ArtifactTypeRegistry typeRegistry )
159                     throws DependencyCollectorException
160     {
161         Class<?>[] argClasses = new Class<?>[] { org.apache.maven.model.Dependency.class, ArtifactTypeRegistry.class };
162 
163         Object[] args = new Object[] { root, typeRegistry };
164 
165         return (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
166     }
167 }