diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/JavaPrototypeGenerateAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/JavaPrototypeGenerateAction.java index 1ecb903..62320f9 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/JavaPrototypeGenerateAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/JavaPrototypeGenerateAction.java @@ -16,13 +16,10 @@ import generators.CodeGeneratorFromDataFlowGraph; import generators.DataTransferMethodAnalyzer; import generators.ILanguageSpecific; -import generators.JavaCodeGenerator; -import generators.JavaMethodBodyGenerator; import generators.JavaSpecific; import generators.StandaloneSpecific; import generators.TypeInference; import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.DataTransferModel; import models.dataFlowModel.ModelExtension; import models.dataFlowModel.DataFlowGraph; @@ -59,13 +56,13 @@ exist = true; } } - CodeGeneratorFromDataFlowGraph codeGenerator = new CodeGeneratorFromDataFlowGraph(); + CodeGeneratorFromDataFlowGraph codeGenerator = new CodeGeneratorFromDataFlowGraph(new StandaloneSpecific(), langSpec); 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(codeGenerator.generateCode(model, graph, new StandaloneSpecific(), langSpec)); + editor.setCodes(codeGenerator.generateCode(model, graph)); ModelExtension.recoverModel(model); for (CompilationUnit file : editor.getCodes()) { System.out.println(file); diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/JerseyPrototypeGenerateAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/JerseyPrototypeGenerateAction.java index b9ab7e0..151028d 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/JerseyPrototypeGenerateAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/JerseyPrototypeGenerateAction.java @@ -15,8 +15,6 @@ import generators.DataTransferMethodAnalyzer; import generators.ILanguageSpecific; import generators.JavaSpecific; -import generators.JerseyCodeGenerator; -import generators.JerseyMethodBodyGenerator; import generators.JerseySpecific; import generators.TypeInference; import models.dataConstraintModel.ResourceHierarchy; @@ -56,14 +54,14 @@ exist = true; } } - CodeGeneratorFromDataFlowGraph codeGenerator = new CodeGeneratorFromDataFlowGraph(); + CodeGeneratorFromDataFlowGraph codeGenerator = new CodeGeneratorFromDataFlowGraph(new JerseySpecific(), langSpec); 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(JerseyMethodBodyGenerator.doGenerate(graph, model, JerseyCodeGenerator.doGenerate(graph, model))); - editor.setCodes(codeGenerator.generateCode(model, graph, new JerseySpecific(), langSpec)); + editor.setCodes(codeGenerator.generateCode(model, graph)); ModelExtension.recoverModel(model); for (CompilationUnit file : editor.getCodes()) { System.out.println(file); diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java index b1e32e7..632e16a 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java @@ -10,7 +10,11 @@ import com.mxgraph.swing.mxGraphComponent; import com.mxgraph.util.mxEventSource.mxIEventListener; import com.mxgraph.util.mxPoint; -import generators.JavaCodeGenerator; + +import generators.CodeGenerator; +import generators.CodeGeneratorFromDataFlowGraph; +import generators.JavaSpecific; +import generators.StandaloneSpecific; import models.Edge; import models.algebra.*; import models.dataConstraintModel.Channel; @@ -332,7 +336,7 @@ Set> resourceDependency = new HashSet<>(); if (!ch.getOutputChannelMembers().isEmpty()) { try { - Map>> dependency = ch.fillOutsideResourcePaths(ch.getOutputChannelMembers().iterator().next(), JavaCodeGenerator.pullAccessor); + Map>> dependency = ch.fillOutsideResourcePaths(ch.getOutputChannelMembers().iterator().next(), new CodeGeneratorFromDataFlowGraph(new StandaloneSpecific(), new JavaSpecific()).getPullAccessor(new StandaloneSpecific())); for (ChannelMember srcMem : dependency.keySet()) { ResourceNode srcNode = dataFlowGraph.getResourceNode(srcMem.getResource()); if (srcNode != null) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index d127e93..e38225a 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -61,6 +61,12 @@ protected CodeGenerationContext generationContext = null; protected ILanguageSpecific langSpec = null; protected IPlatformSpecific platformSpec = null; + + public CodeGenerator(IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + this.langSpec = langSpec; + this.platformSpec = platformSpec; + this.generationContext = new CodeGenerationContext(langSpec, platformSpec); + } public String getMainTypeName() { return mainTypeName; @@ -94,10 +100,7 @@ * @param langSpec specified language * @return source codes */ - public ArrayList generateCode(DataTransferModel model, DataFlowGraph flowGraph, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { - this.langSpec = langSpec; - this.platformSpec = platformSpec; - this.generationContext = new CodeGenerationContext(langSpec, platformSpec); + public ArrayList generateCode(DataTransferModel model, DataFlowGraph flowGraph) { ArrayList codes = new ArrayList<>(); Map> dependedRootComponentGraph = null; @@ -830,7 +833,7 @@ } } - protected IResourceStateAccessor getPushAccessor(IPlatformSpecific platformSpec) { + public IResourceStateAccessor getPushAccessor(IPlatformSpecific platformSpec) { if (platformSpec.isMonolithic()) { return new IResourceStateAccessor() { @Override @@ -907,7 +910,7 @@ } } - protected IResourceStateAccessor getPullAccessor(IPlatformSpecific platformSpec) { + public IResourceStateAccessor getPullAccessor(IPlatformSpecific platformSpec) { if (platformSpec.isMonolithic()) { return new IResourceStateAccessor() { @Override @@ -1190,7 +1193,7 @@ } } - protected IResourceStateAccessor getRefAccessor(IPlatformSpecific platformSpec) { + public IResourceStateAccessor getRefAccessor(IPlatformSpecific platformSpec) { if (platformSpec.isMonolithic()) { return new IResourceStateAccessor() { @Override diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java index d37689a..0224022 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java @@ -53,6 +53,10 @@ public class CodeGeneratorFromDataFlowGraph extends CodeGenerator { protected Map> constructorParams; + public CodeGeneratorFromDataFlowGraph(IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + super(platformSpec, langSpec); + } + public void generateCodeFromFlowGraph(DataTransferModel model, DataFlowGraph flowGraph, Collection components, ArrayList codes, Map> dependedRootComponentGraph) { constructorParams = new HashMap<>(); Map resourceConstructors = new HashMap<>(); diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java index 6b3b259..6548d62 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java @@ -83,7 +83,11 @@ @Override public ListType newListType(Type compType, Type parentListType) { List typeArgs = new ArrayList<>(); - typeArgs.add((code.ast.Type) compType.getInterfaceType()); + if (isValueType(compType)) { + typeArgs.add((code.ast.Type) getWrapperType(compType).getInterfaceType()); + } else { + typeArgs.add((code.ast.Type) compType.getInterfaceType()); + } return new ListType("List", new code.ast.ParameterizedType(typeArrayList), new code.ast.ParameterizedType(JavaSpecific.typeList, typeArgs), parentListType, compType); } @@ -110,7 +114,11 @@ public MapType newMapType(Type keyType, Type valueType, Type parentMapType) { List typeArgs = new ArrayList<>(); typeArgs.add((code.ast.Type) keyType.getInterfaceType()); - typeArgs.add((code.ast.Type) valueType.getInterfaceType()); + if (isValueType(valueType)) { + typeArgs.add((code.ast.Type) getWrapperType(valueType).getInterfaceType()); + } else { + typeArgs.add((code.ast.Type) valueType.getInterfaceType()); + } return new MapType("Map", new code.ast.ParameterizedType(typeHashMap), new code.ast.ParameterizedType(JavaSpecific.typeMap, typeArgs), parentMapType, keyType, valueType); } @@ -124,10 +132,20 @@ code.ast.Type implType = new code.ast.SimpleType("AbstractMap.SimpleEntry"); code.ast.Type interfaceType = typeMapEntry; if (componentTypes.size() >= 2) { - interfaceType = (code.ast.Type) componentTypes.get(componentTypes.size() - 1).getInterfaceType(); + Type compType = componentTypes.get(componentTypes.size() - 1); + if (isValueType(compType)) { + interfaceType = (code.ast.Type) getWrapperType(compType).getInterfaceType(); + } else { + interfaceType = (code.ast.Type) compType.getInterfaceType(); + } for (int i = componentTypes.size() - 2; i >= 0; i--) { List typeArgs = new ArrayList<>(); - typeArgs.add((code.ast.Type) componentTypes.get(i).getInterfaceType()); + compType = componentTypes.get(i); + if (isValueType(compType)) { + typeArgs.add((code.ast.Type) getWrapperType(compType).getInterfaceType()); + } else { + typeArgs.add((code.ast.Type) compType.getInterfaceType()); + } typeArgs.add(interfaceType); interfaceType = new code.ast.ParameterizedType(typeMapEntry, typeArgs); } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/JAXRSCodeGeneratorTest.java b/AlgebraicDataflowArchitectureModel/src/tests/JAXRSCodeGeneratorTest.java index 75f22fd..556e065 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/JAXRSCodeGeneratorTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/JAXRSCodeGeneratorTest.java @@ -23,13 +23,10 @@ import code.ast.MethodDeclaration; import code.ast.TypeDeclaration; import code.ast.VariableDeclaration; +import generators.CodeGenerator; import generators.CodeGeneratorFromDataFlowGraph; import generators.DataTransferMethodAnalyzer; -import generators.JavaCodeGenerator; -import generators.JavaMethodBodyGenerator; import generators.JavaSpecific; -import generators.JerseyCodeGenerator; -import generators.JerseyMethodBodyGenerator; import generators.JerseySpecific; import generators.TypeInference; import models.Edge; @@ -456,7 +453,7 @@ Map.entry("postMessage", Map.entry(Set.of(), Map.entry("void", Map.entry(List.of("String","String"), - 6)))), + 2)))), Map.entry("Group", Map.entry(Set.of(), Map.entry("void", Map.entry(List.of("List","List"), @@ -759,7 +756,7 @@ Map.entry("battle", Map.entry(Set.of(), Map.entry("void", Map.entry(List.of("String","boolean"), - 6)))), + 2)))), Map.entry("Room", Map.entry(Set.of(), Map.entry("void", Map.entry(List.of("boolean"), @@ -1109,7 +1106,7 @@ Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), Map.entry("Map", Map.entry(List.of(), - 8)))))))); + 5)))))))); exprectedStructure.put("Account", Map.entry(Set.of(), Map.entry(Map.ofEntries(Map.entry("vote", "String")), Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), @@ -1287,7 +1284,8 @@ typeInference.infer(model); DataTransferMethodAnalyzer.decideToStoreResourceStates(graph); // ArrayList codetree = JerseyMethodBodyGenerator.doGenerate(graph, model, JerseyCodeGenerator.doGenerate(graph, model)); - ArrayList codetree = new CodeGeneratorFromDataFlowGraph().generateCode(model, graph, new JerseySpecific(), new JavaSpecific()); + CodeGenerator codeGenerator = new CodeGeneratorFromDataFlowGraph(new JerseySpecific(), new JavaSpecific()); + ArrayList codetree = codeGenerator.generateCode(model, graph); return codetree; } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java b/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java index 7d07402..dd488ba 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java @@ -20,10 +20,9 @@ import code.ast.MethodDeclaration; import code.ast.TypeDeclaration; import code.ast.VariableDeclaration; +import generators.CodeGenerator; import generators.CodeGeneratorFromDataFlowGraph; import generators.DataTransferMethodAnalyzer; -import generators.JavaCodeGenerator; -import generators.JavaMethodBodyGenerator; import generators.JavaSpecific; import generators.StandaloneSpecific; import generators.TypeInference; @@ -468,7 +467,7 @@ 1))), Map.entry("postMessage", Map.entry("void", Map.entry(List.of("String","String"), - 6))), + 2))), Map.entry("addGroupMember", Map.entry("void", Map.entry(List.of("String","String"), 1))), @@ -975,7 +974,7 @@ 1))), Map.entry("battle", Map.entry("void", Map.entry(List.of("String","boolean"), - 6))), + 2))), Map.entry("Room", Map.entry("void", Map.entry(List.of("boolean","Accounts"), 2)))))); @@ -1273,7 +1272,7 @@ Map.entry("accounts", "Accounts")), Map.ofEntries(Map.entry("getValue", Map.entry("Map", Map.entry(List.of(), - 6))), + 5))), Map.entry("Counts", Map.entry("void", Map.entry(List.of("Accounts"), 1)))))); @@ -1441,7 +1440,8 @@ typeInference.infer(model); DataTransferMethodAnalyzer.decideToStoreResourceStates(graph); // ArrayList codetree = JavaMethodBodyGenerator.doGenerate(graph, model, JavaCodeGenerator.doGenerate(graph, model)); - ArrayList codetree = new CodeGeneratorFromDataFlowGraph().generateCode(model, graph, new StandaloneSpecific(), new JavaSpecific()); + CodeGenerator codeGenerator = new CodeGeneratorFromDataFlowGraph(new StandaloneSpecific(), new JavaSpecific()); + ArrayList codetree = codeGenerator.generateCode(model, graph); return codetree; }