1 package org.apache.maven.shared.dependency.tree;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.Collections;
23 import java.util.Map;
24 import java.util.Set;
25
26 import org.apache.maven.artifact.Artifact;
27 import org.apache.maven.artifact.factory.ArtifactFactory;
28 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
29 import org.apache.maven.artifact.repository.ArtifactRepository;
30 import org.apache.maven.artifact.resolver.ArtifactCollector;
31 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
32 import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
33 import org.apache.maven.artifact.resolver.ResolutionListener;
34 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
35 import org.apache.maven.project.MavenProject;
36 import org.apache.maven.project.artifact.InvalidDependencyVersionException;
37 import org.apache.maven.shared.dependency.tree.traversal.CollectingDependencyNodeVisitor;
38 import org.codehaus.plexus.component.annotations.Component;
39 import org.codehaus.plexus.component.annotations.Requirement;
40 import org.codehaus.plexus.logging.AbstractLogEnabled;
41
42
43
44
45
46
47
48
49
50 @Component( role = DependencyTreeBuilder.class )
51 public class DefaultDependencyTreeBuilder
52 extends AbstractLogEnabled
53 implements DependencyTreeBuilder
54 {
55 @Requirement
56 private ArtifactFactory factory;
57
58 @Requirement
59 private ArtifactMetadataSource metadataSource;
60
61
62
63
64 @Requirement
65 private ArtifactCollector collector;
66
67
68
69 private ArtifactResolutionResult result;
70
71
72
73
74
75
76
77
78 public DependencyTree buildDependencyTree( MavenProject project, ArtifactRepository repository,
79 ArtifactFactory factory, ArtifactMetadataSource metadataSource,
80 ArtifactCollector collector )
81 throws DependencyTreeBuilderException
82 {
83 DependencyNode rootNode = buildDependencyTree( project, repository, factory, metadataSource, null, collector );
84
85 CollectingDependencyNodeVisitor collectingVisitor = new CollectingDependencyNodeVisitor();
86 rootNode.accept( collectingVisitor );
87
88 return new DependencyTree( rootNode, collectingVisitor.getNodes() );
89 }
90
91
92
93
94 public DependencyNode buildDependencyTree( MavenProject project, ArtifactRepository repository,
95 ArtifactFactory factory, ArtifactMetadataSource metadataSource,
96 ArtifactFilter filter, ArtifactCollector collector )
97 throws DependencyTreeBuilderException
98 {
99 DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener( getLogger() );
100
101 try
102 {
103 @SuppressWarnings( "unchecked" )
104 Map<String, Artifact> managedVersions = project.getManagedVersionMap();
105
106 @SuppressWarnings( "unchecked" )
107 Set<Artifact> dependencyArtifacts = project.getDependencyArtifacts();
108
109 if ( dependencyArtifacts == null )
110 {
111 dependencyArtifacts = project.createArtifacts( factory, null, null );
112 }
113
114 getLogger().debug( "Dependency tree resolution listener events:" );
115
116
117
118 result =
119 collector.collect( dependencyArtifacts, project.getArtifact(), managedVersions, repository,
120 project.getRemoteArtifactRepositories(), metadataSource, filter,
121 Collections.singletonList( (ResolutionListener) listener ) );
122
123 return listener.getRootNode();
124 }
125 catch ( ArtifactResolutionException exception )
126 {
127 throw new DependencyTreeBuilderException( "Cannot build project dependency tree", exception );
128 }
129 catch ( InvalidDependencyVersionException e )
130 {
131 throw new DependencyTreeBuilderException( "Invalid dependency version for artifact "
132 + project.getArtifact() );
133 }
134 }
135
136 public DependencyNode buildDependencyTree( MavenProject project )
137 throws DependencyTreeBuilderException
138 {
139 return buildDependencyTree( project, project.getProjectBuilderConfiguration().getLocalRepository(), factory,
140 metadataSource, null, collector );
141 }
142
143 public DependencyNode buildDependencyTree( MavenProject project, ArtifactRepository repository, ArtifactFilter filter )
144 throws DependencyTreeBuilderException
145 {
146 return buildDependencyTree( project, repository, factory, metadataSource, filter, collector );
147 }
148
149
150
151 protected ArtifactResolutionResult getArtifactResolutionResult()
152 {
153 return result;
154 }
155 }