JAL-3032 adds Java 8 functionality (2/2)
[jalview.git] / src2 / fr / orsay / lri / varna / models / treealign / TreeGraphviz.java
diff --git a/src2/fr/orsay/lri/varna/models/treealign/TreeGraphviz.java b/src2/fr/orsay/lri/varna/models/treealign/TreeGraphviz.java
new file mode 100644 (file)
index 0000000..be22782
--- /dev/null
@@ -0,0 +1,114 @@
+package fr.orsay.lri.varna.models.treealign;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+
+
+/**
+ * This class translates a Tree to a graphviz file.
+ * @author Raphael Champeimont
+ *
+ * @param <? extends GraphvizDrawableNodeValue> the type of values in the tree
+ */
+public class TreeGraphviz {
+
+       /**
+        * Generates a PostScript file using graphviz.
+        * The dot command must be available.
+        */
+       public static void treeToGraphvizPostscript(Tree<? extends GraphvizDrawableNodeValue> tree, String filename, String title) throws IOException {
+               // generate graphviz source
+               String graphvizSource = treeToGraphviz(tree, title);
+               
+               // open output file
+               BufferedWriter fbw;
+               fbw = new BufferedWriter(new FileWriter(filename));
+       
+       // execute graphviz
+               Process proc = Runtime.getRuntime().exec("dot -Tps");
+       BufferedWriter bw  = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));
+       BufferedReader br  = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+       BufferedReader bre = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
+       bw.write(graphvizSource);
+       bw.close();
+       {
+               String line = null;
+            while ((line = br.readLine()) != null) {
+               fbw.write(line + "\n");
+            }
+       }
+       {
+               String line = null;
+            while ((line = bre.readLine()) != null) {
+               System.err.println(line);
+            }
+       }
+       
+       // wait for graphviz to end
+        try {
+                       proc.waitFor();
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
+
+        // close file
+               fbw.close();
+       }
+       
+       /**
+        * Like treeToGraphvizPostscript(Tree,String,String) but with the title
+        * equal to the filename.
+        */
+       public static void treeToGraphvizPostscript(Tree<? extends GraphvizDrawableNodeValue> tree, String filename) throws IOException {
+               treeToGraphvizPostscript(tree, filename, filename);
+       }
+       
+       /**
+        * Creates a graphviz source file from a Tree.
+        * @param title the title of the graph
+        */
+       public static void treeToGraphvizFile(Tree<? extends GraphvizDrawableNodeValue> tree, String filename, String title) throws IOException {
+               BufferedWriter bw;
+               bw = new BufferedWriter(new FileWriter(filename));
+       bw.write(treeToGraphviz(tree, filename));
+       bw.close();
+       }
+       
+       /**
+        * Like treeToGraphvizFile(Tree,String,String) but with the title
+        * equal to the filename.
+        */
+       public static void treeToGraphvizFile(Tree<? extends GraphvizDrawableNodeValue> tree, String filename) throws IOException {
+               treeToGraphvizFile(tree, filename, filename);
+       }
+       
+       /**
+        * Creates a graphviz source from a Tree.
+        * @param title the title of the graph
+        */
+       public static String treeToGraphviz(Tree<? extends GraphvizDrawableNodeValue> tree, String title) {
+               return "digraph \"" + title + "\" {\n" + subtreeToGraphviz(tree) + "}\n";
+       }
+       
+       private static String subtreeToGraphviz(Tree<? extends GraphvizDrawableNodeValue> tree) {
+               String s = "";
+               String myId = tree.toGraphvizNodeId();
+               
+               s +=
+                       "\""
+                       + myId
+                       + "\" [label=\""
+                       + ((tree.getValue() != null) ? tree.getValue().toGraphvizNodeName() : "null")
+                       + "\"]\n";
+               for (Tree<? extends GraphvizDrawableNodeValue> child: tree.getChildren()) {
+                       s += "\"" + myId + "\" -> \"" + child.toGraphvizNodeId() + "\"\n";
+                       s += subtreeToGraphviz(child);
+               }
+               
+               return s;
+       }
+}