package tools.argumentTainter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import neo4j.readWriteDB.Neo4JDBInterface;
import neo4j.traversals.readWriteDB.Traversals;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.DynamicRelationshipType;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.RelationshipType;
import databaseNodes.EdgeTypes;
import ddg.DDGCreator;
import ddg.DataDependenceGraph.DDG;
import ddg.DataDependenceGraph.DDGDifference;
import ddg.DataDependenceGraph.DefUseRelation;
import ddg.DefUseCFG.DefUseCFG;
public class DDGPatcher
{
DDGDifference diff;
public void patchDDG(DefUseCFG defUseCFG, Long funcId)
{
Node node = Neo4JDBInterface.getNodeById(funcId);
DDG oldDDG = Traversals.getDDGForFunction(node);
DDGCreator ddgCreator = new DDGCreator();
DDG newDDG = ddgCreator.createForDefUseCFG(defUseCFG);
diff = oldDDG.difference(newDDG);
}
public void writeChangesToDatabase()
{
removeOldEdges(diff);
addNewEdges(diff);
}
private void addNewEdges(DDGDifference diff)
{
List<DefUseRelation> relsToAdd = diff.getRelsToAdd();
for (DefUseRelation rel : relsToAdd)
{
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("var", rel.symbol);
RelationshipType relType = DynamicRelationshipType
.withName(EdgeTypes.REACHES);
Neo4JDBInterface.addRelationship((Long) rel.src, (Long) rel.dst,
relType, properties);
}
}
private void removeOldEdges(DDGDifference diff)
{
List<DefUseRelation> relsToRemove = diff.getRelsToRemove();
for (DefUseRelation rel : relsToRemove)
{
Node srcStatement = Neo4JDBInterface.getNodeById((Long) rel.src);
Iterable<Relationship> rels = srcStatement
.getRelationships(Direction.OUTGOING);
for (Relationship reachRel : rels)
{
if (!reachRel.getType().toString().equals(EdgeTypes.REACHES))
continue;
if (reachRel.getEndNode().getId() != (Long) rel.dst)
continue;
Object var = reachRel.getProperty("var");
if (var == null || !var.toString().equals(rel.symbol))
continue;
Neo4JDBInterface.removeEdge(reachRel.getId());
break;
}
}
}
}