package edu.nd.nina.io;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import edu.nd.nina.DirectedGraph;
import edu.nd.nina.Graph;
import edu.nd.nina.graph.DefaultEdge;
import edu.nd.nina.graph.SimpleGraph;
public class Dot {
public static void save(Graph<String, String> graph,
String fileName, String desc) {
PrintWriter pw = null;
try {
pw = new PrintWriter(fileName);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
return;
}
if (graph instanceof DirectedGraph) {
pw.printf("# Directed graph: %s \n", fileName);
} else {
pw.printf(
"# Undirected graph (each unordered pair of nodes is saved once): %s\n",
fileName);
}
if (!desc.isEmpty()) {
pw.printf("# %s\n", desc);
}
pw.printf("# Nodes: %d Edges: %d\n", graph.vertexSet().size(), graph
.edgeSet().size());
if (graph instanceof DirectedGraph) {
pw.printf("# FromNodeId\tToNodeId\n");
} else {
pw.printf("# NodeId\tNodeId\n");
}
if (graph instanceof DirectedGraph) {
pw.printf("digraph %s {\n", desc);
for (String e : graph.edgeSet()) {
pw.printf("%s->%s\n", graph.getEdgeSource(e),
graph.getEdgeTarget(e));
}
pw.printf("}\n");
}else{
pw.printf("graph %s {\n", desc);
for (String e : graph.edgeSet()) {
pw.printf("%s--%s\n", graph.getEdgeSource(e),
graph.getEdgeTarget(e));
}
pw.printf("}\n");
}
pw.close();
}
public static Graph<String, DefaultEdge> load(
String fileName, String desc) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(fileName));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
String line = "";
boolean directed = false;
SimpleGraph<String,DefaultEdge> graph = new SimpleGraph<String,DefaultEdge>(DefaultEdge.class);
try {
while((line = br.readLine()) != null){
if(line.startsWith("#")){
continue;
}
if(line.startsWith("graph")){
directed = false;
continue;
}
if(line.startsWith("digraph")){
directed = true;
continue;
}
String[] lineDiv;
if(directed){
lineDiv = line.split("->");
}else{
lineDiv = line.split("--");
}
if(lineDiv.length != 2){
continue;
}
if(lineDiv[1].contains("[")){
lineDiv[1] = lineDiv[1].substring(0, lineDiv[1].indexOf("["));
}
String src = lineDiv[0];
String dest = lineDiv[1];
graph.addVertex(src);
graph.addVertex(dest);
graph.addEdge(src, dest);
}
} catch (IOException e) {
e.printStackTrace();
}
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return graph;
}
}