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.jsonjanusgraph.operations;
 
  23 import fj.data.Either;
 
  24 import org.apache.tinkerpop.gremlin.structure.Direction;
 
  25 import org.apache.tinkerpop.gremlin.structure.Edge;
 
  26 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
 
  27 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
 
  28 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
 
  29 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
 
  30 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
 
  31 import org.openecomp.sdc.be.datatypes.elements.*;
 
  32 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
 
  33 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
 
  34 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
 
  35 import org.openecomp.sdc.be.model.ComponentParametersView;
 
  36 import org.openecomp.sdc.be.model.DerivedNodeTypeResolver;
 
  37 import org.openecomp.sdc.be.model.LifecycleStateEnum;
 
  38 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.NodeType;
 
  39 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElement;
 
  40 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElementTypeEnum;
 
  41 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 
  42 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
 
  43 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
 
  44 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
 
  45 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
 
  46 import org.openecomp.sdc.common.log.wrappers.Logger;
 
  47 import org.springframework.beans.factory.annotation.Qualifier;
 
  50 import java.util.regex.Pattern;
 
  51 import java.util.stream.Collectors;
 
  53 @org.springframework.stereotype.Component("node-type-operation")
 
  54 public class NodeTypeOperation extends ToscaElementOperation {
 
  55     public static final Pattern uuidNewVersion = Pattern.compile("^\\d+.1");
 
  56     public static final Pattern uuidNormativeNewVersion = Pattern.compile("^\\d+.0");
 
  57     private static final Logger log = Logger.getLogger(NodeTypeOperation.class);
 
  58     private DerivedNodeTypeResolver derivedResourceResolver;
 
  61     public NodeTypeOperation(@Qualifier("derived-resource-resolver") DerivedNodeTypeResolver derivedNodeTypeResolver) {
 
  62         this.derivedResourceResolver = derivedNodeTypeResolver;
 
  65     public Either<NodeType, StorageOperationStatus> createNodeType(NodeType nodeType) {
 
  67         Either<NodeType, StorageOperationStatus> result = null;
 
  69         nodeType.generateUUID();
 
  71         nodeType = getResourceMetaDataFromResource(nodeType);
 
  72         String resourceUniqueId = nodeType.getUniqueId();
 
  73         if (resourceUniqueId == null) {
 
  74             resourceUniqueId = UniqueIdBuilder.buildResourceUniqueId();
 
  75             nodeType.setUniqueId(resourceUniqueId);
 
  78         // get derived from resources
 
  79         List<GraphVertex> derivedResources = null;
 
  80         Either<List<GraphVertex>, StorageOperationStatus> derivedResourcesResult = findDerivedResources(nodeType);
 
  81         if (derivedResourcesResult.isRight()) {
 
  82             result = Either.right(derivedResourcesResult.right().value());
 
  85             derivedResources = derivedResourcesResult.left().value();
 
  88         GraphVertex nodeTypeVertex = new GraphVertex(VertexTypeEnum.NODE_TYPE);
 
  89         fillToscaElementVertexData(nodeTypeVertex, nodeType, JsonParseFlagEnum.ParseAll);
 
  91         Either<GraphVertex, JanusGraphOperationStatus> createdVertex = janusGraphDao.createVertex(nodeTypeVertex);
 
  92         if (createdVertex.isRight()) {
 
  93             JanusGraphOperationStatus status = createdVertex.right().value();
 
  94             log.error("Error returned after creating resource data node {}. status returned is ", nodeTypeVertex, status);
 
  95             result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
  98         nodeTypeVertex = createdVertex.left().value();
 
 100         StorageOperationStatus assosiateCommon = assosiateCommonForToscaElement(nodeTypeVertex, nodeType, derivedResources);
 
 101         if (assosiateCommon != StorageOperationStatus.OK) {
 
 102             result = Either.right(assosiateCommon);
 
 106         StorageOperationStatus associateDerived = assosiateToDerived(nodeTypeVertex, derivedResources);
 
 107         if (associateDerived != StorageOperationStatus.OK) {
 
 108             result = Either.right(associateDerived);
 
 111         StorageOperationStatus associateCategory = assosiateResourceMetadataToCategory(nodeTypeVertex, nodeType);
 
 112         if (associateCategory != StorageOperationStatus.OK) {
 
 113             result = Either.right(associateCategory);
 
 117         StorageOperationStatus associateAttributes = associateAttributesToResource(nodeTypeVertex, nodeType, derivedResources);
 
 118         if (associateAttributes != StorageOperationStatus.OK) {
 
 119             result = Either.right(associateAttributes);
 
 123         StorageOperationStatus associateRequirements = associateRequirementsToResource(nodeTypeVertex, nodeType, derivedResources);
 
 124         if (associateRequirements != StorageOperationStatus.OK) {
 
 125             result = Either.right(associateRequirements);
 
 129         StorageOperationStatus associateCapabilities = associateCapabilitiesToResource(nodeTypeVertex, nodeType, derivedResources);
 
 130         if (associateCapabilities != StorageOperationStatus.OK) {
 
 131             result = Either.right(associateCapabilities);
 
 134         StorageOperationStatus associateCapabilitiesProps = associateCapabilitiesPropertiesToResource(nodeTypeVertex, nodeType, derivedResources);
 
 135         if (associateCapabilitiesProps != StorageOperationStatus.OK) {
 
 136             result = Either.right(associateCapabilitiesProps);
 
 140         StorageOperationStatus associateInterfaces = associateInterfacesToResource(nodeTypeVertex, nodeType, derivedResources);
 
 141         if (associateInterfaces != StorageOperationStatus.OK) {
 
 142             result = Either.right(associateInterfaces);
 
 146         StorageOperationStatus addAdditionalInformation = addAdditionalInformationToResource(nodeTypeVertex, nodeType, derivedResources);
 
 147         if (addAdditionalInformation != StorageOperationStatus.OK) {
 
 148             result = Either.right(addAdditionalInformation);
 
 151         result = Either.left(nodeType);
 
 156     private StorageOperationStatus associateInterfacesToResource(GraphVertex nodeTypeVertex, NodeType nodeType, List<GraphVertex> derivedResources) {
 
 157         // Note : currently only one derived supported!!!!
 
 158         Either<Map<String, InterfaceDataDefinition>, StorageOperationStatus> dataFromDerived = getDataFromDerived(derivedResources, EdgeLabelEnum.INTERFACE_ARTIFACTS);
 
 159         if (dataFromDerived.isRight()) {
 
 160             return dataFromDerived.right().value();
 
 162         Map<String, InterfaceDataDefinition> interfacArtsAll = dataFromDerived.left().value();
 
 164         Map<String, InterfaceDataDefinition> interfacArts = nodeType.getInterfaceArtifacts();
 
 165         if (interfacArts != null) {
 
 166             interfacArtsAll.putAll(interfacArts);
 
 168         if (!interfacArtsAll.isEmpty()) {
 
 169             Either<GraphVertex, StorageOperationStatus> assosiateElementToData = associateElementToData(nodeTypeVertex, VertexTypeEnum.INTERFACE_ARTIFACTS, EdgeLabelEnum.INTERFACE_ARTIFACTS, interfacArtsAll);
 
 170             if (assosiateElementToData.isRight()) {
 
 171                 return assosiateElementToData.right().value();
 
 174         return StorageOperationStatus.OK;
 
 178     public Either<ToscaElement, StorageOperationStatus> getToscaElement(String uniqueId, ComponentParametersView componentParametersView) {
 
 180         Either<GraphVertex, StorageOperationStatus> componentByLabelAndId = getComponentByLabelAndId(uniqueId, ToscaElementTypeEnum.NODE_TYPE, JsonParseFlagEnum.ParseMetadata);
 
 181         if (componentByLabelAndId.isRight()) {
 
 182             return Either.right(componentByLabelAndId.right().value());
 
 184         GraphVertex componentV = componentByLabelAndId.left().value();
 
 186         return getToscaElement(componentV, componentParametersView);
 
 190     // -------------------------------------------------------------
 
 192     public Either<ToscaElement, StorageOperationStatus> getToscaElement(GraphVertex componentV, ComponentParametersView componentParametersView) {
 
 193         NodeType toscaElement;
 
 194         toscaElement = convertToComponent(componentV);
 
 195         JanusGraphOperationStatus status = null;
 
 196         if (!componentParametersView.isIgnoreUsers()) {
 
 197             status = setCreatorFromGraph(componentV, toscaElement);
 
 198             if (status != JanusGraphOperationStatus.OK) {
 
 199                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 202             status = setLastModifierFromGraph(componentV, toscaElement);
 
 203             if (status != JanusGraphOperationStatus.OK) {
 
 204                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 208         if (!componentParametersView.isIgnoreProperties()) {
 
 209             status = setResourcePropertiesFromGraph(componentV, toscaElement);
 
 210             if (status != JanusGraphOperationStatus.OK && status != JanusGraphOperationStatus.NOT_FOUND) {
 
 211                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 215         if (!componentParametersView.isIgnoreAttributesFrom()) {
 
 216             status = setResourceAttributesFromGraph(componentV, toscaElement);
 
 217             if (status != JanusGraphOperationStatus.OK) {
 
 218                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 222         if (!componentParametersView.isIgnoreDerivedFrom()) {
 
 223             status = setResourceDerivedFromGraph(componentV, toscaElement);
 
 224             if (status != JanusGraphOperationStatus.OK) {
 
 225                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 229         if (!componentParametersView.isIgnoreCategories()) {
 
 230             status = setResourceCategoryFromGraph(componentV, toscaElement);
 
 231             if (status != JanusGraphOperationStatus.OK) {
 
 232                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 235         if (!componentParametersView.isIgnoreRequirements()) {
 
 236             status = setResourceRequirementsFromGraph(componentV, toscaElement);
 
 237             if (status != JanusGraphOperationStatus.OK) {
 
 238                 log.error("Failed to set requirement of resource {}. status is {}", componentV.getUniqueId(), status);
 
 239                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 242         if (!componentParametersView.isIgnoreCapabilities()) {
 
 243             status = setResourceCapabilitiesFromGraph(componentV, toscaElement);
 
 244             if (status != JanusGraphOperationStatus.OK) {
 
 245                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 249         if (!componentParametersView.isIgnoreArtifacts()) {
 
 250             status = setArtifactsFromGraph(componentV, toscaElement);
 
 251             if (status != JanusGraphOperationStatus.OK) {
 
 252                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 255         if (!componentParametersView.isIgnoreAdditionalInformation()) {
 
 256             status = setAdditionalInformationFromGraph(componentV, toscaElement);
 
 257             if (status != JanusGraphOperationStatus.OK) {
 
 258                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 261         if (!componentParametersView.isIgnoreInterfaces()) {
 
 262             status = setInterfacesFromGraph(componentV, toscaElement);
 
 263             if (status != JanusGraphOperationStatus.OK) {
 
 264                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 267         if (!componentParametersView.isIgnoreAllVersions()) {
 
 268             status = setAllVersions(componentV, toscaElement);
 
 269             if (status != JanusGraphOperationStatus.OK && status != JanusGraphOperationStatus.NOT_FOUND) {
 
 270                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 274         if (!componentParametersView.isIgnoreCapabiltyProperties()) {
 
 275             status = setComponentCapPropertiesFromGraph(componentV, toscaElement);
 
 276             if (status != JanusGraphOperationStatus.OK) {
 
 277                 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 281         return Either.left(toscaElement);
 
 284     private JanusGraphOperationStatus setComponentCapPropertiesFromGraph(GraphVertex componentV, NodeType toscaElement) {
 
 285         Either<Map<String, MapPropertiesDataDefinition>, JanusGraphOperationStatus> result = getDataFromGraph(componentV, EdgeLabelEnum.CAPABILITIES_PROPERTIES);
 
 286         if (result.isLeft()) {
 
 287             toscaElement.setCapabilitiesProperties(result.left().value());
 
 289             if (result.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
 
 290                 return result.right().value();
 
 293         return JanusGraphOperationStatus.OK;
 
 296     private JanusGraphOperationStatus setInterfacesFromGraph(GraphVertex componentV, NodeType toscaElement) {
 
 297         Either<Map<String, InterfaceDataDefinition>, JanusGraphOperationStatus> result = getDataFromGraph(componentV, EdgeLabelEnum.INTERFACE_ARTIFACTS);
 
 298         if (result.isLeft()) {
 
 299             toscaElement.setInterfaceArtifacts(result.left().value());
 
 301             if (result.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
 
 302                 return result.right().value();
 
 305         return JanusGraphOperationStatus.OK;
 
 308     protected <T extends ToscaElement> JanusGraphOperationStatus setCapabilitiesFromGraph(GraphVertex componentV, T toscaElement) {
 
 309         return setResourceCapabilitiesFromGraph(componentV, (NodeType) toscaElement);
 
 312     private JanusGraphOperationStatus setResourceCapabilitiesFromGraph(GraphVertex componentV, NodeType toscaElement) {
 
 313         Either<Map<String, ListCapabilityDataDefinition>, JanusGraphOperationStatus> result = getDataFromGraph(componentV, EdgeLabelEnum.CAPABILITIES);
 
 314         if (result.isLeft()) {
 
 315             toscaElement.setCapabilities(result.left().value());
 
 317             if (result.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
 
 318                 return result.right().value();
 
 321         return JanusGraphOperationStatus.OK;
 
 324     private JanusGraphOperationStatus setResourceDerivedFromGraph(final GraphVertex componentV,
 
 325                                                                   final NodeType toscaElement) {
 
 326         final List<String> derivedFromList = new ArrayList<>();
 
 327         final Map<String, String> derivedFromMapOfIdToName = new LinkedHashMap<>();
 
 329         final JanusGraphOperationStatus listFromGraphStatus = findResourcesPathRecursively(componentV, derivedFromList,
 
 330             derivedFromMapOfIdToName);
 
 331         if (JanusGraphOperationStatus.OK != listFromGraphStatus) {
 
 332             return listFromGraphStatus;
 
 335         if (!derivedFromList.isEmpty()) {
 
 336             if (derivedFromList.size() > 1) {
 
 337                 final List<String> lastDerivedFrom = new ArrayList<>();
 
 338                 lastDerivedFrom.add(derivedFromList.get(1));
 
 339                 toscaElement.setDerivedFrom(lastDerivedFrom);
 
 341                 toscaElement.setDerivedFrom(null);
 
 343             toscaElement.setDerivedList(derivedFromList);
 
 344             toscaElement.setDerivedFromMapOfIdToName(derivedFromMapOfIdToName);
 
 346         return JanusGraphOperationStatus.OK;
 
 349     private JanusGraphOperationStatus findResourcesPathRecursively(final GraphVertex nodeTypeV,
 
 350                                                                      final List<String> resourcesPathList,
 
 351                                                                      final Map<String, String> derivedFromMapOfIdToName) {
 
 352         Either<GraphVertex, JanusGraphOperationStatus> parentResourceRes = janusGraphDao
 
 353             .getChildVertex(nodeTypeV, EdgeLabelEnum.DERIVED_FROM, JsonParseFlagEnum.NoParse);
 
 354         resourcesPathList.add((String) nodeTypeV.getMetadataProperty(GraphPropertyEnum.TOSCA_RESOURCE_NAME));
 
 355         derivedFromMapOfIdToName.put(nodeTypeV.getUniqueId(),
 
 356             (String) nodeTypeV.getMetadataProperty(GraphPropertyEnum.TOSCA_RESOURCE_NAME));
 
 357         while (parentResourceRes.isLeft()) {
 
 358             final GraphVertex parent = parentResourceRes.left().value();
 
 359             resourcesPathList.add((String) parent.getMetadataProperty(GraphPropertyEnum.TOSCA_RESOURCE_NAME));
 
 360             derivedFromMapOfIdToName
 
 361                 .put(parent.getUniqueId(), (String) parent.getMetadataProperty(GraphPropertyEnum.TOSCA_RESOURCE_NAME));
 
 362             parentResourceRes = janusGraphDao
 
 363                 .getChildVertex(parent, EdgeLabelEnum.DERIVED_FROM, JsonParseFlagEnum.NoParse);
 
 365         final JanusGraphOperationStatus operationStatus = parentResourceRes.right().value();
 
 367         if (operationStatus != JanusGraphOperationStatus.NOT_FOUND) {
 
 368             return operationStatus;
 
 370             return JanusGraphOperationStatus.OK;
 
 375     protected <T extends ToscaElement> JanusGraphOperationStatus setRequirementsFromGraph(GraphVertex componentV, T toscaElement) {
 
 376         return setResourceRequirementsFromGraph(componentV, (NodeType) toscaElement);
 
 379     private JanusGraphOperationStatus setResourceRequirementsFromGraph(GraphVertex componentV, NodeType toscaElement) {
 
 380         Either<Map<String, ListRequirementDataDefinition>, JanusGraphOperationStatus> result = getDataFromGraph(componentV, EdgeLabelEnum.REQUIREMENTS);
 
 381         if (result.isLeft()) {
 
 382             toscaElement.setRequirements(result.left().value());
 
 384             if (result.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
 
 385                 return result.right().value();
 
 388         return JanusGraphOperationStatus.OK;
 
 391     private JanusGraphOperationStatus setResourceAttributesFromGraph(GraphVertex componentV, NodeType toscaElement) {
 
 392         Either<Map<String, PropertyDataDefinition>, JanusGraphOperationStatus> result = getDataFromGraph(componentV, EdgeLabelEnum.ATTRIBUTES);
 
 393         if (result.isLeft()) {
 
 394             toscaElement.setAttributes(result.left().value());
 
 396             if (result.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
 
 397                 return result.right().value();
 
 400         return JanusGraphOperationStatus.OK;
 
 403     private JanusGraphOperationStatus setResourcePropertiesFromGraph(GraphVertex componentV, NodeType toscaElement) {
 
 404         Either<Map<String, PropertyDataDefinition>, JanusGraphOperationStatus> result = getDataFromGraph(componentV, EdgeLabelEnum.PROPERTIES);
 
 405         if (result.isLeft()) {
 
 406             toscaElement.setProperties(result.left().value());
 
 408             if (result.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
 
 409                 return result.right().value();
 
 412         return JanusGraphOperationStatus.OK;
 
 415     private StorageOperationStatus assosiateToDerived(GraphVertex nodeTypeVertex, List<GraphVertex> derivedResources) {
 
 416         for (GraphVertex derivedV : derivedResources) {
 
 417             JanusGraphOperationStatus
 
 418                 createEdge = janusGraphDao
 
 419                 .createEdge(nodeTypeVertex, derivedV, EdgeLabelEnum.DERIVED_FROM, null);
 
 420             if (createEdge != JanusGraphOperationStatus.OK) {
 
 421                 log.trace("Failed to associate resource {} to derived with id {}", nodeTypeVertex.getUniqueId(), derivedV.getUniqueId());
 
 422                 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(createEdge);
 
 425         return StorageOperationStatus.OK;
 
 428     private StorageOperationStatus addAdditionalInformationToResource(GraphVertex nodeTypeVertex, NodeType nodeType, List<GraphVertex> derivedResources) {
 
 429         // Note : currently only one derived supported!!!!
 
 430         Either<Map<String, AdditionalInfoParameterDataDefinition>, StorageOperationStatus> dataFromDerived = getDataFromDerived(derivedResources, EdgeLabelEnum.ADDITIONAL_INFORMATION);
 
 431         if (dataFromDerived.isRight()) {
 
 432             return dataFromDerived.right().value();
 
 434         Map<String, AdditionalInfoParameterDataDefinition> addInformationAll = dataFromDerived.left().value();
 
 436         Map<String, AdditionalInfoParameterDataDefinition> addInformation = nodeType.getAdditionalInformation();
 
 437         if (addInformation != null) {
 
 438             ToscaDataDefinition.mergeDataMaps(addInformationAll, addInformation);
 
 440         if (!addInformationAll.isEmpty()) {
 
 441             Either<GraphVertex, StorageOperationStatus> assosiateElementToData = associateElementToData(nodeTypeVertex, VertexTypeEnum.ADDITIONAL_INFORMATION, EdgeLabelEnum.ADDITIONAL_INFORMATION, addInformationAll);
 
 442             if (assosiateElementToData.isRight()) {
 
 443                 return assosiateElementToData.right().value();
 
 446         return StorageOperationStatus.OK;
 
 449     private StorageOperationStatus associateCapabilitiesToResource(GraphVertex nodeTypeVertex, NodeType nodeType, List<GraphVertex> derivedResources) {
 
 450         // Note : currently only one derived supported!!!!
 
 451         Either<Map<String, ListCapabilityDataDefinition>, StorageOperationStatus> dataFromDerived = getDataFromDerived(derivedResources, EdgeLabelEnum.CAPABILITIES);
 
 452         if (dataFromDerived.isRight()) {
 
 453             return dataFromDerived.right().value();
 
 455         Map<String, ListCapabilityDataDefinition> capabiltiesAll = dataFromDerived.left().value();
 
 457         Map<String, ListCapabilityDataDefinition> capabilties = nodeType.getCapabilities();
 
 458         if (capabilties != null) {
 
 459             if (capabiltiesAll == null) {
 
 460                 capabiltiesAll = new HashMap<>();
 
 462             capabilties.values().forEach(l -> {
 
 463                 l.getListToscaDataDefinition().stream().filter(p -> p.getUniqueId() == null).forEach(p -> {
 
 464                     String uid = UniqueIdBuilder.buildCapabilityUid(nodeTypeVertex.getUniqueId(), p.getName());
 
 469             ToscaDataDefinition.mergeDataMaps(capabiltiesAll, capabilties);
 
 470             capabiltiesAll.values().forEach(l -> {
 
 471                 l.getListToscaDataDefinition().forEach(c -> {
 
 472                     List<String> capabilitySources = c.getCapabilitySources();
 
 473                     if (capabilitySources == null) {
 
 474                         capabilitySources = new ArrayList<>();
 
 476                     capabilitySources.add((String) nodeType.getMetadataValue(JsonPresentationFields.TOSCA_RESOURCE_NAME));
 
 477                     c.setCapabilitySources(capabilitySources);
 
 481         capabiltiesAll.values().forEach(l -> {
 
 482             l.getListToscaDataDefinition().forEach(c -> {
 
 483                 List<String> capabilitySources = c.getCapabilitySources();
 
 484                 if (capabilitySources == null) {
 
 485                     capabilitySources = new ArrayList<>();
 
 487                 capabilitySources.add((String) nodeType.getMetadataValue(JsonPresentationFields.TOSCA_RESOURCE_NAME));
 
 488                 c.setCapabilitySources(capabilitySources);
 
 491         if (!capabiltiesAll.isEmpty()) {
 
 492             Either<GraphVertex, StorageOperationStatus> assosiateElementToData = associateElementToData(nodeTypeVertex, VertexTypeEnum.CAPABILITIES, EdgeLabelEnum.CAPABILITIES, capabiltiesAll);
 
 493             if (assosiateElementToData.isRight()) {
 
 494                 return assosiateElementToData.right().value();
 
 497         return StorageOperationStatus.OK;
 
 500     private StorageOperationStatus associateRequirementsToResource(GraphVertex nodeTypeVertex, NodeType nodeType, List<GraphVertex> derivedResources) {
 
 501         // Note : currently only one derived supported!!!!
 
 502         Either<Map<String, ListRequirementDataDefinition>, StorageOperationStatus> dataFromDerived = getDataFromDerived(derivedResources, EdgeLabelEnum.REQUIREMENTS);
 
 503         if (dataFromDerived.isRight()) {
 
 504             return dataFromDerived.right().value();
 
 506         Map<String, ListRequirementDataDefinition> requirementsAll = dataFromDerived.left().value();
 
 508         Map<String, ListRequirementDataDefinition> requirements = nodeType.getRequirements();
 
 509         if (requirements != null) {
 
 510             if (requirementsAll == null) {
 
 511                 requirementsAll = new HashMap<>();
 
 513             requirements.values().forEach(l -> {
 
 514                 l.getListToscaDataDefinition().stream().filter(p -> p.getUniqueId() == null).forEach(p -> {
 
 515                     String uid = UniqueIdBuilder.buildRequirementUid(nodeTypeVertex.getUniqueId(), p.getName());
 
 520             ToscaDataDefinition.mergeDataMaps(requirementsAll, requirements);
 
 523         if (!requirementsAll.isEmpty()) {
 
 524             Either<GraphVertex, StorageOperationStatus> assosiateElementToData = associateElementToData(nodeTypeVertex, VertexTypeEnum.REQUIREMENTS, EdgeLabelEnum.REQUIREMENTS, requirementsAll);
 
 525             if (assosiateElementToData.isRight()) {
 
 526                 return assosiateElementToData.right().value();
 
 529         return StorageOperationStatus.OK;
 
 532     private StorageOperationStatus associateAttributesToResource(GraphVertex nodeTypeVertex, NodeType nodeType, List<GraphVertex> derivedResources) {
 
 533         // Note : currently only one derived supported!!!!
 
 534         Either<Map<String, PropertyDataDefinition>, StorageOperationStatus> dataFromDerived = getDataFromDerived(derivedResources, EdgeLabelEnum.ATTRIBUTES);
 
 535         if (dataFromDerived.isRight()) {
 
 536             return dataFromDerived.right().value();
 
 538         Map<String, PropertyDataDefinition> attributesAll = dataFromDerived.left().value();
 
 540         Map<String, PropertyDataDefinition> attributes = nodeType.getAttributes();
 
 541         if (attributes != null) {
 
 542             attributes.values().stream().filter(p -> p.getUniqueId() == null).forEach(p -> {
 
 543                 String uid = UniqueIdBuilder.buildAttributeUid(nodeTypeVertex.getUniqueId(), p.getName());
 
 546             ToscaDataDefinition.mergeDataMaps(attributesAll, attributes);
 
 548         if (!attributesAll.isEmpty()) {
 
 549             Either<GraphVertex, StorageOperationStatus> assosiateElementToData = associateElementToData(nodeTypeVertex, VertexTypeEnum.ATTRIBUTES, EdgeLabelEnum.ATTRIBUTES, attributesAll);
 
 550             if (assosiateElementToData.isRight()) {
 
 551                 return assosiateElementToData.right().value();
 
 554         return StorageOperationStatus.OK;
 
 557     // TODO get from derived
 
 558     private StorageOperationStatus associateCapabilitiesPropertiesToResource(GraphVertex nodeTypeVertex, NodeType nodeType, List<GraphVertex> derivedResources) {
 
 559         // // Note : currently only one derived supported!!!!
 
 560         Either<Map<String, MapPropertiesDataDefinition>, StorageOperationStatus> dataFromDerived = getDataFromDerived(derivedResources, EdgeLabelEnum.CAPABILITIES_PROPERTIES);
 
 561         if (dataFromDerived.isRight()) {
 
 562             return dataFromDerived.right().value();
 
 564         Map<String, MapPropertiesDataDefinition> propertiesAll = dataFromDerived.left().value();
 
 565         Map<String, MapPropertiesDataDefinition> capabiltiesProps = nodeType.getCapabilitiesProperties();
 
 566         if (capabiltiesProps != null) {
 
 567             capabiltiesProps.values().forEach(l -> {
 
 568                 if (l.getMapToscaDataDefinition() != null && l.getMapToscaDataDefinition().values() != null) {
 
 569                     Collection<PropertyDataDefinition> mapToscaDataDefinition = l.getMapToscaDataDefinition().values();
 
 570                     mapToscaDataDefinition.stream().filter(p -> p != null && p.getUniqueId() == null).forEach(p -> {
 
 571                         String uid = UniqueIdBuilder.buildRequirementUid(nodeTypeVertex.getUniqueId(), p.getName());
 
 576             ToscaDataDefinition.mergeDataMaps(propertiesAll, capabiltiesProps);
 
 578         if (!propertiesAll.isEmpty()) {
 
 579             Either<GraphVertex, StorageOperationStatus> assosiateElementToData = associateElementToData(nodeTypeVertex, VertexTypeEnum.CAPABILITIES_PROPERTIES, EdgeLabelEnum.CAPABILITIES_PROPERTIES, propertiesAll);
 
 580             if (assosiateElementToData.isRight()) {
 
 581                 return assosiateElementToData.right().value();
 
 584         return StorageOperationStatus.OK;
 
 587     public Either<List<GraphVertex>, StorageOperationStatus> findDerivedResources(NodeType nodeType) {
 
 589         List<GraphVertex> derivedResources = new ArrayList<>();
 
 590         List<String> derivedFromResources = nodeType.getDerivedFrom();
 
 591         if (derivedFromResources != null && !derivedFromResources.isEmpty()) {
 
 593             for (String parentResource : derivedFromResources) {
 
 594                 Either<List<GraphVertex>, JanusGraphOperationStatus> getParentResources = derivedResourceResolver.findDerivedResources(parentResource);
 
 595                 List<GraphVertex> resources = null;
 
 596                 if (getParentResources.isRight()) {
 
 597                     log.error("Cannot find parent resource by tosca resource name {} in the graph.", parentResource);
 
 598                     return Either.right(StorageOperationStatus.PARENT_RESOURCE_NOT_FOUND);
 
 601                     resources = getParentResources.left().value();
 
 602                     if (resources == null || resources.size() == 0) {
 
 603                         log.error("Cannot find parent resource by tosca name {} in the graph. resources size is empty", parentResource);
 
 604                         return Either.right(StorageOperationStatus.PARENT_RESOURCE_NOT_FOUND);
 
 606                         if (resources.size() > 1) {
 
 607                             return handleMultipleParent(parentResource, derivedResources, resources);
 
 609                             GraphVertex parentResourceData = resources.get(0);
 
 610                             derivedResources.add(parentResourceData);
 
 618         return Either.left(derivedResources);
 
 621     Either<List<GraphVertex>, StorageOperationStatus> handleMultipleParent(String parentResource, List<GraphVertex> derivedResource, List<GraphVertex> fetchedDerivedResources) {
 
 623         Either<List<GraphVertex>, StorageOperationStatus> result = Either.left(derivedResource);
 
 625             fetchedDerivedResources.sort((d1, d2) -> {
 
 626                 return new Double(Double.parseDouble((String) d1.getMetadataProperty(GraphPropertyEnum.VERSION))).compareTo(Double.parseDouble((String) d2.getMetadataProperty(GraphPropertyEnum.VERSION)));
 
 629             int actualHighestIndex = fetchedDerivedResources.size() - 1;
 
 630             derivedResource.add(fetchedDerivedResources.get(actualHighestIndex));
 
 631             fetchedDerivedResources.remove(actualHighestIndex);
 
 633             StorageOperationStatus status = fixMultipleParent(fetchedDerivedResources);
 
 634             if (status != StorageOperationStatus.OK) {
 
 635                 result = Either.right(status);
 
 637         } catch (Exception e) {
 
 638             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Exception occured during handle multiple parent {}. Exception is  {}", parentResource, e.getMessage());
 
 639             result = Either.right(StorageOperationStatus.GENERAL_ERROR);
 
 644     private StorageOperationStatus fixMultipleParent(List<GraphVertex> fetchedDerivedResources) {
 
 645         StorageOperationStatus result = StorageOperationStatus.OK;
 
 646         for (GraphVertex fetchedDerivedResource : fetchedDerivedResources) {
 
 647             fetchedDerivedResource.addMetadataProperty(GraphPropertyEnum.IS_HIGHEST_VERSION, false);
 
 648             Either<GraphVertex, JanusGraphOperationStatus> updateVertexRes = janusGraphDao.updateVertex(fetchedDerivedResource);
 
 649             if (updateVertexRes.isRight()) {
 
 650                 JanusGraphOperationStatus titatStatus = updateVertexRes.right().value();
 
 651                 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to set highest version of node type {} to false. Status is  {}", fetchedDerivedResource.getMetadataProperty(GraphPropertyEnum.TOSCA_RESOURCE_NAME), titatStatus);
 
 652                 result = DaoStatusConverter.convertJanusGraphStatusToStorageStatus(titatStatus);
 
 659     private GraphVertex fillMetadata(GraphVertex nodeTypeVertex, NodeType nodeType) {
 
 660         nodeTypeVertex.setLabel(VertexTypeEnum.NODE_TYPE);
 
 662         fillCommonMetadata(nodeTypeVertex, nodeType);
 
 664         return nodeTypeVertex;
 
 668     public Either<ToscaElement, StorageOperationStatus> deleteToscaElement(GraphVertex toscaElementVertex) {
 
 669         Either<ToscaElement, StorageOperationStatus> nodeType = getToscaElement(toscaElementVertex, new ComponentParametersView());
 
 670         if (nodeType.isRight()) {
 
 671             log.debug("Failed to fetch tosca element {} error {}", toscaElementVertex.getUniqueId(), nodeType.right().value());
 
 674         JanusGraphOperationStatus status = disassociateAndDeleteCommonElements(toscaElementVertex);
 
 675         if (status != JanusGraphOperationStatus.OK) {
 
 676             Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 678         status = janusGraphDao
 
 679             .disassociateAndDeleteLast(toscaElementVertex, Direction.OUT, EdgeLabelEnum.CAPABILITIES);
 
 680         if (status != JanusGraphOperationStatus.OK) {
 
 681             log.debug("Failed to disassociate capabilties for {} error {}", toscaElementVertex.getUniqueId(), status);
 
 682             Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 684         status = janusGraphDao
 
 685             .disassociateAndDeleteLast(toscaElementVertex, Direction.OUT, EdgeLabelEnum.CAPABILITIES_PROPERTIES);
 
 686         if (status != JanusGraphOperationStatus.OK) {
 
 687             log.debug("Failed to disassociate capabilties properties for {} error {}", toscaElementVertex.getUniqueId(), status);
 
 688             Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 690         status = janusGraphDao
 
 691             .disassociateAndDeleteLast(toscaElementVertex, Direction.OUT, EdgeLabelEnum.REQUIREMENTS);
 
 692         if (status != JanusGraphOperationStatus.OK) {
 
 693             log.debug("Failed to disassociate requirements for {} error {}", toscaElementVertex.getUniqueId(), status);
 
 694             Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 696         status = janusGraphDao
 
 697             .disassociateAndDeleteLast(toscaElementVertex, Direction.OUT, EdgeLabelEnum.ATTRIBUTES);
 
 698         if (status != JanusGraphOperationStatus.OK) {
 
 699             log.debug("Failed to disassociate attributes for {} error {}", toscaElementVertex.getUniqueId(), status);
 
 700             Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 702         status = janusGraphDao
 
 703             .disassociateAndDeleteLast(toscaElementVertex, Direction.OUT, EdgeLabelEnum.INTERFACE_ARTIFACTS);
 
 704         if (status != JanusGraphOperationStatus.OK) {
 
 705             log.debug("Failed to disassociate interface artifacts for {} error {}", toscaElementVertex.getUniqueId(), status);
 
 706             Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 708         toscaElementVertex.getVertex().remove();
 
 709         log.trace("Tosca element vertex for {} was removed", toscaElementVertex.getUniqueId());
 
 714     @SuppressWarnings("unchecked")
 
 716     public Either<NodeType, StorageOperationStatus> createToscaElement(ToscaElement toscaElement) {
 
 717         return createNodeType((NodeType) toscaElement);
 
 721     protected <T extends ToscaElement> JanusGraphOperationStatus setCategoriesFromGraph(GraphVertex vertexComponent, T toscaElement) {
 
 722         return setResourceCategoryFromGraph(vertexComponent, toscaElement);
 
 726     protected <T extends ToscaElement> StorageOperationStatus validateCategories(T toscaElementToUpdate, GraphVertex elementV) {
 
 727         return validateResourceCategory(toscaElementToUpdate, elementV);
 
 731     protected <T extends ToscaElement> StorageOperationStatus updateDerived(T toscaElementToUpdate, GraphVertex nodeTypeV) {
 
 733         NodeType nodeType = (NodeType) toscaElementToUpdate;
 
 735         List<String> derivedFromResources = nodeType.getDerivedFrom();
 
 737         // now supported only single derived from
 
 738         if (derivedFromResources != null && !derivedFromResources.isEmpty() && derivedFromResources.get(0) != null) {
 
 739             String firstDerived = derivedFromResources.get(0);
 
 740             boolean derivedFromGenericType = null != nodeType.getDerivedFromGenericType();
 
 741             Either<GraphVertex, JanusGraphOperationStatus> childVertex = janusGraphDao
 
 742                 .getChildVertex(nodeTypeV, EdgeLabelEnum.DERIVED_FROM, JsonParseFlagEnum.NoParse);
 
 743             if (childVertex.isRight()) {
 
 744                 JanusGraphOperationStatus getchieldError = childVertex.right().value();
 
 745                 log.debug("Failed to fetch derived resource for element {} error {}", nodeTypeV.getUniqueId(), getchieldError);
 
 746                 return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getchieldError);
 
 748             GraphVertex firstDerivedInChain = childVertex.left().value();
 
 750             String firstCurrentDerived = (String) firstDerivedInChain.getMetadataProperty(GraphPropertyEnum.TOSCA_RESOURCE_NAME);
 
 751             if (!firstDerived.equals(firstCurrentDerived) || derivedFromGenericType) {
 
 753                 Map<GraphPropertyEnum, Object> propertiesToMatch = new HashMap<>();
 
 754                 propertiesToMatch.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
 
 756                 propertiesToMatch.put(GraphPropertyEnum.TOSCA_RESOURCE_NAME, firstDerived);
 
 757                 propertiesToMatch.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
 
 759                 Either<List<GraphVertex>, JanusGraphOperationStatus> getParentResources = janusGraphDao
 
 760                     .getByCriteria(VertexTypeEnum.NODE_TYPE, propertiesToMatch, JsonParseFlagEnum.NoParse);
 
 762                 if (getParentResources.isRight()) {
 
 763                     JanusGraphOperationStatus error = getParentResources.right().value();
 
 764                     CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to fetch derived by criteria {}. error {} ", propertiesToMatch, error);
 
 765                     return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(error);
 
 768                 GraphVertex newDerivedV = getParentResources.left().value().get(0);
 
 769                 return updateDerived(toscaElementToUpdate, nodeTypeV, firstDerivedInChain, newDerivedV, false);
 
 772         return StorageOperationStatus.OK;
 
 777      * @param toscaElementToUpdate
 
 784     protected <T extends ToscaElement> StorageOperationStatus updateDerived(T toscaElementToUpdate, GraphVertex nodeTypeV, GraphVertex preDerivedV, GraphVertex newDerivedV, boolean mergeValues) {
 
 785         Set<String> preDerivedChainIdList = new HashSet();
 
 786         preDerivedChainIdList.add(preDerivedV.getUniqueId());
 
 787         Either<GraphVertex, JanusGraphOperationStatus> childVertex = janusGraphDao
 
 788             .getChildVertex(preDerivedV, EdgeLabelEnum.DERIVED_FROM, JsonParseFlagEnum.NoParse);
 
 789         while (childVertex.isLeft()) {
 
 790             GraphVertex currentChield = childVertex.left().value();
 
 791             preDerivedChainIdList.add(currentChield.getUniqueId());
 
 792             childVertex = janusGraphDao
 
 793                 .getChildVertex(currentChield, EdgeLabelEnum.DERIVED_FROM, JsonParseFlagEnum.NoParse);
 
 796         List<GraphVertex> derivedResources = new ArrayList<>();
 
 797         derivedResources.add(newDerivedV);
 
 798         StorageOperationStatus updateStatus = updateDataFromNewDerived(derivedResources, nodeTypeV, (NodeType) toscaElementToUpdate, mergeValues, preDerivedChainIdList);
 
 799         if (updateStatus != StorageOperationStatus.OK) {
 
 800             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update data for {} from new derived {} ", nodeTypeV.getUniqueId(), newDerivedV.getUniqueId(), updateStatus);
 
 804         Either<Edge, JanusGraphOperationStatus> deleteEdge = janusGraphDao
 
 805             .deleteEdge(nodeTypeV, preDerivedV, EdgeLabelEnum.DERIVED_FROM);
 
 806         if (deleteEdge.isRight()) {
 
 807             JanusGraphOperationStatus deleteError = deleteEdge.right().value();
 
 808             log.debug("Failed to disassociate element {} from derived {} , error {}", nodeTypeV.getUniqueId(), preDerivedV.getUniqueId(), deleteError);
 
 809             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(deleteError);
 
 812         janusGraphDao.createEdge(nodeTypeV, newDerivedV, EdgeLabelEnum.DERIVED_FROM, new HashMap<>());
 
 814         return StorageOperationStatus.OK;
 
 817     private StorageOperationStatus associateDerivedDataByType(EdgeLabelEnum edgeLabel, GraphVertex nodeTypeV, NodeType nodeToUpdate, List<GraphVertex> newDerived) {
 
 821             return associateCapabilitiesToResource(nodeTypeV, nodeToUpdate, newDerived);
 
 823             return associateRequirementsToResource(nodeTypeV, nodeToUpdate, newDerived);
 
 825             return associatePropertiesToResource(nodeTypeV, nodeToUpdate, newDerived);
 
 827             return associateAttributesToResource(nodeTypeV, nodeToUpdate, newDerived);
 
 828         case ADDITIONAL_INFORMATION:
 
 829             return addAdditionalInformationToResource(nodeTypeV, nodeToUpdate, newDerived);
 
 830         case CAPABILITIES_PROPERTIES:
 
 831             return associateCapabilitiesPropertiesToResource(nodeTypeV, nodeToUpdate, newDerived);
 
 833             return StorageOperationStatus.OK;
 
 838     private StorageOperationStatus updateDataFromNewDerived(List<GraphVertex> newDerived, GraphVertex nodeTypeV, NodeType nodeToUpdate, boolean mergeValues, Set<String> preDerivedChainIdList) {
 
 839         EnumSet<EdgeLabelEnum> edgeLabels = EnumSet.of(EdgeLabelEnum.CAPABILITIES, EdgeLabelEnum.REQUIREMENTS, EdgeLabelEnum.PROPERTIES, EdgeLabelEnum.ATTRIBUTES, EdgeLabelEnum.CAPABILITIES_PROPERTIES, EdgeLabelEnum.ADDITIONAL_INFORMATION);
 
 840         StorageOperationStatus status = null;
 
 841         for (EdgeLabelEnum edge : edgeLabels) {
 
 842             status = updateDataByType(newDerived, nodeTypeV, edge, nodeToUpdate, mergeValues, preDerivedChainIdList);
 
 843             if (status != StorageOperationStatus.OK) {
 
 851     private <T extends ToscaDataDefinition> StorageOperationStatus updateDataByType(List<GraphVertex> newDerivedList, GraphVertex nodeTypeV, EdgeLabelEnum label, NodeType nodeElement, boolean mergeValues, Set<String> preDerivedChainIdList) {
 
 852         log.debug("Update data from derived for element {} type {}", nodeTypeV.getUniqueId(), label);
 
 853         Either<GraphVertex, JanusGraphOperationStatus> dataFromGraph = getDataVertex(nodeTypeV, label);
 
 854         if (dataFromGraph.isRight()) {
 
 855             if (JanusGraphOperationStatus.NOT_FOUND == dataFromGraph.right().value())
 
 856                 return associateDerivedDataByType(label, nodeTypeV, nodeElement, newDerivedList);
 
 857             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(dataFromGraph.right().value());
 
 859         GraphVertex dataV = dataFromGraph.left().value();
 
 861         Map<String, T> mapFromGraph = (Map<String, T>) dataV.getJson();
 
 862         Map<String, T> valuesFrmPrev = null;
 
 863         if (isSimpleHierarchy(label)) {
 
 865                 valuesFrmPrev = mapFromGraph.entrySet().stream().filter(e -> e.getValue().getOwnerId() != null).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
 
 867             mapFromGraph.entrySet().removeIf(e -> preDerivedChainIdList.contains(e.getValue().getOwnerId()));
 
 869             final Map<String, T> valuesFrmPrevFinal = new HashMap<>();
 
 870             mapFromGraph.entrySet().stream().forEach(e -> {
 
 871                 T value = e.getValue();
 
 872                 value = ToscaDataDefinition.removeAndCollectByOwnerId(value, preDerivedChainIdList);
 
 873                 valuesFrmPrevFinal.put(e.getKey(), value);
 
 875             valuesFrmPrev = valuesFrmPrevFinal;
 
 876             mapFromGraph.entrySet().removeIf(e->e.getValue().isEmpty());
 
 879         Either<Map<String, T>, StorageOperationStatus> dataFromDerived = getDataFromDerived(newDerivedList, label);
 
 880         if (dataFromDerived.isRight()) {
 
 881             return dataFromDerived.right().value();
 
 883         Map<String, T> dataFromDerivedAll = dataFromDerived.left().value();
 
 885         Either<Map<String, T>, String> merged = ToscaDataDefinition.mergeDataMaps(dataFromDerivedAll, mapFromGraph);
 
 886         if (merged.isRight()) {
 
 887             log.debug("property {} cannot be overriden", merged.right().value());
 
 888             return StorageOperationStatus.INVALID_PROPERTY;
 
 890         if (mergeValues && valuesFrmPrev != null) {
 
 891             valuesFrmPrev.entrySet().forEach(e -> {
 
 892                 T newData = merged.left().value().get(e.getKey());
 
 893                 if (newData != null) {
 
 894                     if (isSimpleHierarchy(label)) {
 
 895                         e.getValue().mergeFunction(newData, true);
 
 897                         e.getValue().updateIfExist(newData, true);
 
 902         dataV.setJson(dataFromDerivedAll);
 
 903         Either<GraphVertex, JanusGraphOperationStatus> updateDataV = updateOrCopyOnUpdate(dataV, nodeTypeV, label);
 
 904         if (updateDataV.isRight()) {
 
 905             return DaoStatusConverter.convertJanusGraphStatusToStorageStatus(updateDataV.right().value());
 
 907         return StorageOperationStatus.OK;
 
 910     private boolean isSimpleHierarchy(EdgeLabelEnum label) {
 
 914         case ADDITIONAL_INFORMATION:
 
 925     public <T extends ToscaElement> void fillToscaElementVertexData(GraphVertex elementV, T toscaElementToUpdate, JsonParseFlagEnum flag) {
 
 926         fillMetadata(elementV, (NodeType) toscaElementToUpdate);
 
 929     public Either<ToscaElement, StorageOperationStatus> shouldUpdateDerivedVersion(ToscaElement toscaElementToUpdate, GraphVertex nodeTypeV) {
 
 930         NodeType nodeType = (NodeType) toscaElementToUpdate;
 
 932         Either<GraphVertex, JanusGraphOperationStatus> childVertex = janusGraphDao
 
 933             .getChildVertex(nodeTypeV, EdgeLabelEnum.DERIVED_FROM, JsonParseFlagEnum.NoParse);
 
 934         if (childVertex.isRight()) {
 
 935             JanusGraphOperationStatus getchildError = childVertex.right().value();
 
 936             if (getchildError == JanusGraphOperationStatus.NOT_FOUND) {
 
 937                 log.debug("derived resource for element {} not found", nodeTypeV.getUniqueId());
 
 938                 return Either.right(StorageOperationStatus.OK);
 
 941             log.debug("Failed to fetch derived resource for element {} error {}", nodeTypeV.getUniqueId(), getchildError);
 
 942             return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getchildError));
 
 944         GraphVertex firstDerivedInChain = childVertex.left().value();
 
 946         String currentVersion = (String) firstDerivedInChain.getMetadataProperty(GraphPropertyEnum.VERSION);
 
 948         Map<GraphPropertyEnum, Object> props = new HashMap<>();
 
 949         props.put(GraphPropertyEnum.TOSCA_RESOURCE_NAME, nodeType.getDerivedFrom().get(0));
 
 950         props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
 
 951         props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
 
 953         Map<GraphPropertyEnum, Object> propsHasNot = new HashMap<>();
 
 954         propsHasNot.put(GraphPropertyEnum.IS_DELETED, true);
 
 955         Either<List<GraphVertex>, JanusGraphOperationStatus> byCriteria = janusGraphDao
 
 956             .getByCriteria(VertexTypeEnum.NODE_TYPE, props, propsHasNot, JsonParseFlagEnum.NoParse);
 
 957         if (byCriteria.isRight()) {
 
 958             log.debug("Failed to fetch derived by props {} error {}", props, byCriteria.right().value());
 
 959             return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(byCriteria.right().value()));
 
 961         List<GraphVertex> lastDerived = byCriteria.left().value();
 
 962         // now supported only one derived!!! Change in future!(Evg)
 
 963         GraphVertex derivedFromHighest = lastDerived.get(0);
 
 964         String highestVersion = (String) derivedFromHighest.getMetadataProperty(GraphPropertyEnum.VERSION);
 
 965         if (!highestVersion.equals(currentVersion)) {
 
 967             // need to update to latest version of derived from
 
 968             StorageOperationStatus updateDerived = updateDerived(toscaElementToUpdate, nodeTypeV, firstDerivedInChain, derivedFromHighest, true);
 
 970             if (updateDerived != StorageOperationStatus.OK) {
 
 971                 log.debug("Failed to update {} to highest derived {} from error {}", nodeTypeV.getUniqueId(), derivedFromHighest.getUniqueId(), updateDerived);
 
 972                 return Either.right(updateDerived);
 
 974             return getToscaElement(nodeTypeV.getUniqueId(), new ComponentParametersView());
 
 976         // no version changes
 
 977         return Either.right(StorageOperationStatus.OK);