aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/graph/DotOutputVisitor.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/graph/DotOutputVisitor.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/graph/DotOutputVisitor.java93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/graph/DotOutputVisitor.java b/src/main/java/com/google/devtools/build/lib/graph/DotOutputVisitor.java
new file mode 100644
index 0000000000..2d18ac2d2e
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/graph/DotOutputVisitor.java
@@ -0,0 +1,93 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// All Rights Reserved.
+
+package com.google.devtools.build.lib.graph;
+
+import java.io.PrintWriter;
+
+/**
+ * <p> An implementation of GraphVisitor for displaying graphs in dot
+ * format. </p>
+ */
+public class DotOutputVisitor<T> implements GraphVisitor<T> {
+
+ /**
+ * Constructs a dot output visitor.
+ *
+ * The visitor writes to writer 'out', and rendering node labels as
+ * strings using the specified displayer, 'disp'.
+ */
+ public DotOutputVisitor(PrintWriter out, LabelSerializer<T> disp) {
+ // assert disp != null;
+ // assert out != null;
+ this.out = out;
+ this.disp = disp;
+ }
+
+ private final LabelSerializer<T> disp;
+ protected final PrintWriter out;
+ private boolean closeAtEnd = false;
+
+ @Override
+ public void beginVisit() {
+ out.println("digraph mygraph {");
+ }
+
+ @Override
+ public void endVisit() {
+ out.println("}");
+ out.flush();
+ if (closeAtEnd) {
+ out.close();
+ }
+ }
+
+ @Override
+ public void visitEdge(Node<T> lhs, Node<T> rhs) {
+ String s_lhs = disp.serialize(lhs);
+ String s_rhs = disp.serialize(rhs);
+ out.println("\"" + s_lhs + "\" -> \"" + s_rhs + "\"");
+ }
+
+ @Override
+ public void visitNode(Node<T> node) {
+ out.println("\"" + disp.serialize(node) + "\"");
+ }
+
+ /******************************************************************
+ * *
+ * Factories *
+ * *
+ ******************************************************************/
+
+ /**
+ * Create a DotOutputVisitor for output to a writer; uses default
+ * LabelSerializer.
+ */
+ public static <U> DotOutputVisitor<U> create(PrintWriter writer) {
+ return new DotOutputVisitor<U>(writer, new DefaultLabelSerializer<U>());
+ }
+
+ /**
+ * The default implementation of LabelSerializer simply serializes
+ * each node using its toString method.
+ */
+ private static class DefaultLabelSerializer<T> implements LabelSerializer<T> {
+ @Override
+ public String serialize(Node<T> node) {
+ return node.getLabel().toString();
+ }
+ }
+}