diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index b23a6a3..7b819b4 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -60,6 +60,11 @@ private static String mainTypeName = null; private static ILanguageSpecific langSpec = null; private static IPlatformSpecific platformSpec = null; + private static HashMap> componentNames = new HashMap<>(); + + public CodeGenerator() { + componentNames.clear(); + } public static String getMainTypeName() { return mainTypeName; @@ -84,7 +89,22 @@ name += "Element"; } } - return langSpec.toComponentName(name); + String componentName = langSpec.toComponentName(name); + if (!generatesComponent(res)) return componentName; + // To avoid generating multiple components with the same name. + HashMap resToName = componentNames.get(componentName); + if (resToName == null) { + resToName = new HashMap<>(); + resToName.put(res, componentName); + componentNames.put(componentName, resToName); + return componentName; + } + if (resToName.get(res) == null) { + componentName += resToName.size(); + resToName.put(res, componentName); + return componentName; + } + return resToName.get(res); } public static Type getImplStateType(ResourceHierarchy res, ILanguageSpecific langSpec) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java index e112a4a..d8f4ae2 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java @@ -62,7 +62,6 @@ public void generateCodeFromFlowGraph(DataTransferModel model, DataFlowGraph flowGraph, Collection components, ArrayList codes, Map> dependedRootComponentGraph, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { - Map resNameToComponent = new HashMap<>(); Map resHierarchyToComponent = new HashMap<>(); Map resourceConstructors = new HashMap<>(); Map> constructorParams = new HashMap<>(); @@ -86,23 +85,24 @@ // For each components (1st pass). for (Node componentNode: components) { ResourceNode resourceNode = (ResourceNode) componentNode; + ResourceHierarchy resourceHierarchy = resourceNode.getResourceHierarchy(); TypeDeclaration component = null; - if (generatesComponent(resourceNode.getResourceHierarchy())) { + if (generatesComponent(resourceHierarchy)) { // A component will be generated for this resource. - String resourceName = getComponentName(resourceNode.getResourceHierarchy(), langSpec); - Type resStateType = getImplStateType(resourceNode.getResourceHierarchy(), langSpec); - component = resNameToComponent.get(resourceName); + String resourceName = getComponentName(resourceHierarchy, langSpec); + Type resStateType = getImplStateType(resourceHierarchy, langSpec); + component = resHierarchyToComponent.get(resourceHierarchy); List depends = new ArrayList<>(); if (component == null) { // Add compilation unit for this component. component = langSpec.newTypeDeclaration(resourceName); - if (!platformSpec.isMonolithic() && resourceNode.getResourceHierarchy().getParent() == null) { + if (!platformSpec.isMonolithic() && resourceHierarchy.getParent() == null) { // For each root node, add component annotations. ((RestApiSpecific) platformSpec).addComponentAnnotations(component, resourceNode.getResourceName()); } - resNameToComponent.put(resourceName, component); + resHierarchyToComponent.put(resourceHierarchy, component); CompilationUnit cu = langSpec.newCompilationUnit(component); - if (!platformSpec.isMonolithic() && resourceNode.getResourceHierarchy().getParent() == null) { + if (!platformSpec.isMonolithic() && resourceHierarchy.getParent() == null) { // For each root node, add platform specific imports. ((RestApiSpecific) platformSpec).addPlatformSpecificImports(cu); } @@ -114,7 +114,7 @@ // Declare the constructor. MethodDeclaration constructor = declareConstructor(resourceNode, component, dependedRootComponentGraph, depends, langSpec); - if (platformSpec.hasMain() && resourceNode.getResourceHierarchy().getParent() == null) { + if (platformSpec.hasMain() && resourceHierarchy.getParent() == null) { // For each root resource // Update the main component for this component. updateMainComponent(mainComponent, mainConstructor, componentNode, constructor, depends, langSpec); @@ -126,7 +126,7 @@ if (constructor.getParameters() == null || constructor.getParameters().size() == 0) { component.removeMethod(constructor); } else { - resourceConstructors.put(resourceNode.getResourceHierarchy(), constructor); + resourceConstructors.put(resourceHierarchy, constructor); } } @@ -144,8 +144,8 @@ } } if (component != null) { - if (resHierarchyToComponent.get(resourceNode.getResourceHierarchy()) == null) { - resHierarchyToComponent.put(resourceNode.getResourceHierarchy(), component); + if (resHierarchyToComponent.get(resourceHierarchy) == null) { + resHierarchyToComponent.put(resourceHierarchy, component); } // (#1) Declare the getter methods in this resource to obtain the descendant resources. (complementary to #2) declareDescendantGetterMethods(resourceNode, component, descendantGetters, langSpec); @@ -159,18 +159,19 @@ for (Node componentNode: components) { // Declare this resource. ResourceNode resourceNode = (ResourceNode) componentNode; - Type resStateType = getImplStateType(resourceNode.getResourceHierarchy(), langSpec); - String resourceName = getComponentName(resourceNode.getResourceHierarchy(), langSpec); + ResourceHierarchy resourceHierarchy = resourceNode.getResourceHierarchy(); + Type resStateType = getImplStateType(resourceHierarchy, langSpec); + String resourceName = getComponentName(resourceHierarchy, langSpec); TypeDeclaration component = null; TypeDeclaration parentComponent = null; TypeDeclaration rootComponent = null; - if (generatesComponent(resourceNode.getResourceHierarchy())) { - component = resNameToComponent.get(resourceName); + if (generatesComponent(resourceHierarchy)) { + component = resHierarchyToComponent.get(resourceHierarchy); } - if (resourceNode.getResourceHierarchy().getParent() != null) { - parentComponent = resHierarchyToComponent.get(resourceNode.getResourceHierarchy().getParent()); + if (resourceHierarchy.getParent() != null) { + parentComponent = resHierarchyToComponent.get(resourceHierarchy.getParent()); } - rootComponent = resHierarchyToComponent.get(resourceNode.getResourceHierarchy().getRoot()); + rootComponent = resHierarchyToComponent.get(resourceHierarchy.getRoot()); // Declare cache fields and update methods in this resource, and an update accessor method in the type of root resource. Map.Entry, Map>>> initStatementsAndUpdateUpdates @@ -178,7 +179,7 @@ if (component == null) { // Constructor statements were not added to any component because no component had been generated. for (String statement: initStatementsAndUpdateUpdates.getKey()) { - constructorStatements.add(new AbstractMap.SimpleEntry<>(resourceNode.getResourceHierarchy().getParent(), statement)); + constructorStatements.add(new AbstractMap.SimpleEntry<>(resourceHierarchy.getParent(), statement)); } } for (Map.Entry>> entry: initStatementsAndUpdateUpdates.getValue().entrySet()) { @@ -200,19 +201,19 @@ } } - if (!platformSpec.isMonolithic() && !generatedResources.contains(resourceNode.getResourceHierarchy())) { + if (!platformSpec.isMonolithic() && !generatedResources.contains(resourceHierarchy)) { // Declare the getter accessor in the root resource. declareGetterAccessorInTheRootResource(resourceNode, rootComponent, platformSpec, langSpec); } // Declare input methods in this component and the main component. - if (!generatedResources.contains(resourceNode.getResourceHierarchy())) { + if (!generatedResources.contains(resourceHierarchy)) { Map.Entry, Map>>> initStatementsAndInputUpdates = declareInputMethodsInThisAndMainComponents(resourceNode, component, parentComponent, mainComponent, rootComponent, model, priorMemberForInputChannel, platformSpec, langSpec); if (component == null) { // Constructor statements were not added to any component because no component had been generated. for (String statement: initStatementsAndInputUpdates.getKey()) { - constructorStatements.add(new AbstractMap.SimpleEntry<>(resourceNode.getResourceHierarchy().getParent(), statement)); + constructorStatements.add(new AbstractMap.SimpleEntry<>(resourceHierarchy.getParent(), statement)); } } for (Map.Entry>> entry: initStatementsAndInputUpdates.getValue().entrySet()) { @@ -222,7 +223,7 @@ } } - generatedResources.add(resourceNode.getResourceHierarchy()); + generatedResources.add(resourceHierarchy); } // Add constructor parameters to the ancestor components.