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