package esl.datastructures.graph.sample; import esl.datastructures.graph.Graph; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.UUID; public class DAG implements Graph<DAGNode, DAGEdge> { private DAGNode start = null; private List<DAGNode> nodes = new ArrayList<DAGNode>(); private HashMap<DAGNode, List<DAGEdge>> nodeEdgeMap = new HashMap<DAGNode, List<DAGEdge>>(); private HashMap<DAGEdge, DAGNode> edgeDestinationMap = new HashMap<DAGEdge, DAGNode>(); private HashMap<DAGEdge, DAGNode> edgeOriginMap = new HashMap<DAGEdge, DAGNode>(); public DAG() { start = new DAGNode("_root"); List<DAGEdge> edges = new ArrayList<DAGEdge>(); nodeEdgeMap.put(start, edges); nodes.add(start); } @Override public DAGNode getStartNode() { return start; } @Override public DAGNode createNode(String nodeName) { DAGNode node = new DAGNode(nodeName); List<DAGEdge> edges = new ArrayList<DAGEdge>(); nodeEdgeMap.put(node, edges); nodes.add(node); return node; } @Override public DAGEdge createEdge(String lbl, DAGNode n1, DAGNode n2) { return createEdge(lbl, UUID.randomUUID().toString(), n1, n2); } @Override public DAGNode getNodeByName(String name) { DAGNode n = null; for (DAGNode node: nodes) { if (node.compareName(name) == 0) n = node; } return n; } @Override public List<DAGEdge> getOutgoingEdges(DAGNode node) { if ( !nodeEdgeMap.containsKey(node) ) return null; return nodeEdgeMap.get(node); } @Override public DAGNode getDestinationNode(DAGEdge edge) { return edgeDestinationMap.get(edge); } @Override public DAGNode getOriginNode(DAGEdge edge) { return edgeOriginMap.get(edge); } @Override public DAGEdge createEdge(String label, String name, DAGNode n1, DAGNode n2) { if (n1 == null) throw new RuntimeException("Null Node (n1)"); if (n2 == null) throw new RuntimeException("Null Node (n2)"); if (label == null) throw new RuntimeException("Null label"); if (name == null) throw new RuntimeException("Null name"); if ( !nodeEdgeMap.containsKey(n1) ) throw new RuntimeException("Node not found: " + n1.name()); if ( !nodeEdgeMap.containsKey(n2) ) throw new RuntimeException("Node not found: " + n2.name()); DAGEdge edge = new DAGEdge(label, name); if ( edgeDestinationMap.containsKey(edge) ) { throw new RuntimeException("Duplicate Edges"); } List<DAGEdge> edges = nodeEdgeMap.get(n1); edges.add(edge); edgeDestinationMap.put(edge, n2); edgeOriginMap.put(edge, n1); return edge; } }