diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/JavaCodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/JavaCodeGenerator.java index 7675b30..94d3caf 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/JavaCodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/JavaCodeGenerator.java @@ -351,46 +351,41 @@ static private ArrayList determineResourceOrder(ResourceDependencyGraph graph) { ArrayList resources = new ArrayList<>(); + Set visited = new HashSet<>(); for (Node n : graph.getNodes()) { ResourceNode rn = (ResourceNode) n; - boolean flag = true; - for (Edge e : rn.getOutEdges()) { - ResourceDependency re = (ResourceDependency) e; - if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { - flag = false; - } - } - for (Edge e : rn.getInEdges()) { - ResourceDependency re = (ResourceDependency) e; - if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { - flag = false; - } - } - if (flag) - resources.add(rn); - } - List initialResources = (List) resources.clone(); - for (ResourceNode r: initialResources) { - trackNode(r, resources); + topologicalSort(graph, rn, visited, resources); } return resources; } - - static private void trackNode(ResourceNode current, ArrayList resources) { - if (!resources.contains(current)) - resources.add(current); - for (Edge e : current.getOutEdges()) { - ResourceDependency re = (ResourceDependency) e; - if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { - trackNode((ResourceNode) re.getDestination(), resources); - } - } - for (Edge e : current.getInEdges()) { + + static private void topologicalSort(ResourceDependencyGraph graph, ResourceNode curNode, Set visited, List orderedList) { + if (visited.contains(curNode)) return; + visited.add(curNode); + for (Edge e : curNode.getInEdges()) { ResourceDependency re = (ResourceDependency) e; if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { - trackNode((ResourceNode) re.getSource(), resources); + topologicalSort(graph, (ResourceNode) re.getSource(), visited, orderedList); } } + for (Edge e : curNode.getOutEdges()) { + ResourceDependency re = (ResourceDependency) e; + if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { + topologicalSort(graph, (ResourceNode) re.getDestination(), visited, orderedList); + } + } + for (Node n: graph.getNodes()) { // for reference resources. + ResourceNode rn = (ResourceNode) n; + for (Edge e : rn.getInEdges()) { + ResourceDependency re = (ResourceDependency) e; + for (ChannelMember m: re.getChannelGenerator().getReferenceChannelMembers()) { + if (m.getIdentifierTemplate() == curNode.getIdentifierTemplate()) { + topologicalSort(graph, rn, visited, orderedList); + } + } + } + } + orderedList.add(0, curNode); } private static MethodDeclaration getMethod(TypeDeclaration type, String methodName) {