re base code
[sdc.git] / catalog-model / src / main / java / org / openecomp / sdc / be / model / jsontitan / operations / ExternalReferencesOperation.java
1 package org.openecomp.sdc.be.model.jsontitan.operations;
2
3
4 import fj.data.Either;
5 import org.openecomp.sdc.be.dao.api.ActionStatus;
6 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
7 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
8 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
9 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
10 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
11 import org.openecomp.sdc.be.datatypes.elements.MapComponentInstanceExternalRefs;
12 import org.openecomp.sdc.be.model.jsontitan.utils.IdMapper;
13 import org.openecomp.sdc.be.model.operations.impl.OperationUtils;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.stereotype.Component;
16
17 import java.util.*;
18
19 import static java.util.Collections.emptyMap;
20
21 /**
22  * Created by yavivi on 26/01/2018.
23  */
24 @Component
25 public class ExternalReferencesOperation extends BaseOperation {
26
27     @Autowired
28     private IdMapper idMapper;
29
30     @Autowired
31     private OperationUtils operationUtils;
32
33
34     /**
35      * Constructor
36      */
37     public ExternalReferencesOperation(TitanDao titanDao, NodeTypeOperation nto, TopologyTemplateOperation tto, IdMapper idMapper){
38         this.titanDao = titanDao;
39         this.topologyTemplateOperation = tto;
40         this.nodeTypeOperation = nto;
41         this.idMapper = idMapper;
42     }
43
44     public Either<String, ActionStatus> addExternalReferenceWithCommit(String serviceUuid, String componentInstanceName, String objectType, String reference) {
45         Either<String, ActionStatus> addResult = addExternalReference(serviceUuid, componentInstanceName, objectType, reference);
46         titanDao.commit();
47         return addResult;
48     }
49
50     public Either<String, ActionStatus> deleteExternalReferenceWithCommit(String serviceUuid, String componentInstanceName, String objectType, String reference) {
51         Either<String, ActionStatus> result = deleteExternalReference(serviceUuid, componentInstanceName, objectType, reference);
52         titanDao.commit();
53         return result;
54     }
55
56     public Either<String, ActionStatus> updateExternalReferenceWithCommit(String serviceVertexUuid, String componentInstanceName, String objectType, String oldRef, String newRef) {
57         Either<String, ActionStatus> updateResult = updateExternalReference(serviceVertexUuid, componentInstanceName, objectType, oldRef, newRef);
58         titanDao.commit();
59         return updateResult;
60     }
61
62     public Either<String, ActionStatus> addExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference) {
63
64         //Get Container vertex
65         Either<GraphVertex, TitanOperationStatus> vertexById = titanDao.getVertexById(assetUuid);
66         if (vertexById.isRight()){
67             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
68         }
69
70         GraphVertex serviceVertex = vertexById.left().value();
71
72         final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
73         if (compInstanceUniqueId == null) {
74             return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
75         }
76
77         //Get the external references map vertex
78         final Either<GraphVertex, TitanOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
79
80         //Check whether data vertex found
81         GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
82
83         //instanceId -> externalRefsMap
84         Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData;
85         if (externalRefsVertex == null) {
86             //External Refs vertex does not exist, create its map.
87             externalReferencesFullData = new HashMap<>();
88             externalReferencesFullData.put(compInstanceUniqueId, new MapComponentInstanceExternalRefs());
89         } else {
90             externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
91             externalReferencesFullData.computeIfAbsent(compInstanceUniqueId, k -> new MapComponentInstanceExternalRefs());
92         }
93
94         boolean isAdded = addExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, reference);
95         updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
96
97         return isAdded ? Either.left(reference) : Either.right(ActionStatus.EXT_REF_ALREADY_EXIST);
98     }
99
100     public Either<String, ActionStatus> deleteExternalReference(String assetUuid, String componentInstanceName, String objectType, String reference){
101         //Get Service vertex
102         Either<GraphVertex, TitanOperationStatus> vertexById = titanDao.getVertexById(assetUuid);
103         if (vertexById.isRight()){
104             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
105         }
106         GraphVertex serviceVertex = vertexById.left().value();
107
108         final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
109         if (compInstanceUniqueId == null) {
110             return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
111         }
112
113         //Get the external references map vertex
114         final Either<GraphVertex, TitanOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
115
116         //Check whether data vertex found
117         GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
118         boolean refDeleted = false;
119         if (externalRefsVertex != null) {
120             Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
121             if (externalReferencesFullData != null) {
122                 refDeleted = deleteExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, reference);
123                 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
124             }
125         }
126
127         if (refDeleted) {
128             return Either.left(reference);
129         } else {
130             return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
131         }
132     }
133
134     public Either<String, ActionStatus> updateExternalReference(String assetUuid, String componentInstanceName, String objectType, String oldRef, String newRef) {
135         //Get Service vertex
136         Either<GraphVertex, TitanOperationStatus> vertexById = titanDao.getVertexById(assetUuid);
137         if (vertexById.isRight()){
138             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
139         }
140
141         GraphVertex serviceVertex = vertexById.left().value();
142
143         //Map instance_name -> uuid
144         final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
145         if (compInstanceUniqueId == null) {
146             return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
147         }
148
149         //Get the external references map vertex
150         final Either<GraphVertex, TitanOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
151
152         //Check whether data vertex found
153         GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
154         boolean refReplaced = false;
155         if (externalRefsVertex != null) {
156             Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
157             if (externalReferencesFullData != null) {
158                 refReplaced = updateExternalRef(externalReferencesFullData, compInstanceUniqueId, objectType, oldRef, newRef);
159                 updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
160             }
161         }
162         if (refReplaced) {
163             return Either.left(newRef);
164         } else {
165             return Either.right(ActionStatus.EXT_REF_NOT_FOUND);
166         }
167     }
168
169     public Either<Map<String, List<String>>, ActionStatus> getExternalReferences(String assetUuid, String objectType) {
170         //Get Service vertex
171         Either<GraphVertex, TitanOperationStatus> vertexById = titanDao.getVertexById(assetUuid);
172         if (vertexById.isRight()){
173             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
174         }
175
176         GraphVertex serviceVertex = vertexById.left().value();
177
178         Map<String, List<String>> result = new HashMap();
179
180         //Get the external references map vertex
181         final Either<GraphVertex, TitanOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
182         //Check whether data vertex found
183         GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
184         if (externalRefsVertex != null) {
185             Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
186             if (externalReferencesFullData != null) {
187                 externalReferencesFullData.entrySet().forEach(
188                         s -> {
189                             List<String> externalRefsByObjectType = externalReferencesFullData.get(s.getKey()).getExternalRefsByObjectType(objectType);
190                             List<String> refList = externalRefsByObjectType == null ? new ArrayList<>() : externalRefsByObjectType;
191                             String key = idMapper.mapUniqueIdToComponentNameTo(s.getKey(), serviceVertex);
192                             result.put(key, refList);
193                         }
194                 );
195                 return Either.left(result);
196             }
197         }
198         //No external References Node found on this asset
199         return Either.left(new HashMap<>());
200     }
201
202     public void addAllExternalReferences(String containerUniqueId,
203                                          String compInstanceUniqueId,
204                                          Map<String, List<String>> instanceExternalReferences) {
205
206         GraphVertex serviceVertex = titanDao.getVertexById(containerUniqueId)
207                 .left()
208                 .on(operationUtils::onTitanOperationFailure);
209         Either<GraphVertex, TitanOperationStatus> dataVertex = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
210         Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData;
211         if (dataVertex.isLeft()) {
212             externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) dataVertex.left().value().getJson();
213         } else {
214             externalReferencesFullData = new HashMap<>();
215         }
216         externalReferencesFullData.put(compInstanceUniqueId, new MapComponentInstanceExternalRefs(instanceExternalReferences));
217         updateFullToscaData(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS, VertexTypeEnum.EXTERNAL_REF, externalReferencesFullData);
218     }
219
220     public Map<String, List<String>> getAllExternalReferences(String containerUniqueId,
221                                                               String compInstanceUniqueId) {
222         GraphVertex serviceVertex = titanDao.getVertexById(containerUniqueId)
223             .left()
224             .on(operationUtils::onTitanOperationFailure);
225
226         Either<GraphVertex, TitanOperationStatus> dataVertex = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
227         if (dataVertex.isRight()) {
228             return new HashMap<>();
229         }
230         GraphVertex externalRefsVertex = dataVertex.left().value();
231         Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = externalRefsVertex == null ? null : (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
232         if (externalReferencesFullData != null) {
233             return externalReferencesFullData
234                     .getOrDefault(compInstanceUniqueId, new MapComponentInstanceExternalRefs())
235                     .getComponentInstanceExternalRefs();
236         }
237         return emptyMap();
238     }
239
240     public Either<List<String>, ActionStatus> getExternalReferences(String assetUuid, String componentInstanceName, String objectType) {
241         //Get Service vertex
242         Either<GraphVertex, TitanOperationStatus> vertexById = titanDao.getVertexById(assetUuid);
243         if (vertexById.isRight()){
244             return Either.right(ActionStatus.RESOURCE_NOT_FOUND);
245         }
246
247         GraphVertex serviceVertex = vertexById.left().value();
248         final String compInstanceUniqueId = idMapper.mapComponentNameToUniqueId(componentInstanceName, serviceVertex);
249         if (compInstanceUniqueId == null) {
250             return Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
251         }
252
253         //Get the external references map vertex
254         final Either<GraphVertex, TitanOperationStatus> dataVertexResult = getDataVertex(serviceVertex, EdgeLabelEnum.EXTERNAL_REFS);
255
256         //Check whether data vertex found
257         GraphVertex externalRefsVertex = dataVertexResult.isLeft() ? dataVertexResult.left().value() : null;
258         if (externalRefsVertex != null) {
259             Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData = (Map<String, MapComponentInstanceExternalRefs>) externalRefsVertex.getJson();
260             if (externalReferencesFullData != null) {
261                 return Either.left(getExternalReferencesByObjectId(externalReferencesFullData, compInstanceUniqueId, objectType));
262             }
263         }
264
265         //No external References Node found on this asset
266         return Either.left(new LinkedList());
267     }
268
269     public IdMapper getIdMapper() {
270         return idMapper;
271     }
272
273     public void setIdMapper(IdMapper idMapper) {
274         this.idMapper = idMapper;
275     }
276
277     private List<String> getExternalReferencesByObjectId(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType) {
278         MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
279         List<String> externalRefsByObjectType = externalRefsMap.getExternalRefsByObjectType(objectType);
280         return externalRefsByObjectType != null ? externalRefsByObjectType : new LinkedList<>();
281     }
282
283     private boolean updateExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType, String oldRef, String newRef) {
284         MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
285         return externalRefsMap.replaceExternalRef(objectType, oldRef, newRef);
286     }
287
288     private boolean deleteExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType, String reference) {
289         MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
290         return externalRefsMap.deleteExternalRef(objectType, reference);
291     }
292
293     private boolean addExternalRef(Map<String, MapComponentInstanceExternalRefs> externalReferencesFullData, String componentInstanceId, String objectType, String reference) {
294         MapComponentInstanceExternalRefs externalRefsMap = externalReferencesFullData.get(componentInstanceId);
295         return externalRefsMap.addExternalRef(objectType, reference);
296     }
297 }