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