00001
00002 package org.dronus.graph;
00003
00004
00005 import java.io.BufferedReader;
00006 import java.io.IOException;
00007 import java.io.PrintStream;
00008 import java.util.ArrayList;
00009 import java.util.HashMap;
00010 import java.util.HashSet;
00011 import java.util.List;
00012 import java.util.StringTokenizer;
00013
00019 public class Graph {
00020 public List<Node> nodes= new ArrayList<Node>();
00021 public HashSet<Edge> edges= new HashSet<Edge>();
00022
00024 protected HashMap<Integer,Node> nodeIDRegistry = new HashMap<Integer,Node>();
00025
00026
00027 Node root;
00028
00029 public Graph() {}
00030
00034 public Graph(BufferedReader r, boolean silent) throws IOException {
00035 load(r, silent);
00036 }
00037
00039 public int nodeCount() {
00040 return nodes.size();
00041 }
00042
00043
00046 public void addNode( Node node ) {
00047 int id=node.id;
00048 if ( findNode(id) == null ) {
00049 nodeIDRegistry.put(id,node);
00050 nodes.add(node);
00051 if(root==null) root=node;
00052 } else throw new RuntimeException("node ID '"+id+"' already exists.");
00053 }
00054
00056 public void addEdge( Edge edge ) {
00057 if ( edge == null ) return;
00058 if(!edges.contains(edge)) {
00059 edges.add(edge);
00060 edge.getFrom().addEdge(edge);
00061 edge.getTo().addEdge(edge);
00062 }
00063 }
00064
00066 public Node findNode(int id ) {
00067
00068 return nodeIDRegistry.get(id);
00069 }
00070
00071
00073 public Edge findEdge( Node from, Node to ) {
00074 for (Edge e: from.getEdges()) {
00075 if (e.getTo() == to) return e;
00076 }
00077 return null;
00078 }
00079
00081 public boolean deleteEdge( Edge edge ) {
00082 synchronized(edges) {
00083 if ( edge == null ) return false;
00084 if (!edges.remove(edge)) return false;
00085 edge.getFrom().removeEdge(edge);
00086 edge.getTo().removeEdge(edge);
00087 return true;
00088 }
00089 }
00090
00092 synchronized public boolean removeNode( Node node ) {
00093 if ( node == null ) return false;
00094 if (!nodes.remove(node)) return false;
00095 int id = node.id;
00096 if (id != 0) nodeIDRegistry.remove(id);
00097 return true;
00098 }
00099
00101 synchronized public boolean deleteNode( Node node ) {
00102 if ( node == null ) return false;
00103 if ( !nodes.remove(node) ) return false;
00104 int id = node.id;
00105 if (id != 0 ) nodeIDRegistry.remove(id);
00106 for (Edge e: node.getEdges() ) {
00107 if ( e.getFrom() == node ) {
00108 edges.remove(e);
00109 e.getTo().removeEdge(e);
00110 } else if ( e.getTo() == node ) {
00111 edges.remove(e);
00112 e.getFrom().removeEdge(e);
00113 }
00114 }
00115 return true;
00116 }
00117
00122 public Node getRoot(){
00123 return root;
00124 }
00125
00127 synchronized public void clearAll() {
00128 nodes.clear();
00129 edges.clear();
00130 nodeIDRegistry.clear();
00131 }
00132
00133 void load(BufferedReader r, boolean silent) throws IOException{
00134 String line;
00135
00136
00137 while(!(line=r.readLine()).equals("") && line.length()>0) {
00138 StringTokenizer tok=new StringTokenizer(line,"\t");
00139 String id=tok.nextToken(), name=tok.nextToken(), type=tok.nextToken();
00140 Node n=new Node(id, unescape(name), type);
00141 if(findNode(id.hashCode())==null)
00142 addNode(n);
00143 }
00144
00145 if(!silent) System.out.print(nodeCount()+" Nodes; ");
00146
00147
00148 while((line=r.readLine())!=null && line.length()>0) {
00149 StringTokenizer tok=new StringTokenizer(line,"\t");
00150 String id=tok.nextToken(), n1=tok.nextToken(), n2=tok.nextToken();
00151
00152 String name=tok.nextToken();
00153 Node node1=findNode(n1.hashCode()), node2=findNode(n2.hashCode());
00154
00155 Edge e=new Edge(node1,node2, id,name);
00156 if (node1!=null && node2!=null) addEdge(e);
00157 else
00158 System.out.println("\n Edge damaged: "+id+" from "+n1+" to "+n2);
00159 }
00160 if(!silent) System.out.println(edges.size()+" Edges.");
00161
00162
00163 if (getRoot()!=null && getRoot().type.equals("Set")){
00164 Node set=getRoot();
00165 for (Node n: nodes)
00166 addEdge(new Edge(n, set, null,"in"));
00167 }
00168 }
00169
00170 public void dump(PrintStream p){
00171 for (Node n : nodes)
00172 p.println(n.id+"\t"+n.text+"\t"+n.type+"\t");
00173 p.println();
00174 for (Edge e: edges)
00175 p.println(e.id+"\t"+e.from.id+"\t"+e.to.id+"\t"+e.type);
00176 }
00177
00178 String unescape(String escaped){
00179 return escaped.replace("\\n", "\n");
00180 }
00181 }