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.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26
27 import org.apache.maven.artifact.Artifact;
28 import org.apache.maven.shared.dependency.tree.DependencyNode;
29 import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
30
31
32
33
34
35 public class DependencyVersionMap
36 implements DependencyNodeVisitor
37 {
38 private boolean uniqueVersions;
39
40 private Map<String, List<DependencyNode>> idsToNode;
41
42
43
44
45
46
47
48
49 public DependencyVersionMap()
50 {
51 idsToNode = new HashMap<>();
52 }
53
54
55
56
57 public void setUniqueVersions( boolean uniqueVersions )
58 {
59 this.uniqueVersions = uniqueVersions;
60 }
61
62
63
64
65 public boolean visit( DependencyNode node )
66 {
67 addDependency( node );
68 return !containsConflicts( node );
69 }
70
71
72
73
74 public boolean endVisit( DependencyNode node )
75 {
76 return true;
77 }
78
79
80
81
82
83
84 public List<List<DependencyNode>> getConflictedVersionNumbers()
85 {
86 List<List<DependencyNode>> output = new ArrayList<>();
87 for ( List<DependencyNode> nodes : idsToNode.values() )
88 {
89 if ( containsConflicts( nodes ) )
90 {
91 output.add( nodes );
92 }
93 }
94 return output;
95 }
96
97
98
99
100
101 private void addDependency( DependencyNode node )
102 {
103 String key = constructKey( node );
104 List<DependencyNode> nodes = idsToNode.get( key );
105 if ( nodes == null )
106 {
107 nodes = new ArrayList<>();
108 idsToNode.put( key, nodes );
109 }
110 nodes.add( node );
111 }
112
113 private String constructKey( DependencyNode node )
114 {
115 return constructKey( node.getArtifact() );
116 }
117
118 private String constructKey( Artifact artifact )
119 {
120 return artifact.getGroupId() + ":" + artifact.getArtifactId();
121 }
122
123 private String getVersion( Artifact artifact )
124 {
125 return uniqueVersions ? artifact.getVersion() : artifact.getBaseVersion();
126 }
127
128 private boolean containsConflicts( DependencyNode node )
129 {
130 return containsConflicts( node.getArtifact() );
131 }
132
133 private boolean containsConflicts( Artifact artifact )
134 {
135 return containsConflicts( idsToNode.get( constructKey( artifact ) ) );
136 }
137
138
139
140
141
142
143
144 private boolean containsConflicts( List<DependencyNode> nodes )
145 {
146 String version = null;
147 for ( DependencyNode node : nodes )
148 {
149 if ( version == null )
150 {
151 version = getVersion( node.getArtifact() );
152 }
153 else
154 {
155 if ( version.compareTo( getVersion( node.getArtifact() ) ) != 0 )
156 {
157 return true;
158 }
159 }
160 }
161 return false;
162 }
163
164 }