package models.controlFlowModel;
import models.Edge;
import models.dataFlowModel.DataFlowEdge;
import models.dataFlowModel.DataFlowGraph;
import models.dataFlowModel.PushPullAttribute;
import models.dataFlowModel.PushPullValue;
import models.dataFlowModel.ResourceNode;
public class ControlFlowGraph {
private DataFlowGraph dataFlowGraph;
private CallGraph pushCallGraph;
private CallGraph pullCallGraph;
public ControlFlowGraph(DataFlowGraph dataFlowGraph) {
this.dataFlowGraph = dataFlowGraph;
this.pushCallGraph = new CallGraph();
this.pullCallGraph = new CallGraph();
for (Edge e: dataFlowGraph.getEdges()) {
PushPullAttribute pushPull = ((PushPullAttribute) ((DataFlowEdge) e).getAttribute());
ResourceNode srcNode = (ResourceNode) e.getSource();
ResourceNode dstNode = (ResourceNode) e.getDestination();
if (pushPull.getOptions().get(0) == PushPullValue.PUSH) {
// same direction as the data flow
pushCallGraph.addEdge(srcNode, dstNode);
} else {
// reverse direction to the data flow
pullCallGraph.addEdge(dstNode, srcNode);
}
}
}
public ControlFlowGraph(DataFlowGraph dataFlowGraph, PushPullValue priority) {
this.dataFlowGraph = dataFlowGraph;
this.pushCallGraph = new CallGraph();
this.pullCallGraph = new CallGraph();
if (priority == PushPullValue.PUSH) {
// push-first
for (Edge e: dataFlowGraph.getEdges()) {
ResourceNode srcNode = (ResourceNode) e.getSource();
ResourceNode dstNode = (ResourceNode) e.getDestination();
// same direction as the data flow
pushCallGraph.addEdge(srcNode, dstNode);
}
} else {
// pull-first
for (Edge e: dataFlowGraph.getEdges()) {
ResourceNode srcNode = (ResourceNode) e.getSource();
ResourceNode dstNode = (ResourceNode) e.getDestination();
PushPullAttribute pushPull = ((PushPullAttribute) ((DataFlowEdge) e).getAttribute());
if (pushPull.getOptions().contains(PushPullValue.PULL)) {
// Pull style is selectable
// reverse direction to the data flow
pullCallGraph.addEdge(dstNode, srcNode);
} else {
// Pull style is not selectable
// same direction as the data flow
pushCallGraph.addEdge(srcNode, dstNode);
}
}
}
}
public DataFlowGraph getDataFlowGraph() {
return dataFlowGraph;
}
public CallGraph getPushCallGraph() {
return pushCallGraph;
}
public CallGraph getPullCallGraph() {
return pullCallGraph;
}
}