b335e0005c7b07b730c3b52b5e19909da387e36c
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / UnifiedCompositionManager.java
1 package org.openecomp.sdc.translator.services.heattotosca;
2
3 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
4 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
5 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
6 import org.openecomp.sdc.tosca.services.DataModelUtil;
7 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
8 import org.openecomp.sdc.tosca.services.ToscaUtil;
9 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
10 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
11 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData;
12
13 import java.util.Map;
14 import java.util.Objects;
15 import java.util.Optional;
16
17 public class UnifiedCompositionManager {
18   private ConsolidationService consolidationService;
19   private TranslationService translationService = new TranslationService();
20   private UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService();
21
22   public UnifiedCompositionManager(ConsolidationService consolidationService) {
23     this.consolidationService = consolidationService;
24   }
25
26   public UnifiedCompositionManager() {
27
28   }
29
30   /**
31    * Create unified composition.
32    *
33    * @param toscaServiceModel  the tosca service model
34    * @param translationContext the translation context
35    * @return the tosca service model
36    */
37   public ToscaServiceModel createUnifiedComposition(ToscaServiceModel toscaServiceModel,
38                                                     TranslationContext translationContext) {
39     Map<String, ServiceTemplate> serviceTemplates = toscaServiceModel.getServiceTemplates();
40     ServiceTemplate mainServiceTemplate =
41         serviceTemplates.get(toscaServiceModel.getEntryDefinitionServiceTemplate());
42     createUnifiedComposition(toscaServiceModel, mainServiceTemplate, translationContext);
43     ToscaServiceModel unifiedToscaServiceModel =
44         HeatToToscaUtil.createToscaServiceModel(mainServiceTemplate, translationContext);
45     return unifiedToscaServiceModel;
46   }
47
48   private void createUnifiedComposition(ToscaServiceModel toscaServiceModel,
49                                         ServiceTemplate serviceTemplate,
50                                         TranslationContext translationContext) {
51     handleNestedServiceTemplates(toscaServiceModel, serviceTemplate, translationContext);
52     consolidationService.serviceTemplateConsolidation(serviceTemplate, translationContext);
53     unifiedCompositionService
54         .updateUnifiedAbstractNodesConnectivity(serviceTemplate, translationContext);
55     translationContext.addUnifiedHandledServiceTeamplte(serviceTemplate);
56   }
57
58   private void handleNestedServiceTemplates(ToscaServiceModel toscaServiceModel,
59                                             ServiceTemplate serviceTemplate,
60                                             TranslationContext translationContext) {
61     String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
62     FileNestedConsolidationData fileNestedConsolidationData =
63         translationContext.getConsolidationData().getNestedConsolidationData()
64             .getFileNestedConsolidationData(serviceTemplateFileName);
65
66     if (Objects.nonNull(fileNestedConsolidationData)) {
67       ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
68       for (String substitutedNodeTemplateId : fileNestedConsolidationData
69           .getAllNestedNodeTemplateIds()) {
70         NodeTemplate nestedNodeTemplate =
71             DataModelUtil.getNodeTemplate(serviceTemplate, substitutedNodeTemplateId);
72         if (Objects.isNull(nestedNodeTemplate) || translationContext
73             .isNestedNodeWasHandled(serviceTemplateFileName, substitutedNodeTemplateId)) {
74           continue;
75         }
76         Optional<String> substituteServiceTemplateName =
77             toscaAnalyzerService.getSubstituteServiceTemplateName(substitutedNodeTemplateId,
78                 nestedNodeTemplate);
79         if (substituteServiceTemplateName.isPresent()) {
80           ServiceTemplate substitutionServiceTemplate =
81               toscaServiceModel.getServiceTemplates().get(substituteServiceTemplateName.get());
82           createUnifiedCompositionForNestedServiceTemplate(toscaServiceModel, serviceTemplate,
83               substitutionServiceTemplate, substitutedNodeTemplateId, translationContext);
84         }
85         translationContext.addNestedNodeAsHandled(serviceTemplateFileName,
86             substitutedNodeTemplateId);
87       }
88     }
89   }
90
91   private void createUnifiedCompositionForNestedServiceTemplate(
92       ToscaServiceModel toscaServiceModel,
93       ServiceTemplate serviceTemplate,
94       ServiceTemplate substitutionServiceTemplate,
95       String substitutedNodeTemplateId,
96       TranslationContext translationContext) {
97     handleNestedServiceTemplates(toscaServiceModel, substitutionServiceTemplate,
98         translationContext);
99     consolidationService.substitutionServiceTemplateConsolidation(substitutedNodeTemplateId,
100         serviceTemplate, substitutionServiceTemplate, translationContext);
101     unifiedCompositionService
102         .updateUnifiedAbstractNodesConnectivity(substitutionServiceTemplate, translationContext);
103     translationContext.addUnifiedHandledServiceTeamplte(substitutionServiceTemplate);
104   }
105 }
106