Refactor get vsp questionnaire
[sdc.git] / openecomp-be / lib / openecomp-sdc-vendor-software-product-lib / openecomp-sdc-vendor-software-product-core / src / main / java / org / openecomp / sdc / vendorsoftwareproduct / dao / impl / zusammen / VendorSoftwareProductInfoDaoZusammenImpl.java
1 /*
2  * Copyright © 2016-2018 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen;
17
18 import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement;
19 import com.amdocs.zusammen.datatypes.SessionContext;
20 import com.amdocs.zusammen.datatypes.item.Action;
21 import com.amdocs.zusammen.datatypes.item.ElementContext;
22 import com.amdocs.zusammen.datatypes.item.Info;
23 import org.openecomp.core.zusammen.api.ZusammenAdaptor;
24 import org.openecomp.sdc.datatypes.model.ElementType;
25 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
26 import org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToVSPGeneralConvertor;
27 import org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToVSPQuestionnaireConvertor;
28 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OnboardingMethod;
29 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
30 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspQuestionnaireEntity;
31 import org.openecomp.sdc.versioning.ActionVersioningManagerFactory;
32 import org.openecomp.sdc.versioning.dao.types.Version;
33 import org.openecomp.sdc.versioning.types.VersionableEntityMetadata;
34 import org.openecomp.sdc.versioning.types.VersionableEntityStoreType;
35
36 import java.io.ByteArrayInputStream;
37 import java.util.Collection;
38 import java.util.stream.Collectors;
39
40 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildStructuralElement;
41 import static org.openecomp.core.zusammen.api.ZusammenUtil.createSessionContext;
42
43 public class VendorSoftwareProductInfoDaoZusammenImpl implements VendorSoftwareProductInfoDao {
44   private static final String EMPTY_DATA = "{}";
45
46   private ZusammenAdaptor zusammenAdaptor;
47
48   public VendorSoftwareProductInfoDaoZusammenImpl(ZusammenAdaptor zusammenAdaptor) {
49     this.zusammenAdaptor = zusammenAdaptor;
50   }
51
52   @Override
53   public void registerVersioning(String versionableEntityType) {
54     VersionableEntityMetadata metadata =
55         new VersionableEntityMetadata(VersionableEntityStoreType.Zusammen, "VendorSoftwareProduct",
56             null, null);
57
58     ActionVersioningManagerFactory.getInstance().createInterface()
59         .register(versionableEntityType, metadata);
60   }
61
62   @Override
63   public Collection<VspDetails> list(VspDetails entity) {
64     return zusammenAdaptor.listItems(createSessionContext()).stream()
65         .filter(item -> "VendorSoftwareProduct".equals(item.getInfo().getProperty("item_type")))
66         .map(new ElementToVSPGeneralConvertor()::convert)
67         .collect(Collectors.toList());
68   }
69
70   @Override
71   public void create(VspDetails vspDetails) {
72     ZusammenElement generalElement = mapVspDetailsToZusammenElement(vspDetails, Action.CREATE);
73
74     SessionContext context = createSessionContext();
75     ElementContext elementContext =
76         new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId());
77     zusammenAdaptor.saveElement(context, elementContext, generalElement,
78         "Create VSP General Info Element");
79
80     createVspStructure(context, elementContext);
81   }
82
83   private void createVspStructure(SessionContext context, ElementContext elementContext) {
84     createOrchestrationTemplateCandidateStructure(context, elementContext);
85     createVspModelStructure(context, elementContext);
86
87     zusammenAdaptor.saveElement(context, elementContext,
88         buildStructuralElement(ElementType.DeploymentFlavors, Action.CREATE),
89         "Create VSP Deployment Flavors Element");
90
91     zusammenAdaptor.saveElement(context, elementContext,
92         buildStructuralElement(ElementType.Processes, Action.CREATE),
93         "Create VSP Processes Element");
94   }
95
96   private void createOrchestrationTemplateCandidateStructure(SessionContext context,
97                                                              ElementContext elementContext) {
98     ByteArrayInputStream emptyData = new ByteArrayInputStream(EMPTY_DATA.getBytes());
99
100     ZusammenElement candidateContentElement =
101         buildStructuralElement(ElementType.OrchestrationTemplateCandidateContent, Action.CREATE);
102     candidateContentElement.setData(emptyData);
103     ZusammenElement validationData = buildStructuralElement(ElementType
104         .OrchestrationTemplateCandidateValidationData, Action.CREATE);
105     ZusammenElement candidateElement =
106         buildStructuralElement(ElementType.OrchestrationTemplateCandidate, Action.CREATE);
107     candidateElement.setData(emptyData);
108     candidateElement.addSubElement(candidateContentElement);
109     candidateElement.addSubElement(validationData);
110     zusammenAdaptor.saveElement(context, elementContext, candidateElement,
111         "Create Orchestration Template Candidate Elements");
112   }
113
114   private void createVspModelStructure(SessionContext context, ElementContext elementContext) {
115     ZusammenElement vspModel = buildStructuralElement(ElementType.VspModel, Action.CREATE);
116     vspModel.addSubElement(buildOrchestrationTemplateStructure());
117     vspModel.addSubElement(buildStructuralElement(ElementType.Networks, Action.CREATE));
118     vspModel.addSubElement(buildStructuralElement(ElementType.Components, Action.CREATE));
119     vspModel
120         .addSubElement(buildStructuralElement(ElementType.ComponentDependencies, Action.CREATE));
121
122     ZusammenElement templates = buildStructuralElement(ElementType.Templates, Action.CREATE);
123     ZusammenElement artifacts = buildStructuralElement(ElementType.Artifacts, Action.CREATE);
124     vspModel.addSubElement(
125         buildServiceModelStructure(ElementType.ServiceModel, templates, artifacts));
126     vspModel.addSubElement(
127         buildServiceModelStructure(ElementType.EnrichedServiceModel, templates, artifacts));
128
129     zusammenAdaptor.saveElement(context, elementContext, vspModel, "Create VSP Model Elements");
130   }
131
132   private ZusammenElement buildOrchestrationTemplateStructure() {
133     ByteArrayInputStream emptyData = new ByteArrayInputStream(EMPTY_DATA.getBytes());
134
135     ZusammenElement validationData =
136         buildStructuralElement(ElementType.OrchestrationTemplateValidationData, Action.CREATE);
137     validationData.setData(emptyData);
138
139     ZusammenElement orchestrationTemplateStructure = buildStructuralElement(ElementType
140         .OrchestrationTemplateStructure, Action.CREATE);
141     validationData.setData(emptyData);
142
143     ZusammenElement orchestrationTemplate =
144         buildStructuralElement(ElementType.OrchestrationTemplate, Action.CREATE);
145     orchestrationTemplate.setData(emptyData);
146     orchestrationTemplate.addSubElement(validationData);
147     orchestrationTemplate.addSubElement(orchestrationTemplateStructure);
148
149     return orchestrationTemplate;
150   }
151
152   private ZusammenElement buildServiceModelStructure(ElementType serviceModelElementType,
153                                                      ZusammenElement templates,
154                                                      ZusammenElement artifacts) {
155     ZusammenElement serviceModel = buildStructuralElement(serviceModelElementType, Action.CREATE);
156     serviceModel.addSubElement(templates);
157     serviceModel.addSubElement(artifacts);
158     return serviceModel;
159   }
160
161   @Override
162   public void update(VspDetails vspDetails) {
163     ZusammenElement generalElement = mapVspDetailsToZusammenElement(vspDetails, Action.UPDATE);
164
165     SessionContext context = createSessionContext();
166     zusammenAdaptor.saveElement(context,
167         new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId()), generalElement,
168         "Update VSP General Info Element");
169   }
170
171   @Override
172   public VspDetails get(VspDetails vspDetails) {
173     SessionContext context = createSessionContext();
174     ElementContext elementContext =
175         new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId());
176     return zusammenAdaptor.getElementInfoByName(context, elementContext, null,
177         ElementType.VendorSoftwareProduct.name())
178         .map(new ElementToVSPGeneralConvertor()::convert)
179         .map(vsp -> {
180           vsp.setId(vspDetails.getId());
181           vsp.setVersion(vspDetails.getVersion());
182           return vsp;
183         })
184         .orElse(null);
185   }
186
187   @Override
188   public void delete(VspDetails vspDetails) {
189     SessionContext context = createSessionContext();
190     ElementContext elementContext =
191         new ElementContext(vspDetails.getId(), vspDetails.getVersion().getId());
192
193     zusammenAdaptor.saveElement(context, elementContext,
194         buildStructuralElement(ElementType.VspModel, Action.DELETE),
195         "Delete VSP Model Elements");
196
197     createVspModelStructure(context, elementContext);
198   }
199
200   @Override
201   public void updateQuestionnaireData(String vspId, Version version, String questionnaireData) {
202     SessionContext context = createSessionContext();
203
204     ZusammenElement questionnaireElement = mapQuestionnaireToZusammenElement(questionnaireData);
205     zusammenAdaptor.saveElement(context, new ElementContext(vspId, version.getId()),
206         questionnaireElement, "Update VSP Questionnaire");
207   }
208
209   @Override
210   public VspQuestionnaireEntity getQuestionnaire(String vspId, Version version) {
211     SessionContext context = createSessionContext();
212     VspQuestionnaireEntity entity = new ElementToVSPQuestionnaireConvertor().convert(zusammenAdaptor
213         .getElementByName(context, new ElementContext(vspId, version.getId()), null,
214             ElementType.VSPQuestionnaire.name())
215         .orElse(null));
216     entity.setId(vspId);
217     entity.setVersion(version);
218     return entity;
219   }
220
221   @Override
222   public boolean isManual(String vspId, Version version) {
223     final VspDetails vspDetails = get(new VspDetails(vspId, version));
224     return vspDetails != null &&
225         OnboardingMethod.Manual.name().equals(vspDetails.getOnboardingMethod());
226   }
227
228   private ZusammenElement mapVspDetailsToZusammenElement(VspDetails vspDetails, Action action) {
229     ZusammenElement generalElement =
230         buildStructuralElement(ElementType.VendorSoftwareProduct, action);
231     addVspDetailsToInfo(generalElement.getInfo(), vspDetails);
232     return generalElement;
233   }
234
235   private ZusammenElement mapQuestionnaireToZusammenElement(String questionnaireData) {
236     ZusammenElement questionnaireElement =
237         buildStructuralElement(ElementType.VSPQuestionnaire, Action.UPDATE);
238     questionnaireElement.setData(new ByteArrayInputStream(questionnaireData.getBytes()));
239     return questionnaireElement;
240   }
241
242   private void addVspDetailsToInfo(Info info, VspDetails vspDetails) {
243     info.addProperty(InfoPropertyName.NAME.getValue(), vspDetails.getName());
244     info.addProperty(InfoPropertyName.DESCRIPTION.getValue(), vspDetails.getDescription());
245     info.addProperty(InfoPropertyName.ICON.getValue(), vspDetails.getIcon());
246     info.addProperty(InfoPropertyName.CATEGORY.getValue(), vspDetails.getCategory());
247     info.addProperty(InfoPropertyName.SUB_CATEGORY.getValue(), vspDetails.getSubCategory());
248     info.addProperty(InfoPropertyName.VENDOR_ID.getValue(), vspDetails.getVendorId());
249     info.addProperty(InfoPropertyName.VENDOR_NAME.getValue(), vspDetails.getVendorName());
250     if (vspDetails.getVlmVersion() != null) {
251       info.addProperty(InfoPropertyName.VENDOR_VERSION.getValue(),
252           vspDetails.getVlmVersion().getId());
253     }
254     info.addProperty(InfoPropertyName.LICENSE_AGREEMENT.getValue(),
255         vspDetails.getLicenseAgreement());
256     info.addProperty(InfoPropertyName.FEATURE_GROUPS.getValue(), vspDetails.getFeatureGroups());
257     info.addProperty(InfoPropertyName.ON_BOARDING_METHOD.getValue(),
258         vspDetails.getOnboardingMethod());
259   }
260
261   public enum InfoPropertyName {
262     NAME("name"),
263     DESCRIPTION("description"),
264     ICON("icon"),
265     CATEGORY("category"),
266     SUB_CATEGORY("subCategory"),
267     VENDOR_ID("vendorId"),
268     VENDOR_NAME("vendorName"),
269     VENDOR_VERSION("vendorVersion"),
270     LICENSE_AGREEMENT("licenseAgreement"),
271     FEATURE_GROUPS("featureGroups"),
272     ON_BOARDING_METHOD("onboardingMethod");
273
274     private String value;
275
276     InfoPropertyName(String value) {
277       this.value = value;
278     }
279
280     public String getValue() {
281       return value;
282     }
283   }
284
285 }