diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java index 083d3b0..1248b73 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java @@ -25,22 +25,28 @@ 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, PushPullValue.PUSH); - } else { - // reverse direction to the data flow - pullCallGraph.addEdge(dstNode, srcNode, PushPullValue.PULL); + for (Edge resToCh: dataFlowGraph.getEdges()) { + if (!((DataFlowEdge) resToCh).isChannelToResource()) { + // A resource to channel edge + PushPullAttribute pushPull = ((PushPullAttribute) ((DataFlowEdge) resToCh).getAttribute()); + ResourceNode srcResNode = (ResourceNode) resToCh.getSource(); + ChannelNode chNode = (ChannelNode) resToCh.getDestination(); + for (Edge chToRes: chNode.getOutEdges()) { + ResourceNode dstResNode = (ResourceNode) chToRes.getDestination(); + if (pushPull.getOptions().get(0) == PushPullValue.PUSH) { + // same direction as the data flow + pushCallGraph.addEdge(srcResNode, dstResNode, PushPullValue.PUSH); + } else { + // reverse direction to the data flow + pullCallGraph.addEdge(dstResNode, srcResNode, PushPullValue.PULL); + } + } } } for (Channel ch: model.getInputChannels()) { - DataTransferChannel cio = (DataTransferChannel) ch; - EventChannelObjectNode srcNode = new EventChannelObjectNode(cio); - for (ChannelMember cm: cio.getChannelMembers()) { + DataTransferChannel evCh = (DataTransferChannel) ch; + EventChannelObjectNode srcNode = new EventChannelObjectNode(evCh); + for (ChannelMember cm: evCh.getChannelMembers()) { if (srcNode.getName() == null) { Expression exp = cm.getStateTransition().getMessageExpression(); if (exp instanceof Term) { @@ -55,7 +61,7 @@ pushCallGraph.addNode(dstResNode); dstNode = pushCallGraph.getStatefulObjectNode(dstResNode); } - // from an I/O channel to a resource + // from an input event channel to a resource pushCallGraph.insertEdge(srcNode, dstNode, PushPullValue.PUSH, 0); } } @@ -64,6 +70,14 @@ public DataFlowGraph getDataFlowGraph() { return dataFlowGraph; } + + public CallGraph getPushCallGraph() { + return pushCallGraph; + } + + public CallGraph getPullCallGraph() { + return pullCallGraph; + } @Override public Map> getAllComponentNodes() {