in src/main/java/com/twitter/nodes/NodeDotGraphGenerator.java [178:223]
public static String createDot(List<Node> nodes) {
StringBuilder sb = new StringBuilder();
sb.append("digraph G {\n");
sb.append(DEFAULT_PROPERTIES);
// Extract all node graph information recursively.
Map<String, NodeInfo> nodeInfoMap = Maps.newLinkedHashMap();
GraphContext context = new GraphContext();
for (Node node : nodes) {
extractNodeInfo(node, nodeInfoMap, context);
}
// Merge all keys and dedupe.
Map<Node, String> seenNodeKeyMap = new IdentityHashMap<>();
for (NodeInfo info : nodeInfoMap.values()) {
Node unwrappedNode = unwrapOptional(info.node);
String seenKey = seenNodeKeyMap.get(unwrappedNode);
if (seenKey != null) {
info.keyName = seenKey; // merge all keys and use a canonical version for each node object.
} else {
seenNodeKeyMap.put(unwrappedNode, info.keyName);
}
}
// Output all node properties, labels, etc
Set<String> seenKeys = Sets.newHashSet();
for (NodeInfo nodeInfo : nodeInfoMap.values()) {
if (!seenKeys.contains(nodeInfo.keyName)) {
sb.append(" ").append(nodeInfo.getDOTString()).append("\n");
seenKeys.add(nodeInfo.keyName);
}
}
sb.append("\n");
// Output all edges
for (String key : seenKeys) {
NodeInfo nodeInfo = nodeInfoMap.get(key);
for (String edge : nodeInfo.getEdgeStrings()) {
sb.append(" ").append(edge).append("\n");
}
}
sb.append("}\n");
return sb.toString();
}