1 package org.apache.maven.report.projectinfo.dependencies;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.jar.JarEntry;
28
29 import org.apache.maven.artifact.Artifact;
30 import org.apache.maven.project.MavenProject;
31 import org.apache.maven.shared.dependency.graph.DependencyNode;
32 import org.apache.maven.shared.jar.JarAnalyzer;
33 import org.apache.maven.shared.jar.JarData;
34 import org.apache.maven.shared.jar.classes.JarClasses;
35 import org.apache.maven.shared.jar.classes.JarClassesAnalysis;
36
37
38
39
40
41 public class Dependencies
42 {
43 private final MavenProject project;
44
45 private final DependencyNode dependencyNode;
46
47 private final JarClassesAnalysis classesAnalyzer;
48
49
50
51
52 private List<Artifact> projectDependencies;
53
54
55
56
57 private List<Artifact> projectTransitiveDependencies;
58
59
60
61
62 private List<Artifact> allDependencies;
63
64
65
66
67 private Map<String, List<Artifact>> dependenciesByScope;
68
69
70
71
72 private Map<String, List<Artifact>> transitiveDependenciesByScope;
73
74
75
76
77 private Map<String, JarData> dependencyDetails;
78
79
80
81
82
83
84
85
86 public Dependencies( MavenProject project, DependencyNode dependencyTreeNode, JarClassesAnalysis classesAnalyzer )
87 {
88 this.project = project;
89 this.dependencyNode = dependencyTreeNode;
90 this.classesAnalyzer = classesAnalyzer;
91 }
92
93
94
95
96
97
98 public MavenProject getProject()
99 {
100 return project;
101 }
102
103
104
105
106 public boolean hasDependencies()
107 {
108 return ( getProjectDependencies() != null ) && ( !getProjectDependencies().isEmpty() );
109 }
110
111
112
113
114 public List<Artifact> getProjectDependencies()
115 {
116 if ( projectDependencies != null )
117 {
118 return projectDependencies;
119 }
120
121 projectDependencies = new ArrayList<Artifact>();
122 for ( DependencyNode dep : dependencyNode.getChildren() )
123 {
124 projectDependencies.add( dep.getArtifact() );
125 }
126
127 return projectDependencies;
128 }
129
130
131
132
133 public List<Artifact> getTransitiveDependencies()
134 {
135 if ( projectTransitiveDependencies != null )
136 {
137 return projectTransitiveDependencies;
138 }
139
140 projectTransitiveDependencies = new ArrayList<Artifact>( getAllDependencies() );
141 projectTransitiveDependencies.removeAll( getProjectDependencies() );
142
143 return projectTransitiveDependencies;
144 }
145
146
147
148
149 public List<Artifact> getAllDependencies()
150 {
151 if ( allDependencies != null )
152 {
153 return allDependencies;
154 }
155
156 allDependencies = new ArrayList<Artifact>();
157
158 addAllChildrenDependencies( dependencyNode );
159
160 return allDependencies;
161 }
162
163
164
165
166
167
168
169
170
171
172 public Map<String, List<Artifact>> getDependenciesByScope( boolean isTransitively )
173 {
174 if ( isTransitively )
175 {
176 if ( transitiveDependenciesByScope != null )
177 {
178 return transitiveDependenciesByScope;
179 }
180
181 transitiveDependenciesByScope = new HashMap<String, List<Artifact>>();
182 for ( Artifact artifact : getTransitiveDependencies() )
183 {
184 List<Artifact> multiValue = transitiveDependenciesByScope.get( artifact.getScope() );
185 if ( multiValue == null )
186 {
187 multiValue = new ArrayList<Artifact>();
188 }
189
190 if ( !multiValue.contains( artifact ) )
191 {
192 multiValue.add( artifact );
193 }
194 transitiveDependenciesByScope.put( artifact.getScope(), multiValue );
195 }
196
197 return transitiveDependenciesByScope;
198 }
199
200 if ( dependenciesByScope != null )
201 {
202 return dependenciesByScope;
203 }
204
205 dependenciesByScope = new HashMap<String, List<Artifact>>();
206 for ( Artifact artifact : getProjectDependencies() )
207 {
208 List<Artifact> multiValue = dependenciesByScope.get( artifact.getScope() );
209 if ( multiValue == null )
210 {
211 multiValue = new ArrayList<Artifact>();
212 }
213
214 if ( !multiValue.contains( artifact ) )
215 {
216 multiValue.add( artifact );
217 }
218 dependenciesByScope.put( artifact.getScope(), multiValue );
219 }
220
221 return dependenciesByScope;
222 }
223
224
225
226
227
228
229 public JarData getJarDependencyDetails( Artifact artifact )
230 throws IOException
231 {
232 if ( dependencyDetails == null )
233 {
234 dependencyDetails = new HashMap<String, JarData>();
235 }
236
237 JarData jarData = dependencyDetails.get( artifact.getId() );
238 if ( jarData != null )
239 {
240 return jarData;
241 }
242
243 if ( artifact.getFile().isDirectory() )
244 {
245 jarData = new JarData( artifact.getFile(), null, new ArrayList<JarEntry>() );
246
247 jarData.setJarClasses( new JarClasses() );
248 }
249 else
250 {
251 JarAnalyzer jarAnalyzer = new JarAnalyzer( artifact.getFile() );
252
253 try
254 {
255 classesAnalyzer.analyze( jarAnalyzer );
256 }
257 finally
258 {
259 jarAnalyzer.closeQuietly();
260 }
261
262 jarData = jarAnalyzer.getJarData();
263 }
264
265 dependencyDetails.put( artifact.getId(), jarData );
266
267 return jarData;
268 }
269
270
271
272
273
274
275
276
277
278
279 private void addAllChildrenDependencies( DependencyNode dependencyNode )
280 {
281 for ( DependencyNode subdependencyNode : dependencyNode.getChildren() )
282 {
283 Artifact artifact = subdependencyNode.getArtifact();
284
285 if ( artifact.getGroupId().equals( project.getGroupId() )
286 && artifact.getArtifactId().equals( project.getArtifactId() )
287 && artifact.getVersion().equals( project.getVersion() ) )
288 {
289 continue;
290 }
291
292 if ( !allDependencies.contains( artifact ) )
293 {
294 allDependencies.add( artifact );
295 }
296
297 addAllChildrenDependencies( subdependencyNode );
298 }
299 }
300 }