1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.plugins.dependency.tree;
20  
21  import java.io.IOException;
22  import java.io.UncheckedIOException;
23  import java.io.Writer;
24  
25  import org.apache.maven.shared.dependency.graph.DependencyNode;
26  import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
27  
28  
29  
30  
31  
32  
33  
34  
35  public class GraphmlDependencyNodeVisitor extends AbstractSerializingVisitor implements DependencyNodeVisitor {
36  
37      
38  
39  
40      private static final String GRAPHML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> "
41              + "<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" "
42              + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
43              + "xmlns:y=\"http://www.yworks.com/xml/graphml\" "
44              + "xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns "
45              + "http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\">" + System.lineSeparator()
46              + "  <key for=\"node\" id=\"d0\" yfiles.type=\"nodegraphics\"/> " + System.lineSeparator()
47              + "  <key for=\"edge\" id=\"d1\" yfiles.type=\"edgegraphics\"/> " + System.lineSeparator()
48              + "<graph id=\"dependencies\" edgedefault=\"directed\">" + System.lineSeparator();
49  
50      
51  
52  
53      private static final String GRAPHML_FOOTER = "</graph></graphml>";
54  
55      
56  
57  
58  
59  
60      public GraphmlDependencyNodeVisitor(Writer writer) {
61          super(writer);
62      }
63  
64      
65  
66  
67      @Override
68      public boolean endVisit(DependencyNode node) {
69          try {
70              if (node.getParent() == null || node.getParent() == node) {
71                  writer.write(GRAPHML_FOOTER);
72              } else {
73                  DependencyNode p = node.getParent();
74                  writer.write("<edge source=\"" + generateId(p) + "\" target=\"" + generateId(node) + "\">");
75                  if (node.getArtifact().getScope() != null) {
76                      
77                      writer.write("<data key=\"d1\"><y:PolyLineEdge><y:EdgeLabel>"
78                              + node.getArtifact().getScope() + "</y:EdgeLabel></y:PolyLineEdge></data>");
79                  }
80                  writer.write("</edge>" + System.lineSeparator());
81              }
82              writer.flush();
83              return true;
84          } catch (IOException e) {
85              throw new UncheckedIOException("Failed to write GraphML format output", e);
86          }
87      }
88  
89      
90  
91  
92      @Override
93      public boolean visit(DependencyNode node) {
94          try {
95              if (node.getParent() == null || node.getParent() == node) {
96                  writer.write(GRAPHML_HEADER);
97                  writer.flush();
98              }
99              
100             writer.write("<node id=\"" + generateId(node) + "\">");
101             
102             writer.write("<data key=\"d0\"><y:ShapeNode><y:NodeLabel>" + node.toNodeString()
103                     + "</y:NodeLabel></y:ShapeNode></data>");
104             writer.write("</node>" + System.lineSeparator());
105             writer.flush();
106             return true;
107         } catch (IOException e) {
108             throw new UncheckedIOException("Failed to write GraphML format output", e);
109         }
110     }
111 
112     
113 
114 
115 
116 
117 
118 
119 
120 
121     private static String generateId(DependencyNode node) {
122         return String.valueOf(node.hashCode());
123     }
124 }