1 package org.apache.maven.shared.transfer.dependencies.collect.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.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
46
47
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
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 }