diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java index 50db9ad..06b12cf 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java @@ -31,7 +31,20 @@ public class CodeGenerator { public static final Type typeVoid = new Type("Void", "void"); - public static String mainTypeName = "Main"; + private static String defaultMainTypeName = "Main"; + static String mainTypeName = defaultMainTypeName; + + 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<>(); diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java b/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java index 6a7f3f7..5e66684 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java @@ -4,11 +4,13 @@ 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() { @@ -26,6 +28,10 @@ public void addType(TypeDeclaration type) { types.add(type); } + + public String getFileName() { + return fileName; + } public String toString() { String result = ""; 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 7c17499..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,6 +23,8 @@ */ private static final long serialVersionUID = -3694103632055735068L; + private String lastDir = null; + public PrototypeGenerateAction(Editor editor) { super("Generate Prototype", editor); } @@ -23,10 +34,46 @@ ResourceDependencyGraph graph = editor.getResourceDependencyGraph(); DataFlowModel model = editor.getModel(); 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 (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 10399bb..568a13a 100644 --- a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/editor/Editor.java +++ b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/editor/Editor.java @@ -9,9 +9,6 @@ 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; @@ -26,8 +23,6 @@ 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,9 +43,9 @@ final int PORT_RADIUS = PORT_DIAMETER / 2; private mxGraph graph = null; + private String curFileName = null; private DataFlowModel model = null; private ResourceDependencyGraph resourceDependencyGraph = null; - private ArrayList codes = null; public Editor(mxGraph graph) { @@ -89,11 +84,16 @@ 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; ResourceDependencyGraph resourceGraph = NecessityOfStoringResourceStates.doDecide(model); resourceDependencyGraph = SelectableDataTransfers.init(resourceGraph);