diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java index 3a5da26..ff8a2b0 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java @@ -3,7 +3,9 @@ import java.util.ArrayList; import code.ast.Block; +import code.ast.CompilationUnit; import code.ast.FieldDeclaration; +import code.ast.ImportDeclaration; import code.ast.MethodDeclaration; import code.ast.TypeDeclaration; import code.ast.VariableDeclaration; @@ -30,12 +32,29 @@ public class CodeGenerator { public static final Type typeVoid = new Type("Void", "void"); + private static String defaultMainTypeName = "Main"; + static String mainTypeName = defaultMainTypeName; - static public ArrayList doGenerate(ResourceDependencyGraph graph, DataFlowModel model) { - ArrayList codes = new ArrayList<>(); + public static String getMainTypeName() { + return mainTypeName; + } + + public static void setMainTypeName(String mainTypeName) { + CodeGenerator.mainTypeName = mainTypeName; + } + + public static void resetMainTypeName() { + CodeGenerator.mainTypeName = defaultMainTypeName; + } + + static public ArrayList doGenerate(ResourceDependencyGraph graph, DataFlowModel model) { + ArrayList codes = new ArrayList<>(); ArrayList resources = StoreResourceCheck(graph); - - codes.add(new TypeDeclaration("Main")); + + TypeDeclaration mainType = new TypeDeclaration(mainTypeName); + CompilationUnit mainCU = new CompilationUnit(mainType); + mainCU.addImport(new ImportDeclaration("java.util.*")); + codes.add(mainCU); for (ResourceNode rn : resources) { boolean f = false; String name = rn.getIdentifierTemplate().getResourceName().substring(0, 1).toUpperCase() @@ -64,7 +83,7 @@ if (rn.getIndegree() > 1) type.addField(new FieldDeclaration( ((ResourceNode) re.getSource()).getIdentifierTemplate().getResourceStateType(), - rename)); + ((ResourceNode) re.getSource()).getIdentifierTemplate().getResourceName())); } } if (f) @@ -72,7 +91,7 @@ consstr += ")"; FieldDeclaration field = new FieldDeclaration(new Type(name, name), rn.getIdentifierTemplate().getResourceName(), consstr); - codes.get(0).addField(field); + mainType.addField(field); MethodDeclaration cons = new MethodDeclaration(name, true); Block block = new Block(); for (Edge e : rn.getOutEdges()) { @@ -126,7 +145,7 @@ io = new MethodDeclaration( ((Term) cm.getStateTransition().getMessageExpression()).getSymbol().getImplName(), false, typeVoid, params); - codes.get(0).addMethod(io); + mainType.addMethod(io); } } } @@ -141,7 +160,9 @@ } type.addMethod(new MethodDeclaration("get" + type.getTypeName(), rn.getIdentifierTemplate().getResourceStateType())); - codes.add(type); + CompilationUnit cu = new CompilationUnit(type); + cu.addImport(new ImportDeclaration("java.util.*")); + codes.add(cu); } for (Node n : graph.getNodes()) { ResourceNode rn = (ResourceNode) n; @@ -152,7 +173,7 @@ get.setBody(new Block()); get.getBody().addStatement( "return " + rn.getIdentifierTemplate().getResourceName() + "." + get.getName() + "();"); - codes.get(0).addMethod(get); + mainType.addMethod(get); } return codes; } @@ -162,7 +183,7 @@ for (TypeDeclaration type : codeTree) { codes.add("public class " + type.getTypeName() + "{"); for (FieldDeclaration field : type.getFields()) { - if (type.getTypeName() != "Main") { + if (type.getTypeName() != mainTypeName) { String cons = "\t" + "private " + field.getType().getImplementationTypeName() + " " + field.getName(); if (field.getType().equals(DataConstraintModel.typeList)) @@ -187,7 +208,7 @@ } } codes.add(""); - if (type.getTypeName() != "Main") { + if (type.getTypeName() != mainTypeName) { if (!type.getConstructors().isEmpty()) { String cons = "\t" + "public " + type.getTypeName() + "("; for (VariableDeclaration constructor : type.getConstructors()) { diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/DataStorageDecision.java b/AlgebraicDataflowArchitectureModel/src/algorithms/DataStorageDecision.java deleted file mode 100644 index 1172a88..0000000 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/DataStorageDecision.java +++ /dev/null @@ -1,67 +0,0 @@ -package algorithms; - -import java.util.HashSet; - -import models.*; -import models.algebra.*; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; -import models.dataFlowModel.*; - -public class DataStorageDecision { - static private HashSet arrivedNode = new HashSet<>(); - - static public void run(ResourceDependencyGraph graph) { - arrivedNode.clear(); - for (Node n : graph.getNodes()) { - ResourceNode resource = (ResourceNode) n; - trackNode(resource); - } - } - - static private void trackNode(ResourceNode resource) { - if (arrivedNode.contains(resource)) - return; - arrivedNode.add(resource); - boolean flag = false; - for (Edge e : resource.getInEdges()) { - if (((PushPullAttribute) e.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { - trackNode((ResourceNode) e.getSource()); - flag = true; - } - } - if (resource.getInEdges().size() == 0) - flag = true; - ((StoreAttribute) resource.getAttribute()).setStored(flag); - if (resource.getIdentifierTemplate().getResourceStateType() == null) { - for (Edge e : resource.getInEdges()) { - for (ChannelMember cm : ((ResourceDependency) e).getChannelGenerator().getChannelMembers()) { - if (((PushPullAttribute) ((ResourceDependency) e).getAttribute()).getOptions() - .get(0) == PushPullValue.PUSH - && cm.getStateTransition().getNextStateExpression().getClass() == Term.class) { - if (((Term) cm.getStateTransition().getNextStateExpression()).getSymbol().getName() - .equals("cons")) { - resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeList); - } - } - break; - } - } - for (Edge e : resource.getOutEdges()) { - for (ChannelMember cm : ((ResourceDependency) e).getChannelGenerator().getChannelMembers()) { - if (((PushPullAttribute) ((ResourceDependency) e).getAttribute()).getOptions() - .get(0) != PushPullValue.PUSH - && cm.getStateTransition().getNextStateExpression().getClass() == Term.class) { - if (((Term) cm.getStateTransition().getNextStateExpression()).getSymbol().getName() - .equals("cons")) { - resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeList); - } - } - break; - } - } - if (resource.getIdentifierTemplate().getResourceStateType() == null) - resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeInt); - } - } -} diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/DataStorageNecessity.java b/AlgebraicDataflowArchitectureModel/src/algorithms/DataStorageNecessity.java deleted file mode 100644 index f516910..0000000 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/DataStorageNecessity.java +++ /dev/null @@ -1,46 +0,0 @@ -package algorithms; - -import models.*; -import models.algebra.*; -import models.dataConstraintModel.*; -import models.dataFlowModel.*; - -public class DataStorageNecessity { - static public ResourceDependencyGraph run(DataFlowModel model) { - ResourceDependencyGraph graph = model.getResourceDependencyGraph(); - DataConstraintModel dcmodel = (DataConstraintModel) model; - for (ChannelGenerator generator : dcmodel.getChannelGenerators()) { - boolean flag = false; - for (ChannelMember member : ((DataflowChannelGenerator) generator).getOutputChannelMembers()) { - Expression curexp = member.getStateTransition().getCurStateExpression(); - Expression nextexp = member.getStateTransition().getNextStateExpression(); - for (Position pos : curexp.getVariables().keySet()) { - if (nextexp.contains(curexp.getVariables().get(pos))) { - flag = true; - } - } - } - for (Node node : graph.getNodes()) { - for (ChannelMember member : generator.getChannelMembers()) { - if (((ResourceNode) node).getIdentifierTemplate().equals(member.getIdentifierTemplate())) { - setStoreAttribute(flag, (ResourceNode) node); - } - } - } - } - for (Node node : graph.getNodes()) { - if (((ResourceNode) node).getPredecessors().size() > 1) { - setStoreAttribute(true, (ResourceNode) node); - } else if (((ResourceNode) node).getAttribute() == null) { - setStoreAttribute(false, (ResourceNode) node); - } - } - return graph; - } - - static private void setStoreAttribute(boolean flag, ResourceNode node) { - StoreAttribute store = new StoreAttribute(); - store.setNeeded(flag); - node.setAttribute(store); - } -} diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/EdgeTransitionSelectable.java b/AlgebraicDataflowArchitectureModel/src/algorithms/EdgeTransitionSelectable.java deleted file mode 100644 index d86cbad..0000000 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/EdgeTransitionSelectable.java +++ /dev/null @@ -1,31 +0,0 @@ -package algorithms; - -import models.*; -import models.dataFlowModel.*; - -public class EdgeTransitionSelectable { - static public void run(ResourceDependencyGraph graph) { - PushPullAttribute ppat = new PushPullAttribute(); - ppat.addOption(PushPullValue.PUSHorPULL); - ppat.addOption(PushPullValue.PUSH); - ppat.addOption(PushPullValue.PULL); - for (Node n : graph.getNodes()) { - if (((StoreAttribute) ((ResourceNode) n).getAttribute()).isNeeded()) { - trackEdges(n); - } - } - for (Edge e : graph.getEdges()) { - if (((ResourceDependency) e).getAttribute() == null) { - ((ResourceDependency) e).setAttribute(ppat); - } - } - } - - static private void trackEdges(Node n) { - PushPullAttribute ppat = new PushPullAttribute(); - ppat.addOption(PushPullValue.PUSH); - for (Edge e : ((ResourceNode) n).getInEdges()) { - ((ResourceDependency) e).setAttribute(ppat); - } - } -} diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/FinalDecisionOfStoringResourceStates.java b/AlgebraicDataflowArchitectureModel/src/algorithms/FinalDecisionOfStoringResourceStates.java new file mode 100644 index 0000000..999e9c1 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/FinalDecisionOfStoringResourceStates.java @@ -0,0 +1,67 @@ +package algorithms; + +import java.util.HashSet; + +import models.*; +import models.algebra.*; +import models.dataConstraintModel.ChannelMember; +import models.dataConstraintModel.DataConstraintModel; +import models.dataFlowModel.*; + +public class FinalDecisionOfStoringResourceStates { + static private HashSet arrivedNode = new HashSet<>(); + + static public void doDecide(ResourceDependencyGraph graph) { + arrivedNode.clear(); + for (Node n : graph.getNodes()) { + ResourceNode resource = (ResourceNode) n; + trackNode(resource); + } + } + + static private void trackNode(ResourceNode resource) { + if (arrivedNode.contains(resource)) + return; + arrivedNode.add(resource); + boolean flag = false; + for (Edge e : resource.getInEdges()) { + if (((PushPullAttribute) e.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { + trackNode((ResourceNode) e.getSource()); + flag = true; + } + } + if (resource.getInEdges().size() == 0) + flag = true; + ((StoreAttribute) resource.getAttribute()).setStored(flag); + if (resource.getIdentifierTemplate().getResourceStateType() == null) { + for (Edge e : resource.getInEdges()) { + for (ChannelMember cm : ((ResourceDependency) e).getChannelGenerator().getChannelMembers()) { + if (((PushPullAttribute) ((ResourceDependency) e).getAttribute()).getOptions() + .get(0) == PushPullValue.PUSH + && cm.getStateTransition().getNextStateExpression().getClass() == Term.class) { + if (((Term) cm.getStateTransition().getNextStateExpression()).getSymbol().getName() + .equals("cons")) { + resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeList); + } + } + break; + } + } + for (Edge e : resource.getOutEdges()) { + for (ChannelMember cm : ((ResourceDependency) e).getChannelGenerator().getChannelMembers()) { + if (((PushPullAttribute) ((ResourceDependency) e).getAttribute()).getOptions() + .get(0) != PushPullValue.PUSH + && cm.getStateTransition().getNextStateExpression().getClass() == Term.class) { + if (((Term) cm.getStateTransition().getNextStateExpression()).getSymbol().getName() + .equals("cons")) { + resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeList); + } + } + break; + } + } + if (resource.getIdentifierTemplate().getResourceStateType() == null) + resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeInt); + } + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java index 89844c7..01fd6c4 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; +import code.ast.CompilationUnit; import code.ast.MethodDeclaration; import code.ast.TypeDeclaration; import models.Edge; @@ -28,7 +29,7 @@ import models.dataFlowModel.StoreAttribute; public class MethodBodyGenerator { - public static ArrayList doGenerate(ResourceDependencyGraph graph, DataFlowModel model, ArrayList types) { + public static ArrayList doGenerate(ResourceDependencyGraph graph, DataFlowModel model, ArrayList codes) { Symbol floor = model.getSymbol("floor"); Symbol.Memento floorMem = null; if (floor != null) { @@ -46,8 +47,10 @@ // Create a map from type names (lower case) to their types. Map typeMap = new HashMap<>(); - for (TypeDeclaration type: types) { - typeMap.put(type.getTypeName().substring(0,1).toLowerCase() + type.getTypeName().substring(1), type); + for (CompilationUnit code: codes) { + for (TypeDeclaration type: code.types()) { + typeMap.put(type.getTypeName().substring(0,1).toLowerCase() + type.getTypeName().substring(1), type); + } } // Generate the body of each update or getter method. @@ -63,7 +66,7 @@ TypeDeclaration dstType = typeMap.get(dstResourceName); for (ChannelMember out: d.getChannelGenerator().getOutputChannelMembers()) { if (out.getIdentifierTemplate() == dst.getIdentifierTemplate()) { - if (pushPull.getOptions().get(0) == PushPullValue.PUSH) { + if (pushPull.getOptions().get(0) == PushPullValue.PUSH && srcType != null) { // for push data transfer MethodDeclaration update = getUpdateMethod(dstType, srcType); if (((StoreAttribute) dst.getAttribute()).isStored()) { @@ -109,24 +112,27 @@ } } // for source nodes - TypeDeclaration mainType = typeMap.get("main"); + String mainTypeName = CodeGenerator.mainTypeName.substring(0,1).toLowerCase() + CodeGenerator.mainTypeName.substring(1); + TypeDeclaration mainType = typeMap.get(mainTypeName); for (Node n: graph.getNodes()) { ResourceNode resource = (ResourceNode) n; String resourceName = resource.getIdentifierTemplate().getResourceName(); TypeDeclaration type = typeMap.get(resourceName); - // getter method - MethodDeclaration getter = getGetterMethod(type); - if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) { - getter.addStatement("return " + resource.getIdentifierTemplate().getResourceName() + ";"); - } - // methods for input events - MethodDeclaration input = getInputMethod(type, resource, model); - if (input != null) { - input.addFirstStatement("this." + resourceName + " = " + resourceName + ";"); - if (mainType != null) { - MethodDeclaration mainInput = getMethod(mainType, input.getName()); - if (mainInput != null) { - mainInput.addStatement("this." + resourceName + "." + input.getName() + "(" + resourceName + ");"); + if (type != null) { + // getter method + MethodDeclaration getter = getGetterMethod(type); + if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) { + getter.addStatement("return " + resource.getIdentifierTemplate().getResourceName() + ";"); + } + // methods for input events + MethodDeclaration input = getInputMethod(type, resource, model); + if (input != null) { + input.addFirstStatement("this." + resourceName + " = " + resourceName + ";"); + if (mainType != null) { + MethodDeclaration mainInput = getMethod(mainType, input.getName()); + if (mainInput != null) { + mainInput.addStatement("this." + resourceName + "." + input.getName() + "(" + resourceName + ");"); + } } } } @@ -138,7 +144,7 @@ if (floor != null) floor.setMemento(floorMem); if (sum != null) sum.setMemento(sumMem); - return types; + return codes; } private static MethodDeclaration getUpdateMethod(TypeDeclaration type, TypeDeclaration from) { diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/NecessityOfStoringResourceStates.java b/AlgebraicDataflowArchitectureModel/src/algorithms/NecessityOfStoringResourceStates.java new file mode 100644 index 0000000..763e0f5 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/NecessityOfStoringResourceStates.java @@ -0,0 +1,46 @@ +package algorithms; + +import models.*; +import models.algebra.*; +import models.dataConstraintModel.*; +import models.dataFlowModel.*; + +public class NecessityOfStoringResourceStates { + static public ResourceDependencyGraph doDecide(DataFlowModel model) { + ResourceDependencyGraph graph = model.getResourceDependencyGraph(); + DataConstraintModel dcmodel = (DataConstraintModel) model; + for (ChannelGenerator generator : dcmodel.getChannelGenerators()) { + boolean flag = false; + for (ChannelMember member : ((DataflowChannelGenerator) generator).getOutputChannelMembers()) { + Expression curexp = member.getStateTransition().getCurStateExpression(); + Expression nextexp = member.getStateTransition().getNextStateExpression(); + for (Position pos : curexp.getVariables().keySet()) { + if (nextexp.contains(curexp.getVariables().get(pos))) { + flag = true; + } + } + } + for (Node node : graph.getNodes()) { + for (ChannelMember member : generator.getChannelMembers()) { + if (((ResourceNode) node).getIdentifierTemplate().equals(member.getIdentifierTemplate())) { + setStoreAttribute(flag, (ResourceNode) node); + } + } + } + } + for (Node node : graph.getNodes()) { + if (((ResourceNode) node).getPredecessors().size() > 1) { + setStoreAttribute(true, (ResourceNode) node); + } else if (((ResourceNode) node).getAttribute() == null) { + setStoreAttribute(false, (ResourceNode) node); + } + } + return graph; + } + + static private void setStoreAttribute(boolean flag, ResourceNode node) { + StoreAttribute store = new StoreAttribute(); + store.setNeeded(flag); + node.setAttribute(store); + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/SelectableDataTransfers.java b/AlgebraicDataflowArchitectureModel/src/algorithms/SelectableDataTransfers.java new file mode 100644 index 0000000..7975e57 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/SelectableDataTransfers.java @@ -0,0 +1,32 @@ +package algorithms; + +import models.*; +import models.dataFlowModel.*; + +public class SelectableDataTransfers { + static public ResourceDependencyGraph init(ResourceDependencyGraph graph) { + PushPullAttribute ppat = new PushPullAttribute(); + ppat.addOption(PushPullValue.PUSHorPULL); + ppat.addOption(PushPullValue.PUSH); + ppat.addOption(PushPullValue.PULL); + for (Node n : graph.getNodes()) { + if (((StoreAttribute) ((ResourceNode) n).getAttribute()).isNeeded()) { + trackEdges(n); + } + } + for (Edge e : graph.getEdges()) { + if (((ResourceDependency) e).getAttribute() == null) { + ((ResourceDependency) e).setAttribute(ppat); + } + } + return graph; + } + + static private void trackEdges(Node n) { + PushPullAttribute ppat = new PushPullAttribute(); + ppat.addOption(PushPullValue.PUSH); + for (Edge e : ((ResourceNode) n).getInEdges()) { + ((ResourceDependency) e).setAttribute(ppat); + } + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java b/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java new file mode 100644 index 0000000..5e66684 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java @@ -0,0 +1,47 @@ +package code.ast; + +import java.util.ArrayList; +import java.util.List; + +public class CompilationUnit extends ASTNode { + private String fileName = null; + private List imports = new ArrayList<>(); + private List types = new ArrayList<>(); + + public CompilationUnit(TypeDeclaration type) { + types.add(type); + fileName = type.getTypeName() + ".java"; + } + + public List imports() { + return imports; + } + + public List types() { + return types; + } + + public void addImport(ImportDeclaration imp) { + imports.add(imp); + } + + public void addType(TypeDeclaration type) { + types.add(type); + } + + public String getFileName() { + return fileName; + } + + public String toString() { + String result = ""; + for (ImportDeclaration imp: imports) { + result += imp.toString(); + } + result +="\n"; + for (TypeDeclaration type: types) { + result += type.toString(); + } + return result; + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/ImportDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/ImportDeclaration.java new file mode 100644 index 0000000..9135d68 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ImportDeclaration.java @@ -0,0 +1,21 @@ +package code.ast; + +public class ImportDeclaration { + private String name; + + public ImportDeclaration(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String toString() { + return "import " + name + ";\n"; + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/TypeDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/TypeDeclaration.java index 77405c5..153a47a 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/TypeDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/TypeDeclaration.java @@ -55,7 +55,7 @@ } public String toString() { - String code = "public class " + typeName + "�@{\n"; + String code = "public class " + typeName + " {\n"; for (FieldDeclaration f: fields) { code += "\t" + f.toString(); } diff --git a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/OpenAction.java b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/OpenAction.java index 4705a19..e018590 100644 --- a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/OpenAction.java +++ b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/OpenAction.java @@ -41,7 +41,7 @@ } }; fc.addChoosableFileFilter(defaultFilter); - int rc = fc.showDialog(null, "Open File"); + int rc = fc.showDialog(null, "Open Model File"); if (rc == JFileChooser.APPROVE_OPTION) { lastDir = fc.getSelectedFile().getParent(); editor.open(fc.getSelectedFile()); diff --git a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/PrototypeGenerateAction.java b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/PrototypeGenerateAction.java index 905c600..177b16f 100644 --- a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/PrototypeGenerateAction.java +++ b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/PrototypeGenerateAction.java @@ -1,10 +1,19 @@ package graphicalrefactor.actions; import java.awt.event.ActionEvent; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +import javax.swing.JFileChooser; import algorithms.*; import code.ast.*; import graphicalrefactor.editor.Editor; +import models.dataConstraintModel.IdentifierTemplate; import models.dataFlowModel.DataFlowModel; import models.dataFlowModel.ResourceDependencyGraph; @@ -14,18 +23,56 @@ */ private static final long serialVersionUID = -3694103632055735068L; + private String lastDir = null; + public PrototypeGenerateAction(Editor editor) { super("Generate Prototype", editor); } @Override public void actionPerformed(ActionEvent e) { - ResourceDependencyGraph graph = editor.getResourceGraph(); + ResourceDependencyGraph graph = editor.getResourceDependencyGraph(); DataFlowModel model = editor.getModel(); - DataStorageDecision.run(graph); + FinalDecisionOfStoringResourceStates.doDecide(graph); + String fileName = editor.getCurFileName(); + String mainTypeName = fileName.split("\\.")[0]; + boolean exist = false; + for (IdentifierTemplate id: model.getIdentifierTemplates()) { + String resourceName = id.getResourceName().substring(0, 1).toUpperCase() + id.getResourceName().substring(1); + if (mainTypeName.equals(resourceName)) { + exist = true; + } + } + if (!exist) { + CodeGenerator.setMainTypeName(mainTypeName); // use model's file name as the main type's name. + } else { + CodeGenerator.resetMainTypeName(); // use the default main type's name. + } editor.setCodes(MethodBodyGenerator.doGenerate(graph, model, CodeGenerator.doGenerate(graph, model))); - for (TypeDeclaration type : editor.getCodes()) { - System.out.println(type); + for (CompilationUnit file : editor.getCodes()) { + System.out.println(file); + } + + String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); + JFileChooser fc = new JFileChooser(wd); + fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + int rc = fc.showSaveDialog(null); + if (rc == JFileChooser.APPROVE_OPTION) { + lastDir = fc.getSelectedFile().getPath(); + for (CompilationUnit cu : editor.getCodes()) { + save(fc.getSelectedFile(), cu); + } + } + } + + private void save(File dir, CompilationUnit cu) { + File javaFile = new File(dir.getPath(), cu.getFileName()); + try { + BufferedWriter writer = new BufferedWriter(new FileWriter(javaFile)); + writer.write(cu.toString()); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); } } diff --git a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/editor/Editor.java b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/editor/Editor.java index e68f321..568a13a 100644 --- a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/editor/Editor.java +++ b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/editor/Editor.java @@ -9,25 +9,20 @@ import com.mxgraph.layout.mxCircleLayout; import com.mxgraph.layout.mxCompactTreeLayout; -import com.mxgraph.layout.mxParallelEdgeLayout; -import com.mxgraph.layout.mxPartitionLayout; -import com.mxgraph.layout.mxStackLayout; import com.mxgraph.model.mxCell; import com.mxgraph.model.mxGeometry; import com.mxgraph.model.mxGraphModel; import com.mxgraph.util.mxPoint; import com.mxgraph.view.mxGraph; -import algorithms.DataStorageNecessity; -import algorithms.EdgeTransitionSelectable; +import algorithms.NecessityOfStoringResourceStates; +import algorithms.SelectableDataTransfers; import algorithms.UpdateConflictCheck; -import code.ast.TypeDeclaration; +import code.ast.CompilationUnit; import models.Edge; import models.Node; import models.dataFlowModel.DataFlowModel; import models.dataFlowModel.DataflowChannelGenerator; -import models.dataFlowModel.PushPullAttribute; -import models.dataFlowModel.PushPullValue; import models.dataFlowModel.ResourceDependency; import models.dataFlowModel.ResourceDependencyGraph; import models.dataFlowModel.ResourceNode; @@ -48,10 +43,10 @@ final int PORT_RADIUS = PORT_DIAMETER / 2; private mxGraph graph = null; + private String curFileName = null; private DataFlowModel model = null; - private ResourceDependencyGraph resourceGraph = null; - - private ArrayList codes = null; + private ResourceDependencyGraph resourceDependencyGraph = null; + private ArrayList codes = null; public Editor(mxGraph graph) { this.graph = graph; @@ -73,29 +68,36 @@ this.model = model; } - public ResourceDependencyGraph getResourceGraph() { - return resourceGraph; + public ResourceDependencyGraph getResourceDependencyGraph() { + return resourceDependencyGraph; } - public void setResourceGraph(ResourceDependencyGraph resourceGraph) { - this.resourceGraph = resourceGraph; + public void setResourceDependencyGraph(ResourceDependencyGraph resourceDependencyGraph) { + this.resourceDependencyGraph = resourceDependencyGraph; } - public ArrayList getCodes() { + public ArrayList getCodes() { return codes; } - public void setCodes(ArrayList codes) { + public void setCodes(ArrayList codes) { this.codes = codes; } + public String getCurFileName() { + return curFileName; + } + public DataFlowModel open(File file) { try { Parser parser = new Parser(new BufferedReader(new FileReader(file))); try { model = parser.doParse(); + curFileName = file.getName(); if(!UpdateConflictCheck.run(model)) return null; - graph = constructGraph(model); + ResourceDependencyGraph resourceGraph = NecessityOfStoringResourceStates.doDecide(model); + resourceDependencyGraph = SelectableDataTransfers.init(resourceGraph); + graph = constructGraph(model, resourceDependencyGraph); return model; } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutKeyword | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression @@ -108,10 +110,7 @@ return null; } - public mxGraph constructGraph(DataFlowModel model) { - ResourceDependencyGraph resourceDependencyGraph = DataStorageNecessity.run(model); - EdgeTransitionSelectable.run(resourceDependencyGraph); - + public mxGraph constructGraph(DataFlowModel model, ResourceDependencyGraph resourceDependencyGraph) { ((mxGraphModel) graph.getModel()).clear(); Object parent = graph.getDefaultParent(); graph.getModel().beginUpdate(); @@ -176,7 +175,6 @@ graph.getModel().endUpdate(); } setTreeLayout(); - setResourceGraph(resourceDependencyGraph); return graph; } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/CodeGeneratorTest.java b/AlgebraicDataflowArchitectureModel/src/tests/CodeGeneratorTest.java index a0906f5..9e10576 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/CodeGeneratorTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/CodeGeneratorTest.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import algorithms.*; +import code.ast.CompilationUnit; import code.ast.TypeDeclaration; import models.dataFlowModel.*; import parser.*; @@ -19,10 +20,10 @@ DataFlowModel model; try { model = parser.doParse(); - ResourceDependencyGraph graph = DataStorageNecessity.run(model); - EdgeTransitionSelectable.run(graph); - DataStorageDecision.run(graph); - ArrayList codetree = MethodBodyGenerator.doGenerate(graph, model, CodeGenerator.doGenerate(graph, model)); + ResourceDependencyGraph graph = NecessityOfStoringResourceStates.doDecide(model); + SelectableDataTransfers.init(graph); + FinalDecisionOfStoringResourceStates.doDecide(graph); + ArrayList codetree = MethodBodyGenerator.doGenerate(graph, model, CodeGenerator.doGenerate(graph, model)); System.out.println(codetree); } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutKeyword | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression diff --git a/AlgebraicDataflowArchitectureModel/src/tests/DataStorageDecisionTest.java b/AlgebraicDataflowArchitectureModel/src/tests/DataStorageDecisionTest.java index 0797a33..e67f25c 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/DataStorageDecisionTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/DataStorageDecisionTest.java @@ -19,9 +19,9 @@ try { model = parser.doParse(); System.out.println(model); - ResourceDependencyGraph graph = DataStorageNecessity.run(model); - EdgeTransitionSelectable.run(graph); - DataStorageDecision.run(graph); + ResourceDependencyGraph graph = NecessityOfStoringResourceStates.doDecide(model); + SelectableDataTransfers.init(graph); + FinalDecisionOfStoringResourceStates.doDecide(graph); for(Node n:graph.getNodes()) { System.out.println(((ResourceNode) n).getIdentifierTemplate().getResourceName() + ":" + ((StoreAttribute) ((ResourceNode) n).getAttribute()).isStored()); } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/DataStorageNecessityTest.java b/AlgebraicDataflowArchitectureModel/src/tests/DataStorageNecessityTest.java index b287390..a4e58d6 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/DataStorageNecessityTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/DataStorageNecessityTest.java @@ -5,7 +5,7 @@ import java.io.FileNotFoundException; import java.io.FileReader; -import algorithms.DataStorageNecessity; +import algorithms.NecessityOfStoringResourceStates; import models.Node; import models.dataFlowModel.*; import parser.ExpectedChannel; @@ -29,7 +29,7 @@ try { model = parser.doParse(); System.out.println(model); - ResourceDependencyGraph graph = DataStorageNecessity.run(model); + ResourceDependencyGraph graph = NecessityOfStoringResourceStates.doDecide(model); for (Node n:graph.getNodes()) { ResourceNode resource = (ResourceNode)n; if((StoreAttribute)resource.getAttribute() != null) { diff --git a/AlgebraicDataflowArchitectureModel/src/tests/EdgeTransitionSelectableTest.java b/AlgebraicDataflowArchitectureModel/src/tests/EdgeTransitionSelectableTest.java index 98a88ab..0d165ec 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/EdgeTransitionSelectableTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/EdgeTransitionSelectableTest.java @@ -19,8 +19,8 @@ try { model = parser.doParse(); System.out.println(model); - ResourceDependencyGraph graph = DataStorageNecessity.run(model); - EdgeTransitionSelectable.run(graph); + ResourceDependencyGraph graph = NecessityOfStoringResourceStates.doDecide(model); + SelectableDataTransfers.init(graph); for(Edge e:graph.getEdges()) { ResourceDependency re = (ResourceDependency) e; System.out.println(re.getSource() + "-" + re.getDestination() + ":" + ((PushPullAttribute)(re.getAttribute())).getOptions());