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 org.apache.commons.lang3.tuple.ImmutablePair;
30 import org.apache.tinkerpop.gremlin.structure.Vertex;
31 import org.openecomp.sdc.be.config.BeEcompErrorManager;
32 import org.openecomp.sdc.be.dao.graph.GraphElementFactory;
33 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
34 import org.openecomp.sdc.be.dao.graph.datatype.GraphElementTypeEnum;
35 import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation;
36 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
37 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
38 import org.openecomp.sdc.be.dao.titan.TitanGenericDao;
39 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
40 import org.openecomp.sdc.be.datatypes.elements.AdditionalInfoParameterDataDefinition;
41 import org.openecomp.sdc.be.datatypes.elements.AdditionalInfoParameterInfo;
42 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
43 import org.openecomp.sdc.be.model.AdditionalInformationDefinition;
44 import org.openecomp.sdc.be.model.operations.api.IAdditionalInformationOperation;
45 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
46 import org.openecomp.sdc.be.resources.data.AdditionalInfoParameterData;
47 import org.openecomp.sdc.be.resources.data.ResourceMetadataData;
48 import org.openecomp.sdc.be.resources.data.ServiceMetadataData;
49 import org.openecomp.sdc.be.resources.data.UniqueIdData;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52 import org.springframework.stereotype.Component;
54 import com.thinkaurelius.titan.core.TitanVertex;
56 import fj.data.Either;
58 @Component("additional-information-operation")
59 public class AdditionalInformationOperation implements IAdditionalInformationOperation {
61 public static final String EMPTY_VALUE = null;
63 public AdditionalInformationOperation() {
67 private static Logger log = LoggerFactory.getLogger(AdditionalInformationOperation.class.getName());
69 @javax.annotation.Resource
70 private TitanGenericDao titanGenericDao;
73 public Either<AdditionalInformationDefinition, TitanOperationStatus> addAdditionalInformationParameter(NodeTypeEnum nodeType, String componentId, String key, String value) {
75 TitanOperationStatus verifyNodeTypeVsComponent = verifyNodeTypeVsComponent(nodeType, componentId);
76 if (verifyNodeTypeVsComponent != TitanOperationStatus.OK) {
77 return Either.right(verifyNodeTypeVsComponent);
80 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId, GraphEdgeLabels.ADDITIONAL_INFORMATION,
81 NodeTypeEnum.AdditionalInfoParameters, AdditionalInfoParameterData.class);
83 if (getResult.isRight()) {
84 TitanOperationStatus status = getResult.right().value();
85 return Either.right(status);
88 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
89 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
90 Map<String, String> parameters = parameterData.getParameters();
91 if (parameters == null) {
92 parameters = new HashMap<String, String>();
93 parameterData.setParameters(parameters);
95 Map<String, String> idToKey = parameterData.getIdToKey();
96 if (idToKey == null) {
97 idToKey = new HashMap<String, String>();
98 parameterData.setIdToKey(idToKey);
101 Integer lastCreatedCounter = parameterData.getAdditionalInfoParameterDataDefinition().getLastCreatedCounter();
102 lastCreatedCounter++;
104 if (parameters.containsKey(key)) {
105 log.debug("The key {} already exists under component {}", key, componentId);
106 return Either.right(TitanOperationStatus.ALREADY_EXIST);
109 idToKey.put(String.valueOf(lastCreatedCounter), key);
110 parameters.put(key, value);
111 parameterData.getAdditionalInfoParameterDataDefinition().setLastCreatedCounter(lastCreatedCounter);
113 Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode = titanGenericDao.updateNode(parameterData, AdditionalInfoParameterData.class);
115 if (updateNode.isRight()) {
116 TitanOperationStatus status = updateNode.right().value();
117 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("UpdateAdditionalInformationParameter", "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
118 return Either.right(status);
121 AdditionalInformationDefinition informationDefinition = createInformationDefinitionFromNode(componentId, parameters, idToKey, updateNode.left().value());
123 return Either.left(informationDefinition);
128 public Either<AdditionalInformationDefinition, TitanOperationStatus> updateAdditionalInformationParameter(NodeTypeEnum nodeType, String componentId, String id, String key, String value) {
130 TitanOperationStatus verifyNodeTypeVsComponent = verifyNodeTypeVsComponent(nodeType, componentId);
131 if (verifyNodeTypeVsComponent != TitanOperationStatus.OK) {
132 return Either.right(verifyNodeTypeVsComponent);
135 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId, GraphEdgeLabels.ADDITIONAL_INFORMATION,
136 NodeTypeEnum.AdditionalInfoParameters, AdditionalInfoParameterData.class);
138 if (getResult.isRight()) {
139 TitanOperationStatus status = getResult.right().value();
140 return Either.right(status);
143 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
144 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
145 Map<String, String> parameters = parameterData.getParameters();
146 Map<String, String> idToKey = parameterData.getIdToKey();
147 if (idToKey == null || false == idToKey.containsKey(id)) {
148 return Either.right(TitanOperationStatus.INVALID_ID);
151 String origKey = idToKey.get(id);
153 if (false == origKey.equals(key)) {
154 if (parameters.containsKey(key)) {
155 log.debug("The key {} already exists", key);
156 return Either.right(TitanOperationStatus.ALREADY_EXIST);
158 String removed = parameters.remove(origKey);
159 log.trace("The key-value {} = {} was removed from additionalInformation", origKey, removed);
161 parameters.put(key, value);
162 idToKey.put(id, key);
164 Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode = titanGenericDao.updateNode(parameterData, AdditionalInfoParameterData.class);
166 if (updateNode.isRight()) {
167 TitanOperationStatus status = updateNode.right().value();
168 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("UpdateAdditionalInformationParameter", "additional information of resource " + componentId, String.valueOf(status));
169 return Either.right(status);
172 AdditionalInformationDefinition informationDefinition = createInformationDefinitionFromNode(componentId, parameters, idToKey, updateNode.left().value());
174 return Either.left(informationDefinition);
179 public Either<AdditionalInformationDefinition, TitanOperationStatus> deleteAdditionalInformationParameter(NodeTypeEnum nodeType, String componentId, String id) {
181 TitanOperationStatus verifyNodeTypeVsComponent = verifyNodeTypeVsComponent(nodeType, componentId);
182 if (verifyNodeTypeVsComponent != TitanOperationStatus.OK) {
183 return Either.right(verifyNodeTypeVsComponent);
186 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId, GraphEdgeLabels.ADDITIONAL_INFORMATION,
187 NodeTypeEnum.AdditionalInfoParameters, AdditionalInfoParameterData.class);
189 if (getResult.isRight()) {
190 TitanOperationStatus status = getResult.right().value();
191 return Either.right(status);
194 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
195 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
196 Map<String, String> parameters = parameterData.getParameters();
197 Map<String, String> idToKey = parameterData.getIdToKey();
199 if (idToKey == null || false == idToKey.containsKey(id)) {
200 return Either.right(TitanOperationStatus.INVALID_ID);
203 String key = idToKey.get(id);
204 String removedKey = idToKey.remove(id);
205 String removedValue = parameters.remove(key);
206 log.trace("The key-value {} = {} was removed from additionalInformation", removedKey, removedValue);
208 Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode = titanGenericDao.updateNode(parameterData, AdditionalInfoParameterData.class);
210 if (updateNode.isRight()) {
211 TitanOperationStatus status = updateNode.right().value();
212 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("DeleteAdditionalInformationParameter", "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
213 return Either.right(status);
216 AdditionalInformationDefinition informationDefinition = createInformationDefinitionFromNode(componentId, parameters, idToKey, updateNode.left().value());
218 return Either.left(informationDefinition);
222 private AdditionalInformationDefinition createInformationDefinitionFromNode(String resourceId, Map<String, String> parameters, Map<String, String> idToKey, AdditionalInfoParameterData additionalInfoParameterData) {
223 AdditionalInfoParameterDataDefinition dataDefinition = additionalInfoParameterData.getAdditionalInfoParameterDataDefinition();
225 AdditionalInformationDefinition informationDefinition = new AdditionalInformationDefinition(dataDefinition, resourceId, convertParameters(parameters, idToKey));
226 return informationDefinition;
229 private List<AdditionalInfoParameterInfo> convertParameters(Map<String, String> parameters, Map<String, String> idToKey) {
231 List<AdditionalInfoParameterInfo> list = new ArrayList<AdditionalInfoParameterInfo>();
233 if (parameters != null) {
234 for (Entry<String, String> idToKeyEntry : idToKey.entrySet()) {
236 String id = idToKeyEntry.getKey();
237 String key = idToKeyEntry.getValue();
239 String value = parameters.get(key);
241 AdditionalInfoParameterInfo parameterInfo = new AdditionalInfoParameterInfo(id, key, value);
242 list.add(parameterInfo);
251 public Either<AdditionalInfoParameterData, TitanOperationStatus> addAdditionalInformationNode(NodeTypeEnum nodeType, String componentId) {
253 UniqueIdData from = new UniqueIdData(nodeType, componentId);
255 String uniqueId = UniqueIdBuilder.buildAdditionalInformationUniqueId(componentId);
256 AdditionalInfoParameterDataDefinition additionalInfoParameterDataDefinition = new AdditionalInfoParameterDataDefinition();
257 additionalInfoParameterDataDefinition.setUniqueId(uniqueId);
259 AdditionalInfoParameterData additionalInfoParameterData = new AdditionalInfoParameterData(additionalInfoParameterDataDefinition, new HashMap<String, String>(), new HashMap<String, String>());
261 Either<AdditionalInfoParameterData, TitanOperationStatus> createNode = titanGenericDao.createNode(additionalInfoParameterData, AdditionalInfoParameterData.class);
262 if (createNode.isRight()) {
263 TitanOperationStatus status = createNode.right().value();
264 BeEcompErrorManager.getInstance().logBeFailedCreateNodeError("AddAdditionalInformationNode", uniqueId, String.valueOf(status));
265 return Either.right(status);
268 AdditionalInfoParameterData to = createNode.left().value();
270 Either<GraphRelation, TitanOperationStatus> createRelation = titanGenericDao.createRelation(from, to, GraphEdgeLabels.ADDITIONAL_INFORMATION, null);
271 if (createRelation.isRight()) {
272 TitanOperationStatus status = createRelation.right().value();
273 return Either.right(status);
276 return Either.left(to);
280 public Either<TitanVertex, TitanOperationStatus> addAdditionalInformationNode(NodeTypeEnum nodeType, String componentId, TitanVertex metadataVertex) {
282 String uniqueId = UniqueIdBuilder.buildAdditionalInformationUniqueId(componentId);
283 AdditionalInfoParameterDataDefinition additionalInfoParameterDataDefinition = new AdditionalInfoParameterDataDefinition();
284 additionalInfoParameterDataDefinition.setUniqueId(uniqueId);
286 AdditionalInfoParameterData additionalInfoParameterData = new AdditionalInfoParameterData(additionalInfoParameterDataDefinition, new HashMap<String, String>(), new HashMap<String, String>());
288 Either<TitanVertex, TitanOperationStatus> createNode = titanGenericDao.createNode(additionalInfoParameterData);
289 if (createNode.isRight()) {
290 TitanOperationStatus status = createNode.right().value();
291 BeEcompErrorManager.getInstance().logBeFailedCreateNodeError("AddAdditionalInformationNode", uniqueId, String.valueOf(status));
292 return Either.right(status);
295 TitanVertex additionalInfoVertex = createNode.left().value();
297 TitanOperationStatus createRelation = titanGenericDao.createEdge(metadataVertex, additionalInfoVertex, GraphEdgeLabels.ADDITIONAL_INFORMATION, null);
299 if (!createRelation.equals(TitanOperationStatus.OK)) {
300 return Either.right(createRelation);
302 return Either.left(additionalInfoVertex);
305 public Either<AdditionalInformationDefinition, TitanOperationStatus> addAdditionalInformationNode(NodeTypeEnum nodeType, String componentId, AdditionalInformationDefinition parameters) {
307 Either<AdditionalInfoParameterData, TitanOperationStatus> status = this.addAdditionalInformationNode(nodeType, componentId);
309 if (status.isRight()) {
310 return Either.right(status.right().value());
313 AdditionalInfoParameterData parameterData = status.left().value();
315 populateParameterNodeWithParameters(parameterData, parameters);
317 Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode = titanGenericDao.updateNode(parameterData, AdditionalInfoParameterData.class);
319 if (updateNode.isRight()) {
320 return Either.right(updateNode.right().value());
323 AdditionalInformationDefinition informationDefinition = convertAdditionalInformationDataToDefinition(updateNode.left().value(), componentId);
325 return Either.left(informationDefinition);
328 public TitanOperationStatus addAdditionalInformationNode(NodeTypeEnum nodeType, String componentId, AdditionalInformationDefinition parameters, TitanVertex metadataVertex) {
330 Either<TitanVertex, TitanOperationStatus> status = this.addAdditionalInformationNode(nodeType, componentId, metadataVertex);
332 if (status.isRight()) {
333 return status.right().value();
335 TitanVertex additionalInfoVertex = status.left().value();
337 Map<String, Object> newProp = titanGenericDao.getProperties(additionalInfoVertex);
338 AdditionalInfoParameterData parameterData = GraphElementFactory.createElement(NodeTypeEnum.AdditionalInfoParameters.getName(), GraphElementTypeEnum.Node, newProp, AdditionalInfoParameterData.class);
340 populateParameterNodeWithParameters(parameterData, parameters);
342 TitanOperationStatus updateNode = titanGenericDao.updateVertex(parameterData, additionalInfoVertex);
347 private void populateParameterNodeWithParameters(AdditionalInfoParameterData parameterData, AdditionalInformationDefinition aiDefinition) {
349 if (aiDefinition != null) {
351 Integer lastCreatedCounter = aiDefinition.getLastCreatedCounter();
352 parameterData.getAdditionalInfoParameterDataDefinition().setLastCreatedCounter(lastCreatedCounter);
353 log.trace("Set last created counter of additional information to {}", lastCreatedCounter);
355 List<AdditionalInfoParameterInfo> parameters = aiDefinition.getParameters();
356 if (parameters != null) {
358 Map<String, String> idToKey = new HashMap<String, String>();
359 Map<String, String> parametersMap = new HashMap<String, String>();
360 for (AdditionalInfoParameterInfo additionalInfoParameterInfo : parameters) {
361 String uniqueId = additionalInfoParameterInfo.getUniqueId();
362 String key = additionalInfoParameterInfo.getKey();
363 String value = additionalInfoParameterInfo.getValue();
365 if (key != null && false == key.isEmpty()) {
366 idToKey.put(uniqueId, key);
367 parametersMap.put(key, value);
370 parameterData.setIdToKey(idToKey);
371 parameterData.setParameters(parametersMap);
378 public TitanOperationStatus findResourceAllAdditionalInformationRecursively(String uniqueId, List<AdditionalInformationDefinition> properties) {
380 log.trace("Going to fetch additional information under resource {}", uniqueId);
381 TitanOperationStatus resourceCapabilitiesStatus = findAdditionalInformationOfNode(NodeTypeEnum.Resource, uniqueId, properties);
383 if (!resourceCapabilitiesStatus.equals(TitanOperationStatus.OK)) {
384 return resourceCapabilitiesStatus;
387 Either<ImmutablePair<ResourceMetadataData, GraphEdge>, TitanOperationStatus> parentNodes = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Resource), uniqueId, GraphEdgeLabels.DERIVED_FROM, NodeTypeEnum.Resource,
388 ResourceMetadataData.class);
390 if (parentNodes.isRight()) {
391 TitanOperationStatus parentNodesStatus = parentNodes.right().value();
392 if (false == parentNodesStatus.equals(TitanOperationStatus.NOT_FOUND)) {
393 log.error("Failed to find parent additional information of resource {}. status is {}", uniqueId, parentNodesStatus);
394 return parentNodesStatus;
398 if (parentNodes.isLeft()) {
399 ImmutablePair<ResourceMetadataData, GraphEdge> parnetNodePair = parentNodes.left().value();
400 String parentUniqueId = parnetNodePair.getKey().getMetadataDataDefinition().getUniqueId();
401 TitanOperationStatus addParentIntStatus = findResourceAllAdditionalInformationRecursively(parentUniqueId, properties);
403 if (addParentIntStatus != TitanOperationStatus.OK) {
404 log.error("Failed to find all resource additional information of resource {}", parentUniqueId);
405 return addParentIntStatus;
408 return TitanOperationStatus.OK;
413 public TitanOperationStatus findServiceAllAdditionalInformationRecursively(String uniqueId, List<AdditionalInformationDefinition> properties) {
415 log.trace("Going to fetch additional information under service {}", uniqueId);
416 TitanOperationStatus resourceCapabilitiesStatus = findAdditionalInformationOfNode(NodeTypeEnum.Service, uniqueId, properties);
418 if (!resourceCapabilitiesStatus.equals(TitanOperationStatus.OK)) {
419 return resourceCapabilitiesStatus;
422 Either<ImmutablePair<ServiceMetadataData, GraphEdge>, TitanOperationStatus> parentNodes = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Service), uniqueId, GraphEdgeLabels.DERIVED_FROM, NodeTypeEnum.Service,
423 ServiceMetadataData.class);
425 if (parentNodes.isRight()) {
426 TitanOperationStatus parentNodesStatus = parentNodes.right().value();
427 if (false == parentNodesStatus.equals(TitanOperationStatus.NOT_FOUND)) {
428 log.error("Failed to find parent additional information of resource {}. status is {}", uniqueId, parentNodesStatus);
429 return parentNodesStatus;
433 if (parentNodes.isLeft()) {
434 ImmutablePair<ServiceMetadataData, GraphEdge> parnetNodePair = parentNodes.left().value();
435 String parentUniqueId = parnetNodePair.getKey().getMetadataDataDefinition().getUniqueId();
436 TitanOperationStatus addParentIntStatus = findServiceAllAdditionalInformationRecursively(parentUniqueId, properties);
438 if (addParentIntStatus != TitanOperationStatus.OK) {
439 log.error("Failed to find all resource additional information of resource {}", parentUniqueId);
440 return addParentIntStatus;
443 return TitanOperationStatus.OK;
447 private TitanOperationStatus findAdditionalInformationOfNode(NodeTypeEnum nodeType, String uniqueId, List<AdditionalInformationDefinition> properties) {
449 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> childNode = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), uniqueId, GraphEdgeLabels.ADDITIONAL_INFORMATION,
450 NodeTypeEnum.AdditionalInfoParameters, AdditionalInfoParameterData.class);
452 if (childNode.isRight()) {
453 TitanOperationStatus status = childNode.right().value();
454 if (status == TitanOperationStatus.NOT_FOUND) {
455 status = TitanOperationStatus.OK;
460 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = childNode.left().value();
461 AdditionalInfoParameterData propertyData = immutablePair.getKey();
463 Map<String, String> parameters = propertyData.getParameters();
464 if (parameters != null && false == parameters.isEmpty()) {
465 AdditionalInformationDefinition additionalInfoDef = this.convertAdditionalInformationDataToDefinition(propertyData, uniqueId);
466 properties.add(additionalInfoDef);
469 return TitanOperationStatus.OK;
473 private AdditionalInformationDefinition convertAdditionalInformationDataToDefinition(AdditionalInfoParameterData additionalInfoData, String uniqueId) {
475 Map<String, String> parameters = additionalInfoData.getParameters();
476 Map<String, String> idToKey = additionalInfoData.getIdToKey();
478 AdditionalInformationDefinition definition = new AdditionalInformationDefinition(additionalInfoData.getAdditionalInfoParameterDataDefinition(), uniqueId, convertParameters(parameters, idToKey));
483 public Either<AdditionalInformationDefinition, StorageOperationStatus> createAdditionalInformationParameter(NodeTypeEnum nodeType, String resourceId, String key, String value, boolean inTransaction) {
485 Either<AdditionalInformationDefinition, StorageOperationStatus> result = null;
489 Either<AdditionalInformationDefinition, TitanOperationStatus> either = this.addAdditionalInformationParameter(nodeType, resourceId, key, value);
491 if (either.isRight()) {
492 TitanOperationStatus status = either.right().value();
493 log.debug("Failed to add additional information property {} to component {}. Status is {}", key, resourceId, status);
494 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("CreateAdditionalInformationParameter", "additional information of " + nodeType.getName() + " " + resourceId, String.valueOf(status));
495 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
497 AdditionalInformationDefinition additionalInformationDefinition = either.left().value();
498 result = Either.left(additionalInformationDefinition);
503 commitOrRollback(inTransaction, result);
509 public Either<AdditionalInformationDefinition, StorageOperationStatus> updateAdditionalInformationParameter(NodeTypeEnum nodeType, String resourceId, String id, String key, String value, boolean inTransaction) {
511 Either<AdditionalInformationDefinition, StorageOperationStatus> result = null;
515 Either<AdditionalInformationDefinition, TitanOperationStatus> either = this.updateAdditionalInformationParameter(nodeType, resourceId, id, key, value);
517 if (either.isRight()) {
518 log.info("Failed to update additional information property {} to component {}", key, resourceId);
519 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(either.right().value()));
521 AdditionalInformationDefinition additionalInformationDefinition = either.left().value();
522 result = Either.left(additionalInformationDefinition);
528 commitOrRollback(inTransaction, result);
534 public Either<AdditionalInformationDefinition, StorageOperationStatus> deleteAdditionalInformationParameter(NodeTypeEnum nodeType, String resourceId, String id, boolean inTransaction) {
536 Either<AdditionalInformationDefinition, StorageOperationStatus> result = null;
540 Either<AdditionalInformationDefinition, TitanOperationStatus> either = this.deleteAdditionalInformationParameter(nodeType, resourceId, id);
542 if (either.isRight()) {
543 log.error("Failed to delete additional information id {} to component {}", id, resourceId);
544 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(either.right().value()));
546 AdditionalInformationDefinition additionalInformationDefinition = either.left().value();
547 result = Either.left(additionalInformationDefinition);
553 commitOrRollback(inTransaction, result);
559 public Either<Integer, StorageOperationStatus> getNumberOfAdditionalInformationParameters(NodeTypeEnum nodeType, String resourceId, boolean inTransaction) {
561 Either<Integer, StorageOperationStatus> result = null;
565 Either<Integer, TitanOperationStatus> either = this.getNumberOfParameters(nodeType, resourceId);
567 if (either.isRight()) {
568 log.error("Failed to get the number of additional information properties in component {}", resourceId);
569 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(either.right().value()));
571 Integer counter = either.left().value();
572 result = Either.left(counter);
577 if (false == inTransaction) {
578 if (result == null || result.isRight()) {
579 log.error("Going to execute rollback on graph.");
580 titanGenericDao.rollback();
582 log.debug("Going to execute commit on graph.");
583 titanGenericDao.commit();
591 public Either<Integer, TitanOperationStatus> getNumberOfParameters(NodeTypeEnum nodeType, String resourceId) {
593 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), resourceId, GraphEdgeLabels.ADDITIONAL_INFORMATION,
594 NodeTypeEnum.AdditionalInfoParameters, AdditionalInfoParameterData.class);
596 if (getResult.isRight()) {
597 TitanOperationStatus status = getResult.right().value();
598 return Either.right(status);
601 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
602 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
603 Map<String, String> parameters = parameterData.getParameters();
606 if (parameters != null) {
607 counter = parameters.size();
610 return Either.left(counter);
615 public Either<AdditionalInfoParameterInfo, TitanOperationStatus> getAdditionalInformationParameter(NodeTypeEnum nodeType, String componentId, String id) {
617 TitanOperationStatus verifyNodeTypeVsComponent = verifyNodeTypeVsComponent(nodeType, componentId);
618 if (verifyNodeTypeVsComponent != TitanOperationStatus.OK) {
619 return Either.right(verifyNodeTypeVsComponent);
622 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId, GraphEdgeLabels.ADDITIONAL_INFORMATION,
623 NodeTypeEnum.AdditionalInfoParameters, AdditionalInfoParameterData.class);
625 if (getResult.isRight()) {
626 TitanOperationStatus status = getResult.right().value();
627 return Either.right(status);
630 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
631 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
632 Map<String, String> parameters = parameterData.getParameters();
633 Map<String, String> idToKey = parameterData.getIdToKey();
635 if (idToKey == null || false == idToKey.containsKey(id)) {
636 return Either.right(TitanOperationStatus.INVALID_ID);
639 String key = idToKey.get(id);
640 String value = parameters.get(key);
642 log.trace("The key-value {} = {} was retrieved for id {}", key, value, id);
644 Either<AdditionalInfoParameterData, TitanOperationStatus> updateNode = titanGenericDao.updateNode(parameterData, AdditionalInfoParameterData.class);
646 if (updateNode.isRight()) {
647 TitanOperationStatus status = updateNode.right().value();
648 if (status != TitanOperationStatus.NOT_FOUND) {
649 BeEcompErrorManager.getInstance().logBeFailedRetrieveNodeError("GetAdditionnalInformationParameter", "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
651 return Either.right(status);
654 AdditionalInfoParameterInfo additionalInfoParameterInfo = new AdditionalInfoParameterInfo(id, key, value);
656 return Either.left(additionalInfoParameterInfo);
661 public Either<AdditionalInformationDefinition, TitanOperationStatus> getAllAdditionalInformationParameters(NodeTypeEnum nodeType, String componentId, boolean ignoreVerification) {
663 if (false == ignoreVerification) {
664 TitanOperationStatus verifyNodeTypeVsComponent = verifyNodeTypeVsComponent(nodeType, componentId);
665 if (verifyNodeTypeVsComponent != TitanOperationStatus.OK) {
666 return Either.right(verifyNodeTypeVsComponent);
670 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId, GraphEdgeLabels.ADDITIONAL_INFORMATION,
671 NodeTypeEnum.AdditionalInfoParameters, AdditionalInfoParameterData.class);
673 if (getResult.isRight()) {
674 TitanOperationStatus status = getResult.right().value();
675 if (status != TitanOperationStatus.NOT_FOUND) {
676 BeEcompErrorManager.getInstance().logBeFailedRetrieveNodeError("GetAdditionnalInformationParameters", "additional information of " + nodeType.getName() + " " + componentId, String.valueOf(status));
678 return Either.right(status);
681 ImmutablePair<AdditionalInfoParameterData, GraphEdge> immutablePair = getResult.left().value();
682 AdditionalInfoParameterData parameterData = immutablePair.getLeft();
683 Map<String, String> parameters = parameterData.getParameters();
684 Map<String, String> idToKey = parameterData.getIdToKey();
686 AdditionalInformationDefinition informationDefinition = createInformationDefinitionFromNode(componentId, parameters, idToKey, parameterData);
688 return Either.left(informationDefinition);
693 public Either<AdditionalInformationDefinition, StorageOperationStatus> getAllAdditionalInformationParameters(NodeTypeEnum nodeType, String resourceId, boolean ignoreVerification, boolean inTransaction) {
695 Either<AdditionalInformationDefinition, StorageOperationStatus> result = null;
699 Either<AdditionalInformationDefinition, TitanOperationStatus> either = this.getAllAdditionalInformationParameters(nodeType, resourceId, ignoreVerification);
701 if (either.isRight()) {
702 TitanOperationStatus status = either.right().value();
703 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
705 AdditionalInformationDefinition additionalInformationDefinition = either.left().value();
706 result = Either.left(additionalInformationDefinition);
712 commitOrRollback(inTransaction, result);
717 private void commitOrRollback(boolean inTransaction, Either<? extends Object, StorageOperationStatus> result) {
719 if (false == inTransaction) {
720 if (result == null || result.isRight()) {
721 log.error("Going to execute rollback on graph.");
722 titanGenericDao.rollback();
724 log.debug("Going to execute commit on graph.");
725 titanGenericDao.commit();
731 public Either<AdditionalInfoParameterInfo, StorageOperationStatus> getAdditionalInformationParameter(NodeTypeEnum nodeType, String resourceId, String id, boolean inTransaction) {
733 Either<AdditionalInfoParameterInfo, StorageOperationStatus> result = null;
737 Either<AdditionalInfoParameterInfo, TitanOperationStatus> either = this.getAdditionalInformationParameter(nodeType, resourceId, id);
739 if (either.isRight()) {
740 log.error("Failed to fetch additional information property with id {} of component {}", id, resourceId);
741 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(either.right().value()));
743 AdditionalInfoParameterInfo additionalInformationDefinition = either.left().value();
744 result = Either.left(additionalInformationDefinition);
750 commitOrRollback(inTransaction, result);
755 public Either<AdditionalInformationDefinition, StorageOperationStatus> deleteAllAdditionalInformationParameters(NodeTypeEnum nodeType, String resourceId, boolean inTransaction) {
757 Either<AdditionalInformationDefinition, StorageOperationStatus> result = null;
761 Either<ImmutablePair<AdditionalInfoParameterData, GraphEdge>, TitanOperationStatus> getResult = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(nodeType), resourceId, GraphEdgeLabels.ADDITIONAL_INFORMATION,
762 NodeTypeEnum.AdditionalInfoParameters, AdditionalInfoParameterData.class);
764 if (getResult.isRight()) {
765 TitanOperationStatus status = getResult.right().value();
766 if (status == TitanOperationStatus.NOT_FOUND) {
767 return Either.right(StorageOperationStatus.OK);
769 BeEcompErrorManager.getInstance().logBeFailedDeleteNodeError("DeleteAdditionalInformationNode", "additional information of " + nodeType.getName() + " " + resourceId, String.valueOf(status));
770 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
775 ImmutablePair<AdditionalInfoParameterData, GraphEdge> value = getResult.left().value();
776 AdditionalInfoParameterData parameterData = value.getLeft();
778 Either<AdditionalInfoParameterData, TitanOperationStatus> deleteNodeRes = titanGenericDao.deleteNode(parameterData, AdditionalInfoParameterData.class);
779 if (deleteNodeRes.isRight()) {
780 TitanOperationStatus status = getResult.right().value();
781 BeEcompErrorManager.getInstance().logBeFailedDeleteNodeError("DeleteAdditionalInformationNode", (String) parameterData.getUniqueId(), String.valueOf(status));
782 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
786 AdditionalInformationDefinition informationDefinition = convertAdditionalInformationDataToDefinition(deleteNodeRes.left().value(), resourceId);
788 result = Either.left(informationDefinition);
793 commitOrRollback(inTransaction, result);
797 private TitanOperationStatus verifyNodeTypeVsComponent(NodeTypeEnum nodeType, String componentId) {
798 Either<TitanVertex, TitanOperationStatus> vertexByProperty = titanGenericDao.getVertexByProperty(UniqueIdBuilder.getKeyByNodeType(nodeType), componentId);
799 if (vertexByProperty.isRight()) {
800 TitanOperationStatus status = vertexByProperty.right().value();
801 if (status == TitanOperationStatus.NOT_FOUND) {
802 status = TitanOperationStatus.INVALID_ID;
806 Vertex v = vertexByProperty.left().value();
807 String label = (String) v.property(GraphPropertiesDictionary.LABEL.getProperty()).value();
809 if (false == label.equals(nodeType.getName())) {
810 log.debug("The node type {} is not appropriate to component {}", nodeType, componentId);
811 return TitanOperationStatus.INVALID_ID;
814 log.debug("The node type {} with id {} does not have a label property.", nodeType, componentId);
815 return TitanOperationStatus.INVALID_ID;
818 return TitanOperationStatus.OK;