in src/main/java/com/twitter/nodes/NodeDotGraphGenerator.java [255:287]
private static NodeInfo extractNodeInfo(
Node node, Map<String, NodeInfo> nodeInfoMap, GraphContext context) {
// Check if we have seen this before
NodeInfo seenInfo = context.getNodeInfo(node);
if (seenInfo != null) {
return seenInfo;
}
NodeInfo info = new NodeInfo("n" + context.getKeyIdAndInc(), node);
nodeInfoMap.put(info.keyName, info); // put into the map first
Node baseNode = unwrapOptional(node);
// create dependency map, some dependencies are special and need to be added specially
Map<String, Node> depsByStr = baseNode.getInputsByName();
// Add all dependencies and semi-dependencies to the NodeInfo map.
Set<? extends Enum> depEnums = node.getOptionalDependencies();
Set<String> optionalDeps = depEnums.stream().map(e -> e.name()).collect(Collectors.toSet());
for (Map.Entry<String, Node> depEntry : depsByStr.entrySet()) {
Node dep = depEntry.getValue();
// Recursively get information for all dependencies
Node unwrappedNode = unwrapOptional(dep);
NodeInfo depNodeInfo = extractNodeInfo(unwrappedNode, nodeInfoMap, context);
EdgeInfo edgeInfo = new EdgeInfo(
optionalDeps.contains(depEntry.getKey()) || dep.isOptional(),
depEntry.getKey());
info.depInfo.put(depEntry.getKey(), Pair.of(depNodeInfo, edgeInfo));
}
context.updateNodeInfo(node, info);
return info;
}