diff --git a/AlgebraicDataflowArchitectureModel/src/algorithm/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithm/CodeGenerator.java index 56a18ff..b6ae64d 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithm/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithm/CodeGenerator.java @@ -1,6 +1,7 @@ package algorithm; import java.util.ArrayList; +import java.util.HashSet; import models.*; import models.algebra.Expression; @@ -22,6 +23,7 @@ public class CodeGenerator { static public ArrayList doGenerate(ResourceDependencyGraph graph) { ArrayList codes = new ArrayList<>(); + ArrayList resources = StoreResourceCheck(graph); IResourceStateAccessor pushAccessor = new IResourceStateAccessor() { @Override public Expression getCurrentStateAccessorFor(IdentifierTemplate target, IdentifierTemplate from) { @@ -52,8 +54,9 @@ return getter; } }; + codes.add("public class Main {"); - for (Node n : graph.getNodes()) { + for (ResourceNode n : resources) { ResourceNode resource = (ResourceNode) n; String str = "\t" + "private " + resource.getIdentifierTemplate().getResourceName().substring(0, 1).toUpperCase() @@ -195,4 +198,43 @@ } return codes; } + + static private ArrayList StoreResourceCheck(ResourceDependencyGraph graph) { + ArrayList resources = new ArrayList<>(); + 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); + } + return resources; + } + + static private ArrayList trackNode(ResourceNode rn) { + ArrayList resources = new ArrayList<>(); + for(Edge e:rn.getOutEdges()) { + ResourceDependency re = (ResourceDependency) e; + if(((PushPullAttribute)re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { + return trackNode((ResourceNode) re.getDestination()); + } + } + for(Edge e:rn.getInEdges()) { + ResourceDependency re = (ResourceDependency) e; + if(((PushPullAttribute)re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { + return trackNode((ResourceNode) re.getSource()); + } + } + return resources; + } }