Add collaboration feature
[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 / ProcessDaoZusammenImpl.java
1 package org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen;
2
3 import com.amdocs.zusammen.adaptor.inbound.api.types.item.Element;
4 import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo;
5 import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement;
6 import com.amdocs.zusammen.datatypes.Id;
7 import com.amdocs.zusammen.datatypes.SessionContext;
8 import com.amdocs.zusammen.datatypes.item.Action;
9 import com.amdocs.zusammen.datatypes.item.ElementContext;
10 import com.amdocs.zusammen.datatypes.item.Info;
11 import org.openecomp.core.zusammen.api.ZusammenAdaptor;
12 import org.openecomp.sdc.datatypes.model.ElementType;
13 import org.openecomp.sdc.vendorsoftwareproduct.dao.ProcessDao;
14 import org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToProcessConvertor;
15 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ProcessEntity;
16 import org.openecomp.sdc.versioning.dao.types.Version;
17 import org.openecomp.types.ElementPropertyName;
18
19 import java.io.ByteArrayInputStream;
20 import java.util.ArrayList;
21 import java.util.Collection;
22 import java.util.Objects;
23 import java.util.Optional;
24 import java.util.stream.Collectors;
25
26 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildElement;
27 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildStructuralElement;
28 import static org.openecomp.core.zusammen.api.ZusammenUtil.createSessionContext;
29 import static org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToProcessConvertor.ARTIFACT_NAME;
30 import static org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToProcessConvertor.DESCRIPTION;
31 import static org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToProcessConvertor.NAME;
32 import static org.openecomp.sdc.vendorsoftwareproduct.dao.impl.zusammen.convertor.ElementToProcessConvertor.PROCESS_TYPE;
33
34 /**
35  * @author Avrahamg.
36  * @since March 23, 2017
37  */
38 public class ProcessDaoZusammenImpl implements ProcessDao {
39
40   private ZusammenAdaptor zusammenAdaptor;
41
42   public ProcessDaoZusammenImpl(ZusammenAdaptor zusammenAdaptor) {
43     this.zusammenAdaptor = zusammenAdaptor;
44   }
45
46   @Override
47   public void registerVersioning(String versionableEntityType) {
48
49   }
50
51   @Override
52   public void create(ProcessEntity processEntity) {
53     ZusammenElement processElement = buildProcessElement(processEntity, Action.CREATE);
54
55     ZusammenElement processesElement =
56         buildStructuralElement(ElementType.Processes, Action.IGNORE);
57     ZusammenElement aggregatedElement = VspZusammenUtil.aggregateElements(processesElement,
58         processElement);
59     ZusammenElement componentElement;
60     if (processEntity.getComponentId() != null) {
61       componentElement = buildElement(new Id(processEntity.getComponentId()), Action.IGNORE);
62       aggregatedElement =
63           VspZusammenUtil.aggregateElements(componentElement, aggregatedElement);
64     }
65
66     SessionContext context = createSessionContext();
67     ElementContext elementContext =
68         new ElementContext(processEntity.getVspId(), processEntity.getVersion().getId());
69
70     Element savedElement =
71         zusammenAdaptor.saveElement(context, elementContext, aggregatedElement, "Create process");
72     processEntity
73         .setId(processEntity.getComponentId() == null
74             ? savedElement.getSubElements().iterator().next().getElementId().getValue()
75             : savedElement.getSubElements().iterator().next().getSubElements()
76                 .iterator().next().getElementId().getValue());
77   }
78
79   @Override
80   public ProcessEntity get(ProcessEntity processEntity) {
81     SessionContext context = createSessionContext();
82     ElementContext elementContext =
83         new ElementContext(processEntity.getVspId(), processEntity.getVersion().getId());
84
85     return zusammenAdaptor.getElementInfo(context, elementContext, new Id(processEntity.getId()))
86         .map(elementInfo -> convertToProcessEntity(elementInfo, new ElementToProcessConvertor(),
87             processEntity))
88         .orElse(null);
89   }
90
91   @Override
92   public void update(ProcessEntity processEntity) {
93     ProcessEntity retrieved = getArtifact(processEntity);
94     if (retrieved != null && retrieved.getArtifact() != null) {
95       processEntity.setArtifactName(retrieved.getArtifactName());
96       processEntity.setArtifact(retrieved.getArtifact());
97     }
98
99     update(processEntity, "Update process");
100   }
101
102   @Override
103   public void delete(ProcessEntity processEntity) {
104     ZusammenElement processElement = buildElement(new Id(processEntity.getId()), Action.DELETE);
105
106     SessionContext context = createSessionContext();
107     ElementContext elementContext =
108         new ElementContext(processEntity.getVspId(), processEntity.getVersion().getId());
109
110     zusammenAdaptor.saveElement(context, elementContext, processElement,
111         String.format("Delete process with id %s", processEntity.getId()));
112   }
113
114   @Override
115   public void deleteAll(ProcessEntity processEntity) {
116     SessionContext context = createSessionContext();
117     ElementContext elementContext =
118         new ElementContext(processEntity.getVspId(), processEntity.getVersion().getId());
119
120     Optional<Element> optionalElement = zusammenAdaptor.getElementByName(context,
121         elementContext, new Id(processEntity.getComponentId()), ElementType.Processes.name());
122
123   /*  ZusammenElement aggregatedElement =
124         buildStructuralElement(ElementType.Processes, Action.DELETE);
125
126     if (processEntity.getComponentId() != null) {
127       ZusammenElement componentElement = createParentElement(processEntity);
128       aggregatedElement = VspaggregateElements(componentElement,
129           aggregatedElement);
130     }
131
132     zusammenAdaptor.saveElement(context, elementContext, aggregatedElement, "Delete All
133     processes");*/
134
135     if (optionalElement.isPresent()) {
136       Element processesElement = optionalElement.get();
137       Collection<Element> processes = processesElement.getSubElements();
138
139       processes.forEach(process -> {
140         ZusammenElement processZusammenElement =
141             buildElement(process.getElementId(), Action.DELETE);
142         zusammenAdaptor.saveElement(context, elementContext, processZusammenElement,
143             "Delete Process with id " + process.getElementId());
144       });
145     }
146   }
147
148   @Override
149   public void deleteVspAll(String vspId, Version version) {
150     /* ProcessEntity processEntity = new ProcessEntity();
151     processEntity.setVersion(version);
152     processEntity.setVspId(vspId);
153     deleteAll(processEntity); */
154
155     SessionContext context = createSessionContext();
156     ElementContext elementContext =
157         new ElementContext(vspId, version.getId());
158
159     Optional<Element> optionalElement = zusammenAdaptor.getElementByName(context,
160         elementContext, null, ElementType.Processes.name());
161
162     if (optionalElement.isPresent()) {
163       Element processesElement = optionalElement.get();
164       Collection<Element> processes = processesElement.getSubElements();
165
166       processes.forEach(process -> {
167         ZusammenElement processZusammenElement =
168             buildElement(process.getElementId(), Action.DELETE);
169         zusammenAdaptor.saveElement(context, elementContext, processZusammenElement,
170             "Delete Process with id " + process.getElementId());
171       });
172     }
173   }
174
175   @Override
176   public ProcessEntity getArtifact(ProcessEntity processEntity) {
177     SessionContext context = createSessionContext();
178     ElementContext elementContext =
179         new ElementContext(processEntity.getVspId(), processEntity.getVersion().getId());
180
181     return zusammenAdaptor.getElement(context, elementContext, processEntity.getId())
182         .map(element -> {
183           ProcessEntity process = new ElementToProcessConvertor().convert(element);
184           process.setVspId(processEntity.getVspId());
185           process.setVersion(processEntity.getVersion());
186           process.setComponentId(processEntity.getComponentId());
187           return process;
188         })
189         .orElse(null);
190   }
191
192   @Override
193   public void uploadArtifact(ProcessEntity processEntity) {
194     ProcessEntity retrieved = get(processEntity);
195     if (retrieved != null) {
196       retrieved.setArtifactName(processEntity.getArtifactName());
197       retrieved.setArtifact(processEntity.getArtifact());
198
199       update(retrieved, "Upload process artifact");
200     }
201   }
202
203   @Override
204   public void deleteArtifact(ProcessEntity processEntity) {
205     ProcessEntity retrieved = get(processEntity);
206     if (retrieved != null) {
207       retrieved.setArtifactName(null);
208       retrieved.setArtifact(null);
209
210       update(retrieved, "Delete process artifact");
211     }
212   }
213
214   @Override
215   public Collection<ProcessEntity> list(ProcessEntity processEntity) {
216     SessionContext context = createSessionContext();
217     ElementContext elementContext =
218         new ElementContext(processEntity.getVspId(), processEntity.getVersion().getId());
219
220     Optional<ElementInfo> processesOptional =
221         zusammenAdaptor.getElementInfoByName(context, elementContext,
222             extractParentElementId(processEntity), ElementType.Processes.name());
223     if (!processesOptional.isPresent()) {
224       return new ArrayList<>();
225     }
226     ElementToProcessConvertor convertor = new ElementToProcessConvertor();
227     return zusammenAdaptor.listElements(context, elementContext, processesOptional.get().getId())
228         .stream()
229         .map(elementInfo -> convertToProcessEntity(elementInfo, convertor, processEntity))
230         .collect(Collectors.toList());
231   }
232
233   private ProcessEntity convertToProcessEntity(ElementInfo elementInfo,
234                                                ElementToProcessConvertor convertor,
235                                                ProcessEntity inputProcess) {
236     ProcessEntity process = convertor.convert(elementInfo);
237     process.setVspId(inputProcess.getVspId());
238     process.setVersion(inputProcess.getVersion());
239     process.setComponentId(inputProcess.getComponentId());
240     return process;
241   }
242
243   private void update(ProcessEntity processEntity, String message) {
244     ZusammenElement processElement = buildProcessElement(processEntity, Action.UPDATE);
245
246     SessionContext context = createSessionContext();
247     ElementContext elementContext =
248         new ElementContext(processEntity.getVspId(), processEntity.getVersion().getId());
249
250     zusammenAdaptor.saveElement(context, elementContext, processElement, message);
251   }
252
253   private Id extractParentElementId(ProcessEntity processEntity) {
254     return processEntity.getComponentId() == null ? null : new Id(processEntity.getComponentId());
255   }
256
257   private ZusammenElement buildProcessElement(ProcessEntity process, Action action) {
258
259     Info info = new Info();
260     info.setName(process.getName());
261     info.addProperty(NAME, process.getName());
262     info.addProperty(ElementPropertyName.elementType.name(), ElementType.Process);
263     info.addProperty(ARTIFACT_NAME, process.getArtifactName());
264     info.addProperty(DESCRIPTION, process.getDescription());
265     info.addProperty(PROCESS_TYPE, process.getType() != null ? process.getType().name() : null);
266
267     ZusammenElement processElement = buildElement(new Id(process.getId()), action);
268     processElement.setInfo(info);
269     if (Objects.nonNull(process.getArtifact())) {
270       processElement.setData(new ByteArrayInputStream(process.getArtifact().array()));
271     }
272     return processElement;
273   }
274
275 }