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 import java.util.ArrayList;
25 import java.util.List;
26
27 import org.apache.maven.shared.dependency.graph.DependencyNode;
28 import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
29
30
31
32
33
34
35
36
37 public class TGFDependencyNodeVisitor extends AbstractSerializingVisitor implements DependencyNodeVisitor {
38
39
40
41
42
43
44 static final class EdgeAppender {
45
46
47
48 private final DependencyNode from;
49
50
51
52
53 private final DependencyNode to;
54
55
56
57
58 private final String label;
59
60
61
62
63
64
65
66
67 EdgeAppender(DependencyNode from, DependencyNode to, String label) {
68 super();
69 this.from = from;
70 this.to = to;
71 this.label = label;
72 }
73
74
75
76
77 @Override
78 public String toString() {
79 StringBuilder result = new StringBuilder(generateId(from));
80 result.append(' ').append(generateId(to));
81 if (label != null) {
82 result.append(' ').append(label);
83 }
84 return result.toString();
85 }
86 }
87
88
89
90
91 private final List<EdgeAppender> edges = new ArrayList<>();
92
93
94
95
96
97
98 public TGFDependencyNodeVisitor(Writer writer) {
99 super(writer);
100 }
101
102
103
104
105 @Override
106 public boolean endVisit(DependencyNode node) {
107 try {
108 if (node.getParent() == null || node.getParent() == node) {
109
110 writer.write("#" + System.lineSeparator());
111 for (EdgeAppender edge : edges) {
112 writer.write(edge.toString() + System.lineSeparator());
113 }
114 writer.flush();
115 } else {
116 DependencyNode parent = node.getParent();
117
118 edges.add(new EdgeAppender(parent, node, node.getArtifact().getScope()));
119 }
120 return true;
121 } catch (IOException e) {
122 throw new UncheckedIOException("Failed to write TGF format output", e);
123 }
124 }
125
126
127
128
129 @Override
130 public boolean visit(DependencyNode node) {
131 try {
132
133 writer.write(generateId(node));
134 writer.write(" ");
135 writer.write(node.toNodeString());
136 writer.write(System.lineSeparator());
137 writer.flush();
138 return true;
139 } catch (IOException e) {
140 throw new UncheckedIOException("Failed to write TGF format output", e);
141 }
142 }
143
144
145
146
147
148
149
150
151
152
153 private static String generateId(DependencyNode node) {
154 return String.valueOf(node.hashCode());
155 }
156 }