2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.be.model.operations.impl;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
27 import java.util.Map.Entry;
29 import com.thinkaurelius.titan.core.TitanTransaction;
30 import com.thinkaurelius.titan.core.TitanVertex;
32 import org.apache.commons.lang3.tuple.ImmutablePair;
33 import org.apache.tinkerpop.gremlin.structure.Vertex;
34 import org.openecomp.sdc.be.config.BeEcompErrorManager;
35 import org.openecomp.sdc.be.dao.graph.GraphElementFactory;
36 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
37 import org.openecomp.sdc.be.dao.graph.datatype.GraphElementTypeEnum;
38 import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation;
39 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
40 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
41 import org.openecomp.sdc.be.dao.titan.TitanGenericDao;
42 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
43 import org.openecomp.sdc.be.datatypes.elements.AdditionalInfoParameterDataDefinition;
44 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
45 import org.openecomp.sdc.be.model.AdditionalInfoParameterInfo;
46 import org.openecomp.sdc.be.model.AdditionalInformationDefinition;
47 import org.openecomp.sdc.be.model.operations.api.IAdditionalInformationOperation;
48 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
49 import org.openecomp.sdc.be.resources.data.AdditionalInfoParameterData;
50 import org.openecomp.sdc.be.resources.data.ResourceMetadataData;
51 import org.openecomp.sdc.be.resources.data.ServiceMetadataData;
52 import org.openecomp.sdc.be.resources.data.UniqueIdData;
53 import org.openecomp.sdc.common.config.EcompErrorName;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56 import org.springframework.stereotype.Component;
57 import org.springframework.util.AutoPopulatingList.ElementFactory;
59 import fj.data.Either;
61 @Component("additional-information-operation")
62 public class AdditionalInformationOperation implements IAdditionalInformationOperation {
64 public static final String EMPTY_VALUE = null;
65 public static final String PROPERTY = "property";
67 public AdditionalInformationOperation() {
71 private static Logger log = LoggerFactory.getLogger(AdditionalInformationOperation.class.getName());
73 @javax.annotation.Resource
74 private TitanGenericDao titanGenericDao;
77 public Either<AdditionalInformationDefinition, TitanOperationStatus> addAdditionalInformationParameter(
78 NodeTypeEnum nodeType, String componentId, String key, String value) {
80 TitanOperationStatus verifyNodeTypeVsComponent = verifyNodeTypeVsComponent(nodeType, componentId);
81 if (verifyNodeTypeVsComponent != TitanOperationStatus.OK) {
82 return Either.right(verifyNodeTypeVsComponent);
85 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao
86 .getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId,
87 GraphEdgeLabels.ADDITIONAL_INFORMATION, NodeTypeEnum.AdditionalInfoParameters,
88 AdditionalInfoParameterData.class);
90 if (getResult.isRight()) {
91 TitanOperationStatus status = getResult.right().value();
92 return Either.right(status);
95 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
96 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
97 Map<String, String> parameters = parameterData.getParameters();
98 if (parameters == null) {
99 parameters = new HashMap<String, String>();
100 parameterData.setParameters(parameters);
102 Map<String, String> idToKey = parameterData.getIdToKey();
103 if (idToKey == null) {
104 idToKey = new HashMap<String, String>();
105 parameterData.setIdToKey(idToKey);
108 Integer lastCreatedCounter = parameterData.getAdditionalInfoParameterDataDefinition().getLastCreatedCounter();
109 lastCreatedCounter++;
111 if (parameters.containsKey(key)) {
112 log.debug("The key {} already exists under component {}", key, componentId);
113 return Either.right(TitanOperationStatus.ALREADY_EXIST);
116 idToKey.put(String.valueOf(lastCreatedCounter), key);
117 parameters.put(key, value);
118 parameterData.getAdditionalInfoParameterDataDefinition().setLastCreatedCounter(lastCreatedCounter);
120 Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode = titanGenericDao.updateNode(parameterData,
121 AdditionalInfoParameterData.class);
123 if (updateNode.isRight()) {
124 TitanOperationStatus status = updateNode.right().value();
125 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeFailedUpdateNodeError,
126 "UpdateAdditionalInformationParameter",
127 "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
128 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("UpdateAdditionalInformationParameter",
129 "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
130 return Either.right(status);
133 AdditionalInformationDefinition informationDefinition = createInformationDefinitionFromNode(componentId,
134 parameters, idToKey, updateNode.left().value());
136 return Either.left(informationDefinition);
141 public Either<AdditionalInformationDefinition, TitanOperationStatus> updateAdditionalInformationParameter(
142 NodeTypeEnum nodeType, String componentId, String id, String key, String value) {
144 TitanOperationStatus verifyNodeTypeVsComponent = verifyNodeTypeVsComponent(nodeType, componentId);
145 if (verifyNodeTypeVsComponent != TitanOperationStatus.OK) {
146 return Either.right(verifyNodeTypeVsComponent);
149 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao
150 .getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId,
151 GraphEdgeLabels.ADDITIONAL_INFORMATION, NodeTypeEnum.AdditionalInfoParameters,
152 AdditionalInfoParameterData.class);
154 if (getResult.isRight()) {
155 TitanOperationStatus status = getResult.right().value();
156 return Either.right(status);
159 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
160 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
161 Map<String, String> parameters = parameterData.getParameters();
162 Map<String, String> idToKey = parameterData.getIdToKey();
163 if (idToKey == null || false == idToKey.containsKey(id)) {
164 return Either.right(TitanOperationStatus.INVALID_ID);
167 String origKey = idToKey.get(id);
169 if (false == origKey.equals(key)) {
170 if (parameters.containsKey(key)) {
171 log.debug("The key {} already exists", key);
172 return Either.right(TitanOperationStatus.ALREADY_EXIST);
174 String removed = parameters.remove(origKey);
175 log.trace("The key-value " + origKey + "=" + removed + " was removed from additionalInformation");
177 parameters.put(key, value);
178 idToKey.put(id, key);
180 Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode = titanGenericDao.updateNode(parameterData,
181 AdditionalInfoParameterData.class);
183 if (updateNode.isRight()) {
184 TitanOperationStatus status = updateNode.right().value();
185 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeFailedUpdateNodeError,
186 "UpdateAdditionalInformationParameter", "additional information of resource " + componentId,
187 String.valueOf(status));
188 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("UpdateAdditionalInformationParameter",
189 "additional information of resource " + componentId, String.valueOf(status));
190 return Either.right(status);
193 AdditionalInformationDefinition informationDefinition = createInformationDefinitionFromNode(componentId,
194 parameters, idToKey, updateNode.left().value());
196 return Either.left(informationDefinition);
201 public Either<AdditionalInformationDefinition, TitanOperationStatus> deleteAdditionalInformationParameter(
202 NodeTypeEnum nodeType, String componentId, String id) {
204 TitanOperationStatus verifyNodeTypeVsComponent = verifyNodeTypeVsComponent(nodeType, componentId);
205 if (verifyNodeTypeVsComponent != TitanOperationStatus.OK) {
206 return Either.right(verifyNodeTypeVsComponent);
209 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao
210 .getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId,
211 GraphEdgeLabels.ADDITIONAL_INFORMATION, NodeTypeEnum.AdditionalInfoParameters,
212 AdditionalInfoParameterData.class);
214 if (getResult.isRight()) {
215 TitanOperationStatus status = getResult.right().value();
216 return Either.right(status);
219 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
220 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
221 Map<String, String> parameters = parameterData.getParameters();
222 Map<String, String> idToKey = parameterData.getIdToKey();
224 if (idToKey == null || false == idToKey.containsKey(id)) {
225 return Either.right(TitanOperationStatus.INVALID_ID);
228 String key = idToKey.get(id);
229 String removedKey = idToKey.remove(id);
230 String removedValue = parameters.remove(key);
231 log.trace("The key-value " + removedKey + "=" + removedValue + " was removed from additionalInformation");
233 Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode = titanGenericDao.updateNode(parameterData,
234 AdditionalInfoParameterData.class);
236 if (updateNode.isRight()) {
237 TitanOperationStatus status = updateNode.right().value();
238 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeFailedUpdateNodeError,
239 "DeleteAdditionalInformationParameter",
240 "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
241 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("DeleteAdditionalInformationParameter",
242 "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
243 return Either.right(status);
246 AdditionalInformationDefinition informationDefinition = createInformationDefinitionFromNode(componentId,
247 parameters, idToKey, updateNode.left().value());
249 return Either.left(informationDefinition);
253 private AdditionalInformationDefinition createInformationDefinitionFromNode(String resourceId,
254 Map<String, String> parameters, Map<String, String> idToKey,
255 AdditionalInfoParameterData additionalInfoParameterData) {
256 AdditionalInfoParameterDataDefinition dataDefinition = additionalInfoParameterData
257 .getAdditionalInfoParameterDataDefinition();
259 AdditionalInformationDefinition informationDefinition = new AdditionalInformationDefinition(dataDefinition,
260 resourceId, convertParameters(parameters, idToKey));
261 return informationDefinition;
264 private List<AdditionalInfoParameterInfo> convertParameters(Map<String, String> parameters,
265 Map<String, String> idToKey) {
267 List<AdditionalInfoParameterInfo> list = new ArrayList<AdditionalInfoParameterInfo>();
269 if (parameters != null) {
270 for (Entry<String, String> idToKeyEntry : idToKey.entrySet()) {
272 String id = idToKeyEntry.getKey();
273 String key = idToKeyEntry.getValue();
275 String value = parameters.get(key);
277 AdditionalInfoParameterInfo parameterInfo = new AdditionalInfoParameterInfo(id, key, value);
278 list.add(parameterInfo);
287 public Either<AdditionalInfoParameterData, TitanOperationStatus> addAdditionalInformationNode(NodeTypeEnum nodeType,
288 String componentId) {
290 UniqueIdData from = new UniqueIdData(nodeType, componentId);
292 String uniqueId = UniqueIdBuilder.buildAdditionalInformationUniqueId(componentId);
293 AdditionalInfoParameterDataDefinition additionalInfoParameterDataDefinition = new AdditionalInfoParameterDataDefinition();
294 additionalInfoParameterDataDefinition.setUniqueId(uniqueId);
296 AdditionalInfoParameterData additionalInfoParameterData = new AdditionalInfoParameterData(
297 additionalInfoParameterDataDefinition, new HashMap<String, String>(), new HashMap<String, String>());
299 Either<AdditionalInfoParameterData, TitanOperationStatus> createNode = titanGenericDao
300 .createNode(additionalInfoParameterData, AdditionalInfoParameterData.class);
301 if (createNode.isRight()) {
302 TitanOperationStatus status = createNode.right().value();
303 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeFailedCreateNodeError,
304 "AddAdditionalInformationNode",
305 "additional information to " + nodeType.getName() + " " + componentId, String.valueOf(status));
306 BeEcompErrorManager.getInstance().logBeFailedCreateNodeError("AddAdditionalInformationNode", uniqueId,
307 String.valueOf(status));
308 return Either.right(status);
311 AdditionalInfoParameterData to = createNode.left().value();
313 Either<GraphRelation, TitanOperationStatus> createRelation = titanGenericDao.createRelation(from, to,
314 GraphEdgeLabels.ADDITIONAL_INFORMATION, null);
315 if (createRelation.isRight()) {
316 TitanOperationStatus status = createRelation.right().value();
317 return Either.right(status);
320 return Either.left(to);
324 public Either<TitanVertex, TitanOperationStatus> addAdditionalInformationNode(NodeTypeEnum nodeType,
325 String componentId, TitanVertex metadataVertex) {
327 String uniqueId = UniqueIdBuilder.buildAdditionalInformationUniqueId(componentId);
328 AdditionalInfoParameterDataDefinition additionalInfoParameterDataDefinition = new AdditionalInfoParameterDataDefinition();
329 additionalInfoParameterDataDefinition.setUniqueId(uniqueId);
331 AdditionalInfoParameterData additionalInfoParameterData = new AdditionalInfoParameterData(
332 additionalInfoParameterDataDefinition, new HashMap<String, String>(), new HashMap<String, String>());
334 Either<TitanVertex, TitanOperationStatus> createNode = titanGenericDao.createNode(additionalInfoParameterData);
335 if (createNode.isRight()) {
336 TitanOperationStatus status = createNode.right().value();
337 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeFailedCreateNodeError,
338 "AddAdditionalInformationNode",
339 "additional information to " + nodeType.getName() + " " + componentId, String.valueOf(status));
340 BeEcompErrorManager.getInstance().logBeFailedCreateNodeError("AddAdditionalInformationNode", uniqueId,
341 String.valueOf(status));
342 return Either.right(status);
345 TitanVertex additionalInfoVertex = createNode.left().value();
347 TitanOperationStatus createRelation = titanGenericDao.createEdge(metadataVertex, additionalInfoVertex,
348 GraphEdgeLabels.ADDITIONAL_INFORMATION, null);
350 if (!createRelation.equals(TitanOperationStatus.OK)) {
351 return Either.right(createRelation);
353 return Either.left(additionalInfoVertex);
356 public Either<AdditionalInformationDefinition, TitanOperationStatus> addAdditionalInformationNode(
357 NodeTypeEnum nodeType, String componentId, AdditionalInformationDefinition parameters) {
359 Either<AdditionalInfoParameterData, TitanOperationStatus> status = this.addAdditionalInformationNode(nodeType,
362 if (status.isRight()) {
363 return Either.right(status.right().value());
366 AdditionalInfoParameterData parameterData = status.left().value();
368 populateParameterNodeWithParameters(parameterData, parameters);
370 Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode = titanGenericDao.updateNode(parameterData,
371 AdditionalInfoParameterData.class);
373 if (updateNode.isRight()) {
374 return Either.right(updateNode.right().value());
377 AdditionalInformationDefinition informationDefinition = convertAdditionalInformationDataToDefinition(
378 updateNode.left().value(), componentId);
380 return Either.left(informationDefinition);
383 public TitanOperationStatus addAdditionalInformationNode(NodeTypeEnum nodeType, String componentId,
384 AdditionalInformationDefinition parameters, TitanVertex metadataVertex) {
386 Either<TitanVertex, TitanOperationStatus> status = this.addAdditionalInformationNode(nodeType, componentId,
389 if (status.isRight()) {
390 return status.right().value();
392 TitanVertex additionalInfoVertex = status.left().value();
394 Map<String, Object> newProp = titanGenericDao.getProperties(additionalInfoVertex);
395 AdditionalInfoParameterData parameterData = GraphElementFactory.createElement(
396 NodeTypeEnum.AdditionalInfoParameters.getName(), GraphElementTypeEnum.Node, newProp,
397 AdditionalInfoParameterData.class);
399 populateParameterNodeWithParameters(parameterData, parameters);
401 TitanOperationStatus updateNode = titanGenericDao.updateVertex(parameterData, additionalInfoVertex);
406 private void populateParameterNodeWithParameters(AdditionalInfoParameterData parameterData,
407 AdditionalInformationDefinition aiDefinition) {
409 if (aiDefinition != null) {
411 Integer lastCreatedCounter = aiDefinition.getLastCreatedCounter();
412 parameterData.getAdditionalInfoParameterDataDefinition().setLastCreatedCounter(lastCreatedCounter);
413 log.trace("Set last created counter of additional information to " + lastCreatedCounter);
415 List<AdditionalInfoParameterInfo> parameters = aiDefinition.getParameters();
416 if (parameters != null) {
418 Map<String, String> idToKey = new HashMap<String, String>();
419 Map<String, String> parametersMap = new HashMap<String, String>();
420 for (AdditionalInfoParameterInfo additionalInfoParameterInfo : parameters) {
421 String uniqueId = additionalInfoParameterInfo.getUniqueId();
422 String key = additionalInfoParameterInfo.getKey();
423 String value = additionalInfoParameterInfo.getValue();
425 if (key != null && false == key.isEmpty()) {
426 idToKey.put(uniqueId, key);
427 parametersMap.put(key, value);
430 parameterData.setIdToKey(idToKey);
431 parameterData.setParameters(parametersMap);
438 public TitanOperationStatus findResourceAllAdditionalInformationRecursively(String uniqueId,
439 List<AdditionalInformationDefinition> properties) {
441 log.trace("Going to fetch additional information under resource " + uniqueId);
442 TitanOperationStatus resourceCapabilitiesStatus = findAdditionalInformationOfNode(NodeTypeEnum.Resource,
443 uniqueId, properties);
445 if (!resourceCapabilitiesStatus.equals(TitanOperationStatus.OK)) {
446 return resourceCapabilitiesStatus;
449 Either<ImmutablePair<ResourceMetadataData, GraphEdge>, TitanOperationStatus> parentNodes = titanGenericDao
450 .getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Resource), uniqueId,
451 GraphEdgeLabels.DERIVED_FROM, NodeTypeEnum.Resource, ResourceMetadataData.class);
453 if (parentNodes.isRight()) {
454 TitanOperationStatus parentNodesStatus = parentNodes.right().value();
455 if (false == parentNodesStatus.equals(TitanOperationStatus.NOT_FOUND)) {
456 log.error("Failed to find parent additional information of resource " + uniqueId + ". status is "
457 + parentNodesStatus);
458 return parentNodesStatus;
462 if (parentNodes.isLeft()) {
463 ImmutablePair<ResourceMetadataData, GraphEdge> parnetNodePair = parentNodes.left().value();
464 String parentUniqueId = parnetNodePair.getKey().getMetadataDataDefinition().getUniqueId();
465 TitanOperationStatus addParentIntStatus = findResourceAllAdditionalInformationRecursively(parentUniqueId,
468 if (addParentIntStatus != TitanOperationStatus.OK) {
469 log.error("Failed to find all resource additional information of resource " + parentUniqueId);
470 return addParentIntStatus;
473 return TitanOperationStatus.OK;
478 public TitanOperationStatus findServiceAllAdditionalInformationRecursively(String uniqueId,
479 List<AdditionalInformationDefinition> properties) {
481 log.trace("Going to fetch additional information under service " + uniqueId);
482 TitanOperationStatus resourceCapabilitiesStatus = findAdditionalInformationOfNode(NodeTypeEnum.Service,
483 uniqueId, properties);
485 if (!resourceCapabilitiesStatus.equals(TitanOperationStatus.OK)) {
486 return resourceCapabilitiesStatus;
489 Either<ImmutablePair<ServiceMetadataData, GraphEdge>, TitanOperationStatus> parentNodes = titanGenericDao
490 .getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Service), uniqueId,
491 GraphEdgeLabels.DERIVED_FROM, NodeTypeEnum.Service, ServiceMetadataData.class);
493 if (parentNodes.isRight()) {
494 TitanOperationStatus parentNodesStatus = parentNodes.right().value();
495 if (false == parentNodesStatus.equals(TitanOperationStatus.NOT_FOUND)) {
496 log.error("Failed to find parent additional information of resource " + uniqueId + ". status is "
497 + parentNodesStatus);
498 return parentNodesStatus;
502 if (parentNodes.isLeft()) {
503 ImmutablePair<ServiceMetadataData, GraphEdge> parnetNodePair = parentNodes.left().value();
504 String parentUniqueId = parnetNodePair.getKey().getMetadataDataDefinition().getUniqueId();
505 TitanOperationStatus addParentIntStatus = findServiceAllAdditionalInformationRecursively(parentUniqueId,
508 if (addParentIntStatus != TitanOperationStatus.OK) {
509 log.error("Failed to find all resource additional information of resource " + parentUniqueId);
510 return addParentIntStatus;
513 return TitanOperationStatus.OK;
517 private TitanOperationStatus findAdditionalInformationOfNode(NodeTypeEnum nodeType, String uniqueId,
518 List<AdditionalInformationDefinition> properties) {
520 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> childNode = titanGenericDao
521 .getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), uniqueId, GraphEdgeLabels.ADDITIONAL_INFORMATION,
522 NodeTypeEnum.AdditionalInfoParameters, AdditionalInfoParameterData.class);
524 if (childNode.isRight()) {
525 TitanOperationStatus status = childNode.right().value();
526 if (status == TitanOperationStatus.NOT_FOUND) {
527 status = TitanOperationStatus.OK;
532 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = childNode.left().value();
533 AdditionalInfoParameterData propertyData = immutablePair.getKey();
535 Map<String, String> parameters = propertyData.getParameters();
536 if (parameters != null && false == parameters.isEmpty()) {
537 AdditionalInformationDefinition additionalInfoDef = this
538 .convertAdditionalInformationDataToDefinition(propertyData, uniqueId);
539 properties.add(additionalInfoDef);
542 return TitanOperationStatus.OK;
546 private AdditionalInformationDefinition convertAdditionalInformationDataToDefinition(
547 AdditionalInfoParameterData additionalInfoData, String uniqueId) {
549 Map<String, String> parameters = additionalInfoData.getParameters();
550 Map<String, String> idToKey = additionalInfoData.getIdToKey();
552 AdditionalInformationDefinition definition = new AdditionalInformationDefinition(
553 additionalInfoData.getAdditionalInfoParameterDataDefinition(), uniqueId,
554 convertParameters(parameters, idToKey));
559 public Either<AdditionalInformationDefinition, StorageOperationStatus> createAdditionalInformationParameter(
560 NodeTypeEnum nodeType, String resourceId, String key, String value, boolean inTransaction) {
562 Either<AdditionalInformationDefinition, StorageOperationStatus> result = null;
566 Either<AdditionalInformationDefinition, TitanOperationStatus> either = this
567 .addAdditionalInformationParameter(nodeType, resourceId, key, value);
569 if (either.isRight()) {
570 TitanOperationStatus status = either.right().value();
571 log.debug("Failed to add additional information property {} to component {}. Status is {}", key, resourceId, status);
572 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeFailedUpdateNodeError,
573 "additional information of " + nodeType.getName() + " " + resourceId, String.valueOf(status));
574 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("CreateAdditionalInformationParameter",
575 "additional information of " + nodeType.getName() + " " + resourceId, String.valueOf(status));
576 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
578 AdditionalInformationDefinition additionalInformationDefinition = either.left().value();
579 result = Either.left(additionalInformationDefinition);
584 commitOrRollback(inTransaction, result);
590 public Either<AdditionalInformationDefinition, StorageOperationStatus> updateAdditionalInformationParameter(
591 NodeTypeEnum nodeType, String resourceId, String id, String key, String value, boolean inTransaction) {
593 Either<AdditionalInformationDefinition, StorageOperationStatus> result = null;
597 Either<AdditionalInformationDefinition, TitanOperationStatus> either = this
598 .updateAdditionalInformationParameter(nodeType, resourceId, id, key, value);
600 if (either.isRight()) {
601 log.info("Failed to update additional information property " + key + " to component " + resourceId);
602 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(either.right().value()));
604 AdditionalInformationDefinition additionalInformationDefinition = either.left().value();
605 result = Either.left(additionalInformationDefinition);
611 commitOrRollback(inTransaction, result);
617 public Either<AdditionalInformationDefinition, StorageOperationStatus> deleteAdditionalInformationParameter(
618 NodeTypeEnum nodeType, String resourceId, String id, boolean inTransaction) {
620 Either<AdditionalInformationDefinition, StorageOperationStatus> result = null;
624 Either<AdditionalInformationDefinition, TitanOperationStatus> either = this
625 .deleteAdditionalInformationParameter(nodeType, resourceId, id);
627 if (either.isRight()) {
628 log.error("Failed to delete additional information id " + id + " to component " + resourceId);
629 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(either.right().value()));
631 AdditionalInformationDefinition additionalInformationDefinition = either.left().value();
632 result = Either.left(additionalInformationDefinition);
638 commitOrRollback(inTransaction, result);
644 public Either<Integer, StorageOperationStatus> getNumberOfAdditionalInformationParameters(NodeTypeEnum nodeType,
645 String resourceId, boolean inTransaction) {
647 Either<Integer, StorageOperationStatus> result = null;
651 Either<Integer, TitanOperationStatus> either = this.getNumberOfParameters(nodeType, resourceId);
653 if (either.isRight()) {
654 log.error("Failed to get the number of additional information properties in component " + resourceId);
655 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(either.right().value()));
657 Integer counter = either.left().value();
658 result = Either.left(counter);
663 if (false == inTransaction) {
664 if (result == null || result.isRight()) {
665 log.error("Going to execute rollback on graph.");
666 titanGenericDao.rollback();
668 log.debug("Going to execute commit on graph.");
669 titanGenericDao.commit();
677 public Either<Integer, TitanOperationStatus> getNumberOfParameters(NodeTypeEnum nodeType, String resourceId) {
679 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao
680 .getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), resourceId,
681 GraphEdgeLabels.ADDITIONAL_INFORMATION, NodeTypeEnum.AdditionalInfoParameters,
682 AdditionalInfoParameterData.class);
684 if (getResult.isRight()) {
685 TitanOperationStatus status = getResult.right().value();
686 return Either.right(status);
689 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
690 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
691 Map<String, String> parameters = parameterData.getParameters();
694 if (parameters != null) {
695 counter = parameters.size();
698 return Either.left(counter);
703 public Either<AdditionalInfoParameterInfo, TitanOperationStatus> getAdditionalInformationParameter(
704 NodeTypeEnum nodeType, String componentId, String id) {
706 TitanOperationStatus verifyNodeTypeVsComponent = verifyNodeTypeVsComponent(nodeType, componentId);
707 if (verifyNodeTypeVsComponent != TitanOperationStatus.OK) {
708 return Either.right(verifyNodeTypeVsComponent);
711 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao
712 .getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId,
713 GraphEdgeLabels.ADDITIONAL_INFORMATION, NodeTypeEnum.AdditionalInfoParameters,
714 AdditionalInfoParameterData.class);
716 if (getResult.isRight()) {
717 TitanOperationStatus status = getResult.right().value();
718 return Either.right(status);
721 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
722 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
723 Map<String, String> parameters = parameterData.getParameters();
724 Map<String, String> idToKey = parameterData.getIdToKey();
726 if (idToKey == null || false == idToKey.containsKey(id)) {
727 return Either.right(TitanOperationStatus.INVALID_ID);
730 String key = idToKey.get(id);
731 String value = parameters.get(key);
733 log.trace("The key-value " + key + "=" + value + " was retrieved for id " + id);
735 Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode = titanGenericDao.updateNode(parameterData,
736 AdditionalInfoParameterData.class);
738 if (updateNode.isRight()) {
739 TitanOperationStatus status = updateNode.right().value();
740 if (status != TitanOperationStatus.NOT_FOUND) {
741 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeFailedRetrieveNodeError,
742 "GetAdditionnalInformationParameter",
743 "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
744 BeEcompErrorManager.getInstance().logBeFailedRetrieveNodeError("GetAdditionnalInformationParameter",
745 "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
747 return Either.right(status);
750 AdditionalInfoParameterInfo additionalInfoParameterInfo = new AdditionalInfoParameterInfo(id, key, value);
752 return Either.left(additionalInfoParameterInfo);
757 public Either<AdditionalInformationDefinition, TitanOperationStatus> getAllAdditionalInformationParameters(
758 NodeTypeEnum nodeType, String componentId, boolean ignoreVerification) {
760 if (false == ignoreVerification) {
761 TitanOperationStatus verifyNodeTypeVsComponent = verifyNodeTypeVsComponent(nodeType, componentId);
762 if (verifyNodeTypeVsComponent != TitanOperationStatus.OK) {
763 return Either.right(verifyNodeTypeVsComponent);
767 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao
768 .getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId,
769 GraphEdgeLabels.ADDITIONAL_INFORMATION, NodeTypeEnum.AdditionalInfoParameters,
770 AdditionalInfoParameterData.class);
772 if (getResult.isRight()) {
773 TitanOperationStatus status = getResult.right().value();
774 if (status != TitanOperationStatus.NOT_FOUND) {
775 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeFailedRetrieveNodeError,
776 "GetAdditionnalInformationParameters",
777 "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
778 BeEcompErrorManager.getInstance().logBeFailedRetrieveNodeError("GetAdditionnalInformationParameters",
779 "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
781 return Either.right(status);
784 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
785 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
786 Map<String, String> parameters = parameterData.getParameters();
787 Map<String, String> idToKey = parameterData.getIdToKey();
789 AdditionalInformationDefinition informationDefinition = createInformationDefinitionFromNode(componentId,
790 parameters, idToKey, parameterData);
792 return Either.left(informationDefinition);
797 public Either<AdditionalInformationDefinition, StorageOperationStatus> getAllAdditionalInformationParameters(
798 NodeTypeEnum nodeType, String resourceId, boolean ignoreVerification, boolean inTransaction) {
800 Either<AdditionalInformationDefinition, StorageOperationStatus> result = null;
804 Either<AdditionalInformationDefinition, TitanOperationStatus> either = this
805 .getAllAdditionalInformationParameters(nodeType, resourceId, ignoreVerification);
807 if (either.isRight()) {
808 TitanOperationStatus status = either.right().value();
809 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
811 AdditionalInformationDefinition additionalInformationDefinition = either.left().value();
812 result = Either.left(additionalInformationDefinition);
818 commitOrRollback(inTransaction, result);
823 private void commitOrRollback(boolean inTransaction, Either<? extends Object, StorageOperationStatus> result) {
825 if (false == inTransaction) {
826 if (result == null || result.isRight()) {
827 log.error("Going to execute rollback on graph.");
828 titanGenericDao.rollback();
830 log.debug("Going to execute commit on graph.");
831 titanGenericDao.commit();
836 private void commitOrRollbackTx(TitanTransaction tx, boolean inTransaction,
837 Either<? extends Object, StorageOperationStatus> result) {
839 if (false == inTransaction) {
840 if (result == null || result.isRight()) {
841 log.error("Going to execute rollback on graph.");
844 log.debug("Going to execute commit on graph.");
851 public Either<AdditionalInfoParameterInfo, StorageOperationStatus> getAdditionalInformationParameter(
852 NodeTypeEnum nodeType, String resourceId, String id, boolean inTransaction) {
854 Either<AdditionalInfoParameterInfo, StorageOperationStatus> result = null;
858 Either<AdditionalInfoParameterInfo, TitanOperationStatus> either = this
859 .getAdditionalInformationParameter(nodeType, resourceId, id);
861 if (either.isRight()) {
862 log.error("Failed to fetch additional information property with id " + id + " of component "
864 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(either.right().value()));
866 AdditionalInfoParameterInfo additionalInformationDefinition = either.left().value();
867 result = Either.left(additionalInformationDefinition);
873 commitOrRollback(inTransaction, result);
878 public Either<AdditionalInformationDefinition, StorageOperationStatus> deleteAllAdditionalInformationParameters(
879 NodeTypeEnum nodeType, String resourceId, boolean inTransaction) {
881 Either<AdditionalInformationDefinition, StorageOperationStatus> result = null;
885 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao
886 .getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), resourceId,
887 GraphEdgeLabels.ADDITIONAL_INFORMATION, NodeTypeEnum.AdditionalInfoParameters,
888 AdditionalInfoParameterData.class);
890 if (getResult.isRight()) {
891 TitanOperationStatus status = getResult.right().value();
892 if (status == TitanOperationStatus.NOT_FOUND) {
893 return Either.right(StorageOperationStatus.OK);
895 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeFailedDeleteNodeError,
896 "DeleteAdditionalInformationNode",
897 "additional information of " + nodeType.getName() + " " + resourceId,
898 String.valueOf(status));
899 BeEcompErrorManager.getInstance().logBeFailedDeleteNodeError("DeleteAdditionalInformationNode",
900 "additional information of " + nodeType.getName() + " " + resourceId,
901 String.valueOf(status));
902 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
907 ImmutablePair<AdditionalInfoParameterData, GraphEdge> value = getResult.left().value();
908 AdditionalInfoParameterData parameterData = value.getLeft();
910 Either<AdditionalInfoParameterData, TitanOperationStatus> deleteNodeRes = titanGenericDao
911 .deleteNode(parameterData, AdditionalInfoParameterData.class);
912 if (deleteNodeRes.isRight()) {
913 TitanOperationStatus status = getResult.right().value();
914 BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeFailedDeleteNodeError,
915 "DeleteAdditionalInformationNode", (String) parameterData.getUniqueId(),
916 String.valueOf(status));
917 BeEcompErrorManager.getInstance().logBeFailedDeleteNodeError("DeleteAdditionalInformationNode",
918 (String) parameterData.getUniqueId(), String.valueOf(status));
919 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
923 AdditionalInformationDefinition informationDefinition = convertAdditionalInformationDataToDefinition(
924 deleteNodeRes.left().value(), resourceId);
926 result = Either.left(informationDefinition);
931 commitOrRollback(inTransaction, result);
935 private TitanOperationStatus verifyNodeTypeVsComponent(NodeTypeEnum nodeType, String componentId) {
936 Either<TitanVertex, TitanOperationStatus> vertexByProperty = titanGenericDao
937 .getVertexByProperty(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId);
938 if (vertexByProperty.isRight()) {
939 TitanOperationStatus status = vertexByProperty.right().value();
940 if (status == TitanOperationStatus.NOT_FOUND) {
941 status = TitanOperationStatus.INVALID_ID;
945 Vertex v = vertexByProperty.left().value();
946 String label = (String) v.property(GraphPropertiesDictionary.LABEL.getProperty()).value();
948 if (false == label.equals(nodeType.getName())) {
949 log.debug("The node type {} is not appropriate to component {}", nodeType, componentId);
950 return TitanOperationStatus.INVALID_ID;
953 log.debug("The node type {} with id {} does not have a label property.", nodeType, componentId);
954 return TitanOperationStatus.INVALID_ID;
957 return TitanOperationStatus.OK;