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; } }