package models.controlFlowModel;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import models.DirectedGraph;
import models.Node;
import models.dataFlowModel.PushPullValue;
import models.dataFlowModel.ResourceNode;
public class CallGraph extends DirectedGraph {
protected Map<ResourceNode, StatefulObjectNode> statefulObjMap = null;
public CallGraph() {
statefulObjMap = new HashMap<>();
}
public void addNode(Node node) {
if (node instanceof ResourceNode) {
ResourceNode resNode = (ResourceNode) node;
StatefulObjectNode objNode = statefulObjMap.get(resNode);
if (objNode == null) {
objNode = new StatefulObjectNode(resNode);
statefulObjMap.put(resNode, objNode);
super.addNode(objNode);
}
} else if (node instanceof StatefulObjectNode) {
StatefulObjectNode objNode = (StatefulObjectNode) node;
if (statefulObjMap.get(objNode.getResource()) == null) {
statefulObjMap.put(objNode.getResource(), objNode);
super.addNode(objNode);
}
} else {
super.addNode(node);
}
}
public void addEdge(ResourceNode srcResNode, ResourceNode dstResNode, PushPullValue selectedOption) {
addNode(srcResNode);
addNode(dstResNode);
addEdge(new CallEdge(getStatefulObjectNode(srcResNode), getStatefulObjectNode(dstResNode), selectedOption));
}
public void insertEdge(ObjectNode srcObjNode, ObjectNode dstObjNode, PushPullValue selectedOption, int n) {
CallEdge edge = new CallEdge(srcObjNode, dstObjNode, selectedOption);
simpleAddEdge(edge);
addNode(srcObjNode);
addNode(dstObjNode);
srcObjNode.insertOutEdge(edge, n);
dstObjNode.addInEdge(edge);
}
public StatefulObjectNode getStatefulObjectNode(ResourceNode resNode) {
return statefulObjMap.get(resNode);
}
public Set<Node> getRootNodes() {
Set<Node> roots = new HashSet<>(getNodes());
for (Node n: getNodes()) {
roots.removeAll(n.getSuccessors());
}
return roots;
}
}