VisClient/org/dronus/graph/Graph.java

Go to the documentation of this file.
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 ) { // doesn't already exist
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         //if ( id == 0 ) return null; // ignore
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                 //read all nodes.
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                 //read all edges. 
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); //add edge only if nodes exist!
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 //              fill fake set edges (not transfered)
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 } 

Generated on Tue Apr 7 17:57:19 2009 for visclient by  doxygen 1.5.1