package esl.datastructures.graph.relationgraph; import org.apache.log4j.Logger; import java.util.*; public class RelationGraph implements IRelationGraph { protected List<RelationGraphNode> nodes = new ArrayList<RelationGraphNode>(); private HashMap<RelationGraphNode, List<RelationGraphEdge>> edgeMap = new HashMap<RelationGraphNode, List<RelationGraphEdge>>(); private HashMap<RelationGraphEdge, RelationGraphNode> edgeDestinationMap = new HashMap<RelationGraphEdge, RelationGraphNode>(); private HashMap<RelationGraphEdge, RelationGraphNode> edgeOriginMap = new HashMap<RelationGraphEdge, RelationGraphNode>(); private Logger logger = Logger.getLogger(RelationGraph.class); public RelationGraph() { super(); } @Override public boolean containsClass(String name) { for (RelationGraphNode node: nodes) if (node.compare(name)) return true; return false; } @Override public RelationGraphNode getStartNode() { return null; } @Override public RelationGraphNode createNode(String name) { RelationGraphNode node = new RelationGraphNode(name); nodes.add(node); edgeMap.put(node, new ArrayList<RelationGraphEdge>()); return node; } // String x = ""; @Override public RelationGraphEdge createEdge(String label, RelationGraphNode n1, RelationGraphNode n2) { //TODO: UUID is an expensive trick return createEdge(label, UUID.randomUUID().toString(), n1, n2); // x += "x"; // return createEdge(label, x, n1, n2); } @Override public RelationGraphEdge createEdge(String label, String name, RelationGraphNode n1, RelationGraphNode 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 ( !edgeMap.containsKey(n1) ) throw new RuntimeException("Node not found: " + n1.name()); if ( !edgeMap.containsKey(n2) ) throw new RuntimeException("Node not found: " + n2.name()); RelationGraphEdge edge; edge = new RelationGraphEdge(label, name); if ( edgeDestinationMap.containsKey(edge) ) { throw new RuntimeException("Duplicate Edges"); } List<RelationGraphEdge> edges = edgeMap.get(n1); edges.add(edge); edgeDestinationMap.put(edge, n2); edgeOriginMap.put(edge, n1); return edge; } public List<RelationGraphNode> getNodesOfType(String type) { List<RelationGraphNode> objs = new ArrayList<RelationGraphNode>(); for (RelationGraphNode n: nodes) { List<RelationGraphEdge> edges = edgeMap.get(n); for (RelationGraphEdge edge: edges) { if ( !edge.label().equalsIgnoreCase("type-of") ) continue; if (edgeDestinationMap.containsKey(edge)) { RelationGraphNode dest = edgeDestinationMap.get(edge); if (dest.name().compareTo(type)==0) objs.add(n); } } } return objs; } @Override public RelationGraphNode getNodeByName(String name) { for (RelationGraphNode node: nodes) if (node.compare(name)) return node; return null; } @Override public List<RelationGraphEdge> getOutgoingEdges(RelationGraphNode node) { if ( !edgeMap.containsKey(node) ) return null; return edgeMap.get(node); } @Override public RelationGraphNode getDestinationNode(RelationGraphEdge edge) { return edgeDestinationMap.get(edge); } @Override public RelationGraphNode getOriginNode(RelationGraphEdge edge) { return edgeOriginMap.get(edge); } }