package outputModules.neo4j.importers; import neo4j.batchInserter.GraphNodeStore; import neo4j.batchInserter.Neo4JBatchInserter; import org.neo4j.graphdb.DynamicRelationshipType; import org.neo4j.graphdb.RelationshipType; import cdg.CDG; import cdg.CDGEdge; import cdg.DominatorTree; import cfg.nodes.ASTNodeContainer; import cfg.nodes.CFGNode; import databaseNodes.EdgeTypes; public class CDGImporter { GraphNodeStore nodeStore; public CDGImporter(GraphNodeStore nodeStore) { this.nodeStore = nodeStore; } public void addCDGToDatabase(CDG cdg) { RelationshipType rel; // Add post dominator edges DominatorTree<CFGNode> dominatorTree = cdg.getDominatorTree(); rel = DynamicRelationshipType.withName(EdgeTypes.POST_DOM); for (CFGNode vertex : dominatorTree.getVertices()) { CFGNode dominator = dominatorTree.getDominator(vertex); Neo4JBatchInserter.addRelationship(getId(dominator), getId(vertex), rel, null); } // Add control edges rel = DynamicRelationshipType.withName(EdgeTypes.CONTROLS); for (CFGNode src : cdg.getVertices()) { for (CDGEdge edge : cdg.outgoingEdges(src)) { CFGNode dst = edge.getDestination(); if (!src.equals(dst)) { Neo4JBatchInserter.addRelationship(getId(src), getId(dst), rel, null); } } } } private long getId(CFGNode node) { if (node instanceof ASTNodeContainer) { return nodeStore.getIdForObject(((ASTNodeContainer) node) .getASTNode()); } else { return nodeStore.getIdForObject(node); } } }