package org.limewire.mojito.visual.graph; import org.limewire.mojito.routing.RouteTable; import org.limewire.mojito.routing.RouteTable.RouteTableListener; import org.limewire.mojito.visual.RouteTableGraphCallback; import org.limewire.mojito.visual.components.BinaryEdge; import org.limewire.mojito.visual.components.InteriorNodeVertex; import org.limewire.mojito.visual.components.BinaryEdge.EdgeType; import edu.uci.ics.jung.graph.ArchetypeVertex; import edu.uci.ics.jung.graph.Edge; import edu.uci.ics.jung.graph.Vertex; import edu.uci.ics.jung.graph.impl.SparseTree; import edu.uci.ics.jung.utils.UserData; public abstract class RouteTableGraph implements RouteTableListener { protected RouteTable routeTable; protected RootableSparseTree tree; protected Vertex root; protected RouteTableGraphCallback callback; public RouteTableGraph(RouteTable routeTable, RouteTableGraphCallback callback) { this.routeTable = routeTable; this.callback = callback; routeTable.addRouteTableListener(this); } public abstract void populateGraph(); public abstract String getGraphInfo(); public abstract String getLabelForVertex(ArchetypeVertex v); protected InteriorNodeVertex createInteriorNode(InteriorNodeVertex previousVertex, EdgeType type) { InteriorNodeVertex vertex = new InteriorNodeVertex(); tree.addVertex(vertex); tree.addEdge(new BinaryEdge(previousVertex, vertex, type)); return vertex; } protected InteriorNodeVertex removeRouteTableVertex(Vertex vertex) { InteriorNodeVertex predecessor = (InteriorNodeVertex)vertex.getPredecessors().iterator().next(); tree.removeEdge((Edge)vertex.getInEdges().iterator().next()); tree.removeVertex(vertex); return predecessor; } public SparseTree getTree(){ return tree; } public void deregister() { routeTable.removeRouteTableListener(this); } public static class RootableSparseTree extends SparseTree { public RootableSparseTree(Vertex root) { super(root); } /** * Clears the tree and add this <tt>Vertex</tt> * as the new root. */ public synchronized void newRoot(Vertex root) { removeAllEdges(); removeAllVertices(); this.mRoot = root; addVertex( root ); mRoot.setUserDatum(SPARSE_ROOT_KEY, SPARSE_ROOT_KEY, UserData.SHARED); mRoot.setUserDatum(IN_TREE_KEY, IN_TREE_KEY, UserData.SHARED); } } }