Added oparent to sdc main
[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 / ComputeDaoZusammenImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen;
22
23
24 import com.amdocs.zusammen.adaptor.inbound.api.types.item.Element;
25 import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement;
26 import com.amdocs.zusammen.datatypes.Id;
27 import com.amdocs.zusammen.datatypes.SessionContext;
28 import com.amdocs.zusammen.datatypes.item.Action;
29 import com.amdocs.zusammen.datatypes.item.ElementContext;
30 import com.amdocs.zusammen.datatypes.item.Info;
31 import org.openecomp.core.utilities.file.FileUtils;
32 import org.openecomp.core.zusammen.api.ZusammenAdaptor;
33 import org.openecomp.sdc.datatypes.model.ElementType;
34 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
35 import org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToComputeConvertor;
36 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
37 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
38 import org.openecomp.sdc.versioning.dao.types.Version;
39 import org.openecomp.types.ElementPropertyName;
40
41 import java.io.ByteArrayInputStream;
42 import java.util.Collection;
43 import java.util.Collections;
44 import java.util.Optional;
45 import java.util.stream.Collectors;
46
47 import static org.openecomp.core.zusammen.api.ZusammenUtil.*;
48
49 public class ComputeDaoZusammenImpl implements ComputeDao {
50
51   private ZusammenAdaptor zusammenAdaptor;
52
53   public ComputeDaoZusammenImpl(ZusammenAdaptor zusammenAdaptor) {
54     this.zusammenAdaptor = zusammenAdaptor;
55   }
56
57   @Override
58   public void registerVersioning(String versionableEntityType) {
59     // registerVersioning not implemented for ComputeDaoZusammenImpl
60   }
61
62   @Override
63   public Collection<ComputeEntity> list(ComputeEntity compute) {
64     SessionContext context = createSessionContext();
65     ElementContext elementContext =
66         new ElementContext(compute.getVspId(), compute.getVersion().getId());
67
68     return listComputes(context, elementContext, compute);
69   }
70
71   private Collection<ComputeEntity> listComputes(SessionContext context,
72                                                  ElementContext elementContext,
73                                                  ComputeEntity compute) {
74     return zusammenAdaptor
75         .listElementsByName(context, elementContext, new Id(compute.getComponentId()),
76             ElementType.Computes.name())
77         .stream()
78         .map(new ElementToComputeConvertor()::convert)
79         .map(computeEntity -> {
80           computeEntity.setComponentId(compute.getComponentId());
81           computeEntity.setVspId(compute.getVspId());
82           computeEntity.setVersion(compute.getVersion());
83           return computeEntity;
84         })
85         .collect(Collectors.toList());
86   }
87
88   @Override
89   public void create(ComputeEntity compute) {
90     ZusammenElement computeElement = computeToZusammen(compute, Action.CREATE);
91
92     ZusammenElement computesElement = buildStructuralElement(ElementType.Computes, Action.IGNORE);
93     computesElement.setSubElements(Collections.singletonList(computeElement));
94
95     ZusammenElement componentElement =
96         buildElement(new Id(compute.getComponentId()), Action.IGNORE);
97     componentElement.setSubElements(Collections.singletonList(computesElement));
98
99     SessionContext context = createSessionContext();
100     ElementContext elementContext =
101         new ElementContext(compute.getVspId(), compute.getVersion().getId());
102
103     Element savedElement =
104         zusammenAdaptor.saveElement(context, elementContext, componentElement, "Create compute");
105     compute.setId(savedElement.getSubElements().iterator().next()
106         .getSubElements().iterator().next().getElementId().getValue());
107   }
108
109   @Override
110   public void update(ComputeEntity compute) {
111     ZusammenElement computeElement = computeToZusammen(compute, Action.UPDATE);
112
113     SessionContext context = createSessionContext();
114     ElementContext elementContext =
115         new ElementContext(compute.getVspId(), compute.getVersion().getId());
116     zusammenAdaptor.saveElement(context, elementContext, computeElement,
117         String.format("Update compute with id %s", compute.getId()));
118   }
119
120   @Override
121   public ComputeEntity get(ComputeEntity compute) {
122     SessionContext context = createSessionContext();
123     ElementContext elementContext =
124         new ElementContext(compute.getVspId(), compute.getVersion().getId());
125     Optional<Element> element =
126         zusammenAdaptor.getElement(context, elementContext, compute.getId());
127
128     if (element.isPresent()) {
129
130       ElementToComputeConvertor convertor = new ElementToComputeConvertor();
131       ComputeEntity entity = convertor.convert(element.get());
132       entity.setVspId(compute.getVspId());
133       entity.setVersion(compute.getVersion());
134       entity.setComponentId(compute.getComponentId());
135       return entity;
136     } else {
137       return null;
138     }
139   }
140
141   @Override
142   public void delete(ComputeEntity compute) {
143     ZusammenElement computeElement = buildElement(new Id(compute.getId()), Action.DELETE);
144
145     SessionContext context = createSessionContext();
146     ElementContext elementContext =
147         new ElementContext(compute.getVspId(), compute.getVersion().getId());
148     zusammenAdaptor.saveElement(context, elementContext, computeElement,
149         String.format("Delete compute with id %s", compute.getId()));
150   }
151
152   @Override
153   public ComputeEntity getQuestionnaireData(String vspId, Version version, String componentId,
154                                             String computeId) {
155     SessionContext context = createSessionContext();
156     ElementContext elementContext = new ElementContext(vspId, version.getId());
157
158     return getQuestionnaire(context, elementContext,
159         new ComputeEntity(vspId, version, componentId, computeId));
160   }
161
162   private ComputeEntity getQuestionnaire(SessionContext context, ElementContext elementContext,
163                                          ComputeEntity compute) {
164     Optional<Element> questionnaireElement = zusammenAdaptor
165         .getElementByName(context, elementContext, new Id(compute.getId()),
166             ElementType.ComputeQuestionnaire.name());
167     return questionnaireElement.map(
168         element -> element.getData() == null
169             ? null
170             : new String(FileUtils.toByteArray(element.getData())))
171         .map(questionnaireData -> {
172           compute.setQuestionnaireData(questionnaireData);
173           return compute;
174         })
175         .orElse(null);
176   }
177
178   @Override
179   public void updateQuestionnaireData(String vspId, Version version, String componentId,
180                                       String computeId, String questionnaireData) {
181     ZusammenElement questionnaireElement =
182         computeQuestionnaireToZusammen(questionnaireData, Action.UPDATE);
183
184     ZusammenElement computeElement = buildElement(new Id(computeId), Action.IGNORE);
185     computeElement.setSubElements(Collections.singletonList(questionnaireElement));
186
187     SessionContext context = createSessionContext();
188     ElementContext elementContext = new ElementContext(vspId, version.getId());
189     zusammenAdaptor.saveElement(context, elementContext, computeElement, "Update compute "
190         + "questionnaire");
191   }
192
193   @Override
194   public Collection<ComputeEntity> listByVsp(String vspId, Version version) {
195     SessionContext context = createSessionContext();
196     ElementContext elementContext = new ElementContext(vspId, version.getId());
197
198     Collection<ComponentEntity> components = ComponentDaoZusammenImpl
199         .listComponents(zusammenAdaptor, context, vspId, version);
200
201     return components.stream()
202         .map(component ->
203             listComputes(context, elementContext,
204                 new ComputeEntity(vspId, version, component.getId(), null)).stream()
205                 .map(compute -> getQuestionnaire(context, elementContext, compute))
206                 .collect(Collectors.toList()))
207         .flatMap(Collection::stream)
208         .collect(Collectors.toList());
209   }
210
211   @Override
212   public void deleteAll(String vspId, Version version) {
213
214     SessionContext context = createSessionContext();
215     ElementContext elementContext = new ElementContext(vspId, version.getId());
216
217     Optional<Element> optionalElement = zusammenAdaptor.getElementByName(context,
218         elementContext, null, ElementType.Computes.name());
219
220     if (optionalElement.isPresent()) {
221       Element computesElement = optionalElement.get();
222       Collection<Element> computes = computesElement.getSubElements();
223
224       computes.forEach(compute -> {
225         ZusammenElement computeElement = buildElement(compute.getElementId(), Action.DELETE);
226         zusammenAdaptor.saveElement(context, elementContext, computeElement,
227             "Delete compute with id " + compute.getElementId());
228       });
229     }
230   }
231
232   private ZusammenElement computeToZusammen(ComputeEntity compute, Action action) {
233     ZusammenElement computeElement = buildComputeElement(compute, action);
234     if (action == Action.CREATE) {
235       computeElement.setSubElements(Collections.singletonList(
236           computeQuestionnaireToZusammen(compute.getQuestionnaireData(), Action.CREATE)));
237     }
238     return computeElement;
239   }
240
241   private ZusammenElement computeQuestionnaireToZusammen(String questionnaireData,
242                                                          Action action) {
243     ZusammenElement questionnaireElement =
244         buildStructuralElement(ElementType.ComputeQuestionnaire, action);
245     questionnaireElement.setData(new ByteArrayInputStream(questionnaireData.getBytes()));
246     return questionnaireElement;
247   }
248
249   private ZusammenElement buildComputeElement(ComputeEntity compute, Action action) {
250     ZusammenElement computeElement =
251         buildElement(compute.getId() == null ? null : new Id(compute.getId()), action);
252     Info info = new Info();
253     info.addProperty(ElementPropertyName.elementType.name(), ElementType.Compute);
254     info.addProperty(ElementPropertyName.compositionData.name(), compute.getCompositionData());
255     computeElement.setInfo(info);
256     computeElement.setData(new ByteArrayInputStream(compute.getCompositionData().getBytes()));
257     return computeElement;
258   }
259 }