public static String createDot()

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();
  }