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  
30  import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
31  import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
32  import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollector;
33  import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;
34  import org.sonatype.aether.RepositorySystem;
35  import org.sonatype.aether.RepositorySystemSession;
36  import org.sonatype.aether.artifact.Artifact;
37  import org.sonatype.aether.artifact.ArtifactTypeRegistry;
38  import org.sonatype.aether.collection.CollectRequest;
39  import org.sonatype.aether.collection.DependencyCollectionException;
40  import org.sonatype.aether.graph.Dependency;
41  import org.sonatype.aether.repository.RemoteRepository;
42  import org.sonatype.aether.util.artifact.DefaultArtifact;
43  
44  /**
45   * Maven 3.0 implementation of the {@link DependencyCollector}
46   * 
47   * @author Robert Scholte
48   *
49   */
50  class Maven30DependencyCollector
51      implements MavenDependencyCollector
52  {
53      private final RepositorySystem repositorySystem;
54  
55      private final ArtifactHandlerManager artifactHandlerManager;
56  
57      private final RepositorySystemSession session;
58      
59      private final List<RemoteRepository> aetherRepositories;
60      
61      Maven30DependencyCollector( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
62                                  RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
63      {
64          super();
65          this.repositorySystem = repositorySystem;
66          this.artifactHandlerManager = artifactHandlerManager;
67          this.session = session;
68          this.aetherRepositories = aetherRepositories;
69      }
70  
71      @Override
72      public CollectorResult collectDependencies( org.apache.maven.model.Dependency root )
73          throws DependencyCollectorException
74      {
75          ArtifactTypeRegistry typeRegistry =
76                          (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
77                                                                 ArtifactHandlerManager.class, artifactHandlerManager );
78  
79          CollectRequest request = new CollectRequest();
80          request.setRoot( toDependency( root, typeRegistry ) );
81  
82          return collectDependencies( request );
83      }
84  
85      @Override
86      public CollectorResult collectDependencies( DependableCoordinate root )
87          throws DependencyCollectorException
88      {
89          ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getType() );
90          
91          String extension = artifactHandler != null ? artifactHandler.getExtension() : null;
92          
93          Artifact aetherArtifact = new DefaultArtifact( root.getGroupId(), root.getArtifactId(), root.getClassifier(),
94                                                         extension, root.getVersion() );
95          
96          CollectRequest request = new CollectRequest();
97          request.setRoot( new Dependency( aetherArtifact, null ) );
98  
99          return collectDependencies( request );
100     }
101     
102     @Override
103     public CollectorResult collectDependencies( Model root )
104         throws DependencyCollectorException
105     {
106         // Are there examples where packaging and type are NOT in sync
107         ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getPackaging() );
108         
109         String extension = artifactHandler != null ? artifactHandler.getExtension() : null;
110         
111         Artifact aetherArtifact =
112             new DefaultArtifact( root.getGroupId(), root.getArtifactId(), extension, root.getVersion() );
113         
114         CollectRequest request = new CollectRequest();
115         request.setRoot( new Dependency( aetherArtifact, null ) );
116 
117         ArtifactTypeRegistry typeRegistry =
118                         (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
119                                                                ArtifactHandlerManager.class, artifactHandlerManager );
120 
121         List<Dependency> aetherDependencies = new ArrayList<Dependency>( root.getDependencies().size() );
122         for ( org.apache.maven.model.Dependency mavenDependency : root.getDependencies() )
123         {
124             aetherDependencies.add( toDependency( mavenDependency, typeRegistry ) );
125         }
126         request.setDependencies( aetherDependencies );
127 
128         if ( root.getDependencyManagement() != null )
129         {
130             List<Dependency> aetherManagerDependencies =
131                 new ArrayList<Dependency>( root.getDependencyManagement().getDependencies().size() );
132             
133             for ( org.apache.maven.model.Dependency mavenDependency : root.getDependencyManagement().getDependencies() )
134             {
135                 aetherManagerDependencies.add( toDependency( mavenDependency, typeRegistry ) );
136             }
137             
138             request.setManagedDependencies( aetherManagerDependencies );
139         }
140         
141         return collectDependencies( request );
142     }
143 
144     private CollectorResult collectDependencies( CollectRequest request )
145         throws DependencyCollectorException
146     {
147         request.setRepositories( aetherRepositories );
148 
149         try
150         {
151             return new Maven30CollectorResult( repositorySystem.collectDependencies( session, request ) );
152         }
153         catch ( DependencyCollectionException e )
154         {
155             throw new DependencyCollectorException( e.getMessage(), e );
156         }
157     }
158 
159     private static Dependency toDependency( org.apache.maven.model.Dependency mavenDependency,
160                                             ArtifactTypeRegistry typeRegistry )
161         throws DependencyCollectorException
162     {
163         Class<?>[] argClasses = new Class<?>[] { org.apache.maven.model.Dependency.class, ArtifactTypeRegistry.class };
164 
165         Object[] args = new Object[] { mavenDependency, typeRegistry };
166 
167         return (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
168     }
169 }