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 }