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.HashMap;
24 import java.util.Iterator;
25 import java.util.List;
27 import java.util.Map.Entry;
30 import org.apache.commons.lang3.tuple.ImmutablePair;
31 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
32 import org.openecomp.sdc.be.dao.graph.datatype.GraphNode;
33 import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation;
34 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
35 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
36 import org.openecomp.sdc.be.dao.titan.TitanGenericDao;
37 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
38 import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
39 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
40 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
41 import org.openecomp.sdc.be.model.ArtifactDefinition;
42 import org.openecomp.sdc.be.model.InterfaceDefinition;
43 import org.openecomp.sdc.be.model.Operation;
44 import org.openecomp.sdc.be.model.operations.api.IInterfaceLifecycleOperation;
45 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
46 import org.openecomp.sdc.be.resources.data.ArtifactData;
47 import org.openecomp.sdc.be.resources.data.InterfaceData;
48 import org.openecomp.sdc.be.resources.data.OperationData;
49 import org.openecomp.sdc.be.resources.data.ResourceMetadataData;
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("interface-operation")
59 public class InterfaceLifecycleOperation implements IInterfaceLifecycleOperation {
61 private static Logger log = LoggerFactory.getLogger(InterfaceLifecycleOperation.class.getName());
63 public InterfaceLifecycleOperation() {
67 @javax.annotation.Resource
68 private ArtifactOperation artifactOperation;
70 @javax.annotation.Resource
71 private TitanGenericDao titanGenericDao;
74 public Either<InterfaceDefinition, StorageOperationStatus> addInterfaceToResource(InterfaceDefinition interf, String resourceId, String interfaceName) {
76 return addInterfaceToResource(interf, resourceId, interfaceName, false);
80 public Either<InterfaceDefinition, StorageOperationStatus> addInterfaceToResource(InterfaceDefinition interf, String resourceId, String interfaceName, boolean inTransaction) {
82 return createInterfaceOnResource(interf, resourceId, interfaceName, true, inTransaction);
86 private Either<OperationData, TitanOperationStatus> addOperationToGraph(InterfaceDefinition interf, String opName, Operation op, InterfaceData interfaceData) {
88 op.setUniqueId(UniqueIdBuilder.buildPropertyUniqueId((String) interfaceData.getUniqueId(), opName));
89 OperationData operationData = new OperationData(op);
91 log.debug("Before adding operation to graph {}", operationData);
92 Either<OperationData, TitanOperationStatus> createOpNodeResult = titanGenericDao.createNode(operationData, OperationData.class);
93 log.debug("After adding operation to graph {}", operationData);
95 if (createOpNodeResult.isRight()) {
96 TitanOperationStatus opStatus = createOpNodeResult.right().value();
97 log.error("Failed to add operation {} to graph. status is {}", opName, opStatus);
98 return Either.right(opStatus);
101 Map<String, Object> props = new HashMap<String, Object>();
102 props.put(GraphPropertiesDictionary.NAME.getProperty(), opName);
103 Either<GraphRelation, TitanOperationStatus> createRelResult = titanGenericDao.createRelation(interfaceData, operationData, GraphEdgeLabels.INTERFACE_OPERATION, props);
105 if (createRelResult.isRight()) {
106 TitanOperationStatus operationStatus = createOpNodeResult.right().value();
107 log.error("Failed to associate operation {} to property {} in graph. status is {}", interfaceData.getUniqueId(), opName, operationStatus);
109 return Either.right(operationStatus);
112 return Either.left(createOpNodeResult.left().value());
116 private Either<TitanVertex, TitanOperationStatus> addOperationToGraph(InterfaceDefinition interf, String opName, Operation op, TitanVertex interfaceVertex) {
118 String interfaceId = (String) titanGenericDao.getProperty(interfaceVertex, GraphPropertiesDictionary.UNIQUE_ID.getProperty());
119 op.setUniqueId(UniqueIdBuilder.buildPropertyUniqueId(interfaceId, opName));
120 OperationData operationData = new OperationData(op);
122 log.debug("Before adding operation to graph {}", operationData);
123 Either<TitanVertex, TitanOperationStatus> createOpNodeResult = titanGenericDao.createNode(operationData);
125 if (createOpNodeResult.isRight()) {
126 TitanOperationStatus opStatus = createOpNodeResult.right().value();
127 log.error("Failed to add operation {} to graph. status is {}", opName, opStatus);
128 return Either.right(opStatus);
131 Map<String, Object> props = new HashMap<String, Object>();
132 props.put(GraphPropertiesDictionary.NAME.getProperty(), opName);
133 TitanVertex operationVertex = createOpNodeResult.left().value();
134 TitanOperationStatus createRelResult = titanGenericDao.createEdge(interfaceVertex, operationVertex, GraphEdgeLabels.INTERFACE_OPERATION, props);
136 if (!createRelResult.equals(TitanOperationStatus.OK)) {
137 log.error("Failed to associate operation {} to property {} in graph. status is {}", interfaceId, opName, createRelResult);
139 return Either.right(createRelResult);
141 return Either.left(operationVertex);
144 private InterfaceDefinition convertInterfaceDataToInterfaceDefinition(InterfaceData interfaceData) {
146 log.debug("The object returned after create interface is {}", interfaceData);
148 InterfaceDefinition interfaceDefResult = new InterfaceDefinition(interfaceData.getInterfaceDataDefinition());
150 return interfaceDefResult;
154 private Operation convertOperationDataToOperation(OperationData operationData) {
156 log.debug("The object returned after create operation is {}", operationData);
158 Operation operationDefResult = new Operation(operationData.getOperationDataDefinition());
160 return operationDefResult;
164 private Either<InterfaceData, TitanOperationStatus> addInterfaceToGraph(InterfaceDefinition interfaceInfo, String interfaceName, String resourceId) {
166 InterfaceData interfaceData = new InterfaceData(interfaceInfo);
168 ResourceMetadataData resourceData = new ResourceMetadataData();
169 resourceData.getMetadataDataDefinition().setUniqueId(resourceId);
171 String interfaceNameSplitted = getShortInterfaceName(interfaceInfo);
173 interfaceInfo.setUniqueId(UniqueIdBuilder.buildPropertyUniqueId(resourceId, interfaceNameSplitted));
175 Either<InterfaceData, TitanOperationStatus> existInterface = titanGenericDao.getNode(interfaceData.getUniqueIdKey(), interfaceData.getUniqueId(), InterfaceData.class);
177 if (existInterface.isRight()) {
179 return createInterfaceNodeAndRelation(interfaceNameSplitted, resourceId, interfaceData, resourceData);
181 log.debug("Interface {} already exist", interfaceData.getUniqueId());
182 return Either.right(TitanOperationStatus.ALREADY_EXIST);
186 private Either<TitanVertex, TitanOperationStatus> addInterfaceToGraph(InterfaceDefinition interfaceInfo, String interfaceName, String resourceId, TitanVertex metadataVertex) {
188 InterfaceData interfaceData = new InterfaceData(interfaceInfo);
190 String interfaceNameSplitted = getShortInterfaceName(interfaceInfo);
192 interfaceInfo.setUniqueId(UniqueIdBuilder.buildPropertyUniqueId(resourceId, interfaceNameSplitted));
194 Either<TitanVertex, TitanOperationStatus> existInterface = titanGenericDao.getVertexByProperty(interfaceData.getUniqueIdKey(), interfaceData.getUniqueId());
196 if (existInterface.isRight()) {
198 return createInterfaceNodeAndRelation(interfaceNameSplitted, resourceId, interfaceData, metadataVertex);
200 log.debug("Interface {} already exist", interfaceData.getUniqueId());
201 return Either.right(TitanOperationStatus.ALREADY_EXIST);
205 private Either<InterfaceData, TitanOperationStatus> createInterfaceNodeAndRelation(String interfaceName, String resourceId, InterfaceData interfaceData, ResourceMetadataData resourceData) {
206 log.debug("Before adding interface to graph {}", interfaceData);
207 Either<InterfaceData, TitanOperationStatus> createNodeResult = titanGenericDao.createNode(interfaceData, InterfaceData.class);
208 log.debug("After adding property to graph {}", interfaceData);
210 if (createNodeResult.isRight()) {
211 TitanOperationStatus operationStatus = createNodeResult.right().value();
212 log.error("Failed to add interface {} to graph. status is {}", interfaceName, operationStatus);
213 return Either.right(operationStatus);
216 Map<String, Object> props = new HashMap<String, Object>();
217 props.put(GraphPropertiesDictionary.NAME.getProperty(), interfaceName);
218 Either<GraphRelation, TitanOperationStatus> createRelResult = titanGenericDao.createRelation(resourceData, interfaceData, GraphEdgeLabels.INTERFACE, props);
219 if (createRelResult.isRight()) {
220 TitanOperationStatus operationStatus = createNodeResult.right().value();
221 log.error("Failed to associate resource {} to property {} in graph. status is {}", resourceId, interfaceName, operationStatus);
223 return Either.right(operationStatus);
226 return Either.left(createNodeResult.left().value());
229 private Either<TitanVertex, TitanOperationStatus> createInterfaceNodeAndRelation(String interfaceName, String resourceId, InterfaceData interfaceData, TitanVertex metadataVertex) {
230 log.debug("Before adding interface to graph {}", interfaceData);
231 Either<TitanVertex, TitanOperationStatus> createNodeResult = titanGenericDao.createNode(interfaceData);
233 if (createNodeResult.isRight()) {
234 TitanOperationStatus operationStatus = createNodeResult.right().value();
235 log.error("Failed to add interface {} to graph. status is {}", interfaceName, operationStatus);
236 return Either.right(operationStatus);
239 Map<String, Object> props = new HashMap<String, Object>();
240 props.put(GraphPropertiesDictionary.NAME.getProperty(), interfaceName);
241 TitanVertex interfaceVertex = createNodeResult.left().value();
242 TitanOperationStatus createRelResult = titanGenericDao.createEdge(metadataVertex, interfaceVertex, GraphEdgeLabels.INTERFACE, props);
243 if (!createRelResult.equals(TitanOperationStatus.OK)) {
244 log.error("Failed to associate resource {} to property {} in graph. status is {}", resourceId, interfaceName, createRelResult);
246 return Either.left(interfaceVertex);
249 private Either<OperationData, TitanOperationStatus> createOperationNodeAndRelation(String operationName, OperationData operationData, InterfaceData interfaceData) {
250 log.debug("Before adding operation to graph {}", operationData);
251 Either<OperationData, TitanOperationStatus> createNodeResult = titanGenericDao.createNode(operationData, OperationData.class);
252 log.debug("After adding operation to graph {}", interfaceData);
254 if (createNodeResult.isRight()) {
255 TitanOperationStatus operationStatus = createNodeResult.right().value();
256 log.error("Failed to add interfoperationce {} to graph. status is {}", operationName, operationStatus);
257 return Either.right(operationStatus);
260 Map<String, Object> props = new HashMap<String, Object>();
261 props.put(GraphPropertiesDictionary.NAME.getProperty(), operationName);
262 Either<GraphRelation, TitanOperationStatus> createRelResult = titanGenericDao.createRelation(interfaceData, operationData, GraphEdgeLabels.INTERFACE_OPERATION, props);
263 if (createRelResult.isRight()) {
264 TitanOperationStatus operationStatus = createNodeResult.right().value();
265 log.error("Failed to associate operation {} to interface {} in graph. status is {}", operationName, interfaceData.getUniqueId(), operationStatus);
267 return Either.right(operationStatus);
270 return Either.left(createNodeResult.left().value());
274 // public Either<InterfaceDefinition, StorageOperationStatus> getInterface(
275 // String interfaceId) {
278 // * Either<InterfaceData, TitanOperationStatus> getResult =
279 // * this.titanGenericDao
280 // * .getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Interface),
281 // * interfaceId, InterfaceData.class); if (getResult.isLeft()) {
282 // * InterfaceData propertyData = getResult.left().value(); return
283 // * Either.left(convertPropertyDataToPropertyDefinition(propertyData)); }
284 // * else { TitanOperationStatus titanStatus = getResult.right().value();
285 // * log.debug("Node with id " + propertyId +
286 // * " was not found in the graph. status: " + titanStatus);
287 // * StorageOperationStatus storageOperationStatus =
288 // * DaoStatusConverter.convertTitanStatusToStorageStatus(titanStatus);
289 // * return Either.right(storageOperationStatus); }
295 // public Either<InterfaceDefinition, StorageOperationStatus> getInterface(
296 // String interfaceId, boolean inTransaction) {
297 // // TODO Auto-generated method stub
302 public Either<Map<String, InterfaceDefinition>, StorageOperationStatus> getAllInterfacesOfResource(String resourceIdn, boolean recursively) {
303 return getAllInterfacesOfResource(resourceIdn, recursively, false);
307 public Either<Map<String, InterfaceDefinition>, StorageOperationStatus> getAllInterfacesOfResource(String resourceId, boolean recursively, boolean inTransaction) {
309 Either<Map<String, InterfaceDefinition>, StorageOperationStatus> result = null;
310 Map<String, InterfaceDefinition> interfaces = new HashMap<String, InterfaceDefinition>();
312 if ((resourceId == null) || resourceId.isEmpty()) {
313 log.error("resourceId is empty");
314 result = Either.right(StorageOperationStatus.INVALID_ID);
318 TitanOperationStatus findInterfacesRes = TitanOperationStatus.GENERAL_ERROR;
320 findInterfacesRes = findAllInterfacesRecursively(resourceId, interfaces);
322 findInterfacesRes = findAllInterfacesNotRecursively(resourceId, interfaces);
324 if (!findInterfacesRes.equals(TitanOperationStatus.OK)) {
325 log.error("Failed to get all interfaces of resource {}. status is {}", resourceId, findInterfacesRes);
326 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(findInterfacesRes));
329 result = Either.left(interfaces);
332 if (false == inTransaction) {
333 if (result == null || result.isRight()) {
334 log.error("Going to execute rollback on graph.");
335 titanGenericDao.rollback();
337 log.debug("Going to execute commit on graph.");
338 titanGenericDao.commit();
344 private TitanOperationStatus findAllInterfacesNotRecursively(String resourceId, Map<String, InterfaceDefinition> interfaces) {
346 Either<List<ImmutablePair<InterfaceData, GraphEdge>>, TitanOperationStatus> interfaceNodes = titanGenericDao.getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Resource), resourceId, GraphEdgeLabels.INTERFACE,
347 NodeTypeEnum.Interface, InterfaceData.class);
349 if (interfaceNodes.isRight()) {
350 TitanOperationStatus status = interfaceNodes.right().value();
351 if (status != TitanOperationStatus.NOT_FOUND) {
355 List<ImmutablePair<InterfaceData, GraphEdge>> interfaceList = interfaceNodes.left().value();
356 if (interfaceList != null) {
357 for (ImmutablePair<InterfaceData, GraphEdge> interfacePair : interfaceList) {
358 String interfaceUniqueId = (String) interfacePair.getKey().getUniqueId();
359 Either<String, TitanOperationStatus> interfaceNameRes = getPropertyValueFromEdge(interfacePair.getValue(), GraphPropertiesDictionary.NAME);
360 if (interfaceNameRes.isRight()) {
361 log.error("The requirement name is missing on the edge of requirement {}", interfaceUniqueId);
362 return interfaceNameRes.right().value();
364 String interfaceName = interfaceNameRes.left().value();
365 Either<InterfaceDefinition, TitanOperationStatus> interfaceDefRes = getNonRecursiveInterface(interfacePair.getKey());
366 if (interfaceDefRes.isRight()) {
367 TitanOperationStatus status = interfaceDefRes.right().value();
368 log.error("Failed to get interface actions of interface {}", interfaceUniqueId);
372 InterfaceDefinition interfaceDefinition = interfaceDefRes.left().value();
373 if (true == interfaces.containsKey(interfaceName)) {
374 log.debug("The interface {} was already defined in dervied resource. add not overriden operations", interfaceName);
375 InterfaceDefinition existInterface = interfaces.get(interfaceName);
376 addMissingOperationsToInterface(interfaceDefinition, existInterface);
378 interfaces.put(interfaceName, interfaceDefinition);
384 return TitanOperationStatus.OK;
387 public TitanOperationStatus findAllInterfacesRecursively(String resourceId, Map<String, InterfaceDefinition> interfaces) {
389 TitanOperationStatus findAllInterfacesNotRecursively = findAllInterfacesNotRecursively(resourceId, interfaces);
390 if (!findAllInterfacesNotRecursively.equals(TitanOperationStatus.OK)) {
391 log.error("failed to get interfaces for resource {}. status is {}", resourceId, findAllInterfacesNotRecursively);
394 Either<ImmutablePair<ResourceMetadataData, GraphEdge>, TitanOperationStatus> parentNodes = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Resource), resourceId, GraphEdgeLabels.DERIVED_FROM, NodeTypeEnum.Resource,
395 ResourceMetadataData.class);
397 if (parentNodes.isRight()) {
398 TitanOperationStatus parentNodesStatus = parentNodes.right().value();
399 if (parentNodesStatus == TitanOperationStatus.NOT_FOUND) {
400 log.debug("Finish to lookup for parnet interfaces");
401 return TitanOperationStatus.OK;
403 log.error("Failed to find parent interfaces of resource {}. status is {}", resourceId, parentNodesStatus);
404 return parentNodesStatus;
407 ImmutablePair<ResourceMetadataData, GraphEdge> parnetNodePair = parentNodes.left().value();
408 String parentUniqueId = parnetNodePair.getKey().getMetadataDataDefinition().getUniqueId();
409 TitanOperationStatus addParentIntStatus = findAllInterfacesRecursively(parentUniqueId, interfaces);
411 if (addParentIntStatus != TitanOperationStatus.OK) {
412 log.error("Failed to fetch all interfaces of resource {}", parentUniqueId);
413 return addParentIntStatus;
416 return TitanOperationStatus.OK;
419 private Either<String, TitanOperationStatus> getPropertyValueFromEdge(GraphEdge edge, GraphPropertiesDictionary property) {
420 Map<String, Object> edgeProps = edge.getProperties();
421 String interfaceName = null;
422 if (edgeProps != null) {
423 interfaceName = (String) edgeProps.get(property.getProperty());
424 if (interfaceName == null) {
425 return Either.right(TitanOperationStatus.INVALID_ELEMENT);
428 return Either.right(TitanOperationStatus.INVALID_ELEMENT);
430 return Either.left(interfaceName);
433 private Either<InterfaceDefinition, TitanOperationStatus> getNonRecursiveInterface(InterfaceData interfaceData) {
435 log.debug("Going to fetch the operations associate to interface {}", interfaceData.getUniqueId());
436 InterfaceDefinition interfaceDefinition = new InterfaceDefinition(interfaceData.getInterfaceDataDefinition());
438 String interfaceId = interfaceData.getUniqueId();
439 Either<List<ImmutablePair<OperationData, GraphEdge>>, TitanOperationStatus> operationsRes = titanGenericDao.getChildrenNodes(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), interfaceId, GraphEdgeLabels.INTERFACE_OPERATION,
440 NodeTypeEnum.InterfaceOperation, OperationData.class);
442 if (operationsRes.isRight()) {
443 TitanOperationStatus status = operationsRes.right().value();
444 if (status != TitanOperationStatus.NOT_FOUND) {
445 return Either.right(status);
447 return Either.left(interfaceDefinition);
451 List<ImmutablePair<OperationData, GraphEdge>> operationList = operationsRes.left().value();
452 if (operationList != null && !operationList.isEmpty()) {
453 for (ImmutablePair<OperationData, GraphEdge> operationPair : operationList) {
454 Operation operation = new Operation(operationPair.getKey().getOperationDataDefinition());
455 Either<String, TitanOperationStatus> operationNameRes = getPropertyValueFromEdge(operationPair.getValue(), GraphPropertiesDictionary.NAME);
456 if (operationNameRes.isRight()) {
457 log.error("The operation name is missing on the edge of operation {}", operationPair.getKey().getUniqueId());
458 return Either.right(operationNameRes.right().value());
460 String operationName = operationNameRes.left().value();
461 findOperationImplementation(operation);
462 interfaceDefinition.getOperations().put(operationName, operation);
466 return Either.left(interfaceDefinition);
469 private StorageOperationStatus findOperationImplementation(Operation operation) {
471 String operationId = operation.getUniqueId();
472 Either<Map<String, ArtifactDefinition>, StorageOperationStatus> artifactsRes = artifactOperation.getArtifacts(operationId, NodeTypeEnum.InterfaceOperation, true);
473 if (artifactsRes.isRight() || artifactsRes.left().value() == null) {
474 log.error("failed to get artifact from graph for operation id {}. status is {}", operationId, artifactsRes.right().value());
475 return artifactsRes.right().value();
477 Map<String, ArtifactDefinition> artifacts = artifactsRes.left().value();
478 Iterator<String> iter = artifacts.keySet().iterator();
480 if (iter.hasNext()) {
481 operation.setImplementation(artifacts.get(iter.next()));
484 return StorageOperationStatus.OK;
487 private StorageOperationStatus addMissingOperationsToInterface(InterfaceDefinition interfaceDefinition, InterfaceDefinition existInterface) {
488 Map<String, Operation> existOperations = existInterface.getOperationsMap();
489 Map<String, Operation> operations = interfaceDefinition.getOperationsMap();
490 if (operations != null && !operations.isEmpty()) {
491 Set<Entry<String, Operation>> operationsSet = operations.entrySet();
492 for (Entry<String, Operation> operation : operationsSet) {
493 if (!existOperations.containsKey(operation.getKey())) {
494 existOperations.put(operation.getKey(), operation.getValue());
498 return StorageOperationStatus.OK;
502 public Either<Operation, StorageOperationStatus> updateInterfaceOperation(String resourceId, String interfaceName, String operationName, Operation interf) {
504 return updateInterfaceOperation(resourceId, interfaceName, operationName, interf, false);
508 public Either<Operation, StorageOperationStatus> updateInterfaceOperation(String resourceId, String interfaceName, String operationName, Operation operation, boolean inTransaction) {
509 Either<Operation, StorageOperationStatus> status = updateOperationOnGraph(operation, resourceId, interfaceName, operationName);
512 * if (status.isRight()) { if (false == inTransaction) { titanGenericDao.rollback(); }
513 * log.error("Failed to update operation {} of interfaceName {} of resource {}", operationName, interfaceName, resourceId);
515 * Either.right(DaoStatusConverter .convertTitanStatusToStorageStatus(status.right().value())); } else { if (false == inTransaction) { titanGenericDao.commit(); } OperationData operationData = status.left().value();
517 * Operation operationDefResult = convertOperationDataToOperation(operationData);
520 * log.debug("The returned OperationDefintion is {}", operationDefResult); return Either.left(operationDefResult); }
525 private Either<Operation, StorageOperationStatus> updateOperationOnGraph(Operation operation, String resourceId, String interfaceName, String operationName) {
527 Either<List<ImmutablePair<InterfaceData, GraphEdge>>, TitanOperationStatus> childrenNodes = titanGenericDao.getChildrenNodes(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), resourceId, GraphEdgeLabels.INTERFACE, NodeTypeEnum.Interface,
528 InterfaceData.class);
530 if (childrenNodes.isRight()) {
532 * InterfaceDefinition intDef = new InterfaceDefinition(); intDef.setType(interfaceName); Map<String, Operation> opMap = new HashMap<String, Operation>(); opMap.put(operationName, operation); intDef.setOperations(opMap);
533 * Either<InterfaceDefinition, StorageOperationStatus> statusRes = this .createInterfaceOnResource(intDef, resourceId, interfaceName, true); if (statusRes.isRight()) return Either.right(statusRes.right().value()); else {
534 * InterfaceDefinition newDef = statusRes.left().value(); Operation res = newDef.getOperations().get(operationName); return Either.left(res); }
536 return updateOperationFromParentNode(operation, resourceId, interfaceName, operationName);
539 return updateExistingOperation(resourceId, operation, interfaceName, operationName, childrenNodes);
545 private Either<Operation, StorageOperationStatus> updateExistingOperation(String resourceId, Operation operation, String interfaceName, String operationName,
546 Either<List<ImmutablePair<InterfaceData, GraphEdge>>, TitanOperationStatus> childrenNodes) {
547 Operation newOperation = null;
548 StorageOperationStatus storageOperationStatus = StorageOperationStatus.GENERAL_ERROR;
550 for (ImmutablePair<InterfaceData, GraphEdge> interfaceDataNode : childrenNodes.left().value()) {
552 GraphEdge interfaceEdge = interfaceDataNode.getRight();
553 Map<String, Object> interfaceEdgeProp = interfaceEdge.getProperties();
554 InterfaceData interfaceData = interfaceDataNode.getKey();
556 if (interfaceEdgeProp.get(GraphPropertiesDictionary.NAME.getProperty()).equals(interfaceName)) {
557 Either<List<ImmutablePair<OperationData, GraphEdge>>, TitanOperationStatus> operationRes = titanGenericDao.getChildrenNodes(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), (String) interfaceDataNode.getLeft().getUniqueId(),
558 GraphEdgeLabels.INTERFACE_OPERATION, NodeTypeEnum.InterfaceOperation, OperationData.class);
559 if (operationRes.isRight()) {
560 log.error("Failed to find operation {} on interface {}", operationName, interfaceName);
561 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(operationRes.right().value()));
563 List<ImmutablePair<OperationData, GraphEdge>> operations = operationRes.left().value();
564 for (ImmutablePair<OperationData, GraphEdge> operationPairEdge : operations) {
565 GraphEdge opEdge = operationPairEdge.getRight();
566 OperationData opData = operationPairEdge.getLeft();
567 Map<String, Object> opEdgeProp = opEdge.getProperties();
568 if (opEdgeProp.get(GraphPropertiesDictionary.NAME.getProperty()).equals(operationName)) {
569 ArtifactDefinition artifact = operation.getImplementationArtifact();
570 Either<ImmutablePair<ArtifactData, GraphEdge>, TitanOperationStatus> artifactRes = titanGenericDao.getChild(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), (String) opData.getUniqueId(), GraphEdgeLabels.ARTIFACT_REF,
571 NodeTypeEnum.ArtifactRef, ArtifactData.class);
572 Either<ArtifactDefinition, StorageOperationStatus> artStatus;
573 if (artifactRes.isRight()) {
574 artStatus = artifactOperation.addArifactToComponent(artifact, (String) operationPairEdge.getLeft().getUniqueId(), NodeTypeEnum.InterfaceOperation, true, true);
576 artStatus = artifactOperation.updateArifactOnResource(artifact, (String) operationPairEdge.getLeft().getUniqueId(), (String) artifactRes.left().value().getLeft().getUniqueId(), NodeTypeEnum.InterfaceOperation, true);
578 if (artStatus.isRight()) {
579 titanGenericDao.rollback();
580 log.error("Failed to add artifact {} to interface {}", operationName, interfaceName);
581 return Either.right(artStatus.right().value());
583 newOperation = this.convertOperationDataToOperation(opData);
584 newOperation.setImplementation(artStatus.left().value());
591 if (newOperation == null) {
592 Either<InterfaceData, TitanOperationStatus> parentInterfaceStatus = findInterfaceOnParentNode(resourceId, interfaceName);
593 if (parentInterfaceStatus.isRight()) {
594 log.debug("Interface {} not exist", interfaceName);
595 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(parentInterfaceStatus.right().value()));
598 InterfaceData parentInterfaceData = parentInterfaceStatus.left().value();
599 Either<List<ImmutablePair<OperationData, GraphEdge>>, TitanOperationStatus> opRes = titanGenericDao.getChildrenNodes(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), (String) parentInterfaceData.getUniqueId(),
600 GraphEdgeLabels.INTERFACE_OPERATION, NodeTypeEnum.InterfaceOperation, OperationData.class);
601 if (opRes.isRight()) {
602 log.error("Failed to find operation {} on interface {}", operationName, interfaceName);
603 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(operationRes.right().value()));
606 List<ImmutablePair<OperationData, GraphEdge>> parentOperations = opRes.left().value();
607 for (ImmutablePair<OperationData, GraphEdge> operationPairEdge : parentOperations) {
608 GraphEdge opEdge = operationPairEdge.getRight();
609 OperationData opData = operationPairEdge.getLeft();
610 Map<String, Object> opEdgeProp = opEdge.getProperties();
611 if (opEdgeProp.get(GraphPropertiesDictionary.NAME.getProperty()).equals(operationName)) {
612 return copyAndCreateNewOperation(operation, interfaceName, operationName, null, interfaceData, operationRes, opData);
623 storageOperationStatus = StorageOperationStatus.ARTIFACT_NOT_FOUND;
627 if (newOperation == null)
628 return Either.right(storageOperationStatus);
630 return Either.left(newOperation);
633 private Either<Operation, StorageOperationStatus> copyAndCreateNewOperation(Operation operation, String interfaceName, String operationName, Operation newOperation, InterfaceData interfaceData,
634 Either<List<ImmutablePair<OperationData, GraphEdge>>, TitanOperationStatus> operationRes, OperationData opData) {
635 OperationDataDefinition opDataInfo = opData.getOperationDataDefinition();
636 OperationDataDefinition newOperationInfo = new OperationDataDefinition(opDataInfo);
637 newOperationInfo.setUniqueId(UniqueIdBuilder.buildPropertyUniqueId(interfaceData.getUniqueId(), operationName.toLowerCase()));
638 OperationData newopData = new OperationData(newOperationInfo);
639 Either<OperationData, TitanOperationStatus> operationStatus = createOperationNodeAndRelation(operationName, newopData, interfaceData);
640 if (operationStatus.isRight()) {
641 log.error("Failed to create operation {} on interface {}", operationName, interfaceName);
642 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(operationRes.right().value()));
644 ArtifactDefinition artifact = operation.getImplementationArtifact();
645 if (artifact != null) {
646 Either<ArtifactDefinition, StorageOperationStatus> artStatus = artifactOperation.addArifactToComponent(artifact, (String) operationStatus.left().value().getUniqueId(), NodeTypeEnum.InterfaceOperation, true, true);
647 if (artStatus.isRight()) {
648 titanGenericDao.rollback();
649 log.error("Failed to add artifact {} to interface {}", operationName, interfaceName);
651 newOperation = this.convertOperationDataToOperation(opData);
652 newOperation.setImplementation(artStatus.left().value());
656 return Either.left(newOperation);
659 private Either<Operation, StorageOperationStatus> updateOperationFromParentNode(Operation operation, String resourceId, String interfaceName, String operationName) {
660 // Operation newOperation = null;
661 ResourceMetadataData resourceData = new ResourceMetadataData();
662 resourceData.getMetadataDataDefinition().setUniqueId(resourceId);
663 Either<InterfaceData, TitanOperationStatus> parentInterfaceStatus = findInterfaceOnParentNode(resourceId, interfaceName);
664 if (parentInterfaceStatus.isRight()) {
665 log.debug("Interface {} not exist", interfaceName);
666 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(parentInterfaceStatus.right().value()));
669 InterfaceData interfaceData = parentInterfaceStatus.left().value();
670 InterfaceDataDefinition intDataDefinition = interfaceData.getInterfaceDataDefinition();
671 InterfaceDataDefinition newInterfaceInfo = new InterfaceDataDefinition(intDataDefinition);
673 String interfaceNameSplitted = getShortInterfaceName(intDataDefinition);
675 newInterfaceInfo.setUniqueId(UniqueIdBuilder.buildPropertyUniqueId(resourceId, interfaceNameSplitted));
676 InterfaceData updatedInterfaceData = new InterfaceData(newInterfaceInfo);
677 Either<InterfaceData, TitanOperationStatus> createStatus = createInterfaceNodeAndRelation(interfaceName, resourceId, updatedInterfaceData, resourceData);
678 if (createStatus.isRight()) {
679 log.debug("failed to create interface node {} on resource {}", interfaceName, resourceId);
680 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(createStatus.right().value()));
683 InterfaceData newInterfaceNode = createStatus.left().value();
684 Either<GraphRelation, TitanOperationStatus> createRelResult = titanGenericDao.createRelation(newInterfaceNode, interfaceData, GraphEdgeLabels.DERIVED_FROM, null);
685 if (createRelResult.isRight()) {
686 TitanOperationStatus operationStatus = createRelResult.right().value();
687 log.error("Failed to associate interface {} to interface {} in graph. status is {}", interfaceData.getUniqueId(), newInterfaceNode.getUniqueId(), operationStatus);
689 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(operationStatus));
691 Either<List<ImmutablePair<OperationData, GraphEdge>>, TitanOperationStatus> operationRes = titanGenericDao.getChildrenNodes(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), (String) interfaceData.getUniqueId(),
692 GraphEdgeLabels.INTERFACE_OPERATION, NodeTypeEnum.InterfaceOperation, OperationData.class);
693 if (operationRes.isRight()) {
694 log.error("Failed to find operation {} on interface {}", operationName, interfaceName);
695 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(operationRes.right().value()));
698 List<ImmutablePair<OperationData, GraphEdge>> operations = operationRes.left().value();
699 for (ImmutablePair<OperationData, GraphEdge> operationPairEdge : operations) {
700 GraphEdge opEdge = operationPairEdge.getRight();
701 OperationData opData = operationPairEdge.getLeft();
702 Map<String, Object> opEdgeProp = opEdge.getProperties();
703 if (opEdgeProp.get(GraphPropertiesDictionary.NAME.getProperty()).equals(operationName)) {
705 return copyAndCreateNewOperation(operation, interfaceName, operationName, null, // changed
708 newInterfaceNode, operationRes, opData);
713 // if(newOperation == null)
714 return Either.right(StorageOperationStatus.GENERAL_ERROR);
716 // return Either.left(newOperation);
719 private Either<InterfaceData, TitanOperationStatus> findInterfaceOnParentNode(String resourceId, String interfaceName) {
721 Either<ImmutablePair<ResourceMetadataData, GraphEdge>, TitanOperationStatus> parentRes = titanGenericDao.getChild(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), resourceId, GraphEdgeLabels.DERIVED_FROM, NodeTypeEnum.Resource,
722 ResourceMetadataData.class);
723 if (parentRes.isRight()) {
724 log.debug("interface {} not found ", interfaceName);
725 return Either.right(parentRes.right().value());
727 ImmutablePair<ResourceMetadataData, GraphEdge> parenNode = parentRes.left().value();
729 Either<List<ImmutablePair<InterfaceData, GraphEdge>>, TitanOperationStatus> childrenNodes = titanGenericDao.getChildrenNodes(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), parenNode.getKey().getMetadataDataDefinition().getUniqueId(),
730 GraphEdgeLabels.INTERFACE, NodeTypeEnum.Interface, InterfaceData.class);
731 if (childrenNodes.isRight()) {
732 return findInterfaceOnParentNode(parenNode.getKey().getMetadataDataDefinition().getUniqueId(), interfaceName);
735 for (ImmutablePair<InterfaceData, GraphEdge> interfaceDataNode : childrenNodes.left().value()) {
737 GraphEdge interfaceEdge = interfaceDataNode.getRight();
738 Map<String, Object> interfaceEdgeProp = interfaceEdge.getProperties();
740 if (interfaceEdgeProp.get(GraphPropertiesDictionary.NAME.getProperty()).equals(interfaceName)) {
741 return Either.left(interfaceDataNode.getKey());
745 return findInterfaceOnParentNode(parenNode.getKey().getMetadataDataDefinition().getUniqueId(), interfaceName);
751 public Either<InterfaceDefinition, StorageOperationStatus> createInterfaceOnResource(InterfaceDefinition interf, String resourceId, String interfaceName, boolean failIfExist, boolean inTransaction) {
753 Either<InterfaceData, TitanOperationStatus> status = addInterfaceToGraph(interf, interfaceName, resourceId);
755 if (status.isRight()) {
756 titanGenericDao.rollback();
757 log.error("Failed to add interface {} to resource {}", interfaceName, resourceId);
758 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status.right().value()));
761 if (false == inTransaction) {
762 titanGenericDao.commit();
764 InterfaceData interfaceData = status.left().value();
766 InterfaceDefinition interfaceDefResult = convertInterfaceDataToInterfaceDefinition(interfaceData);
767 Map<String, Operation> operations = interf.getOperationsMap();
768 if (operations != null && !operations.isEmpty()) {
769 Set<String> opNames = operations.keySet();
770 Map<String, Operation> newOperations = new HashMap<String, Operation>();
771 for (String operationName : opNames) {
773 Operation op = operations.get(operationName);
774 Either<OperationData, TitanOperationStatus> opStatus = addOperationToGraph(interf, operationName, op, interfaceData);
775 if (status.isRight()) {
776 titanGenericDao.rollback();
777 log.error("Failed to add operation {} to interface {}", operationName, interfaceName);
778 } else if (status.isLeft()) {
779 if (false == inTransaction) {
780 titanGenericDao.commit();
782 OperationData opData = opStatus.left().value();
783 Operation newOperation = this.convertOperationDataToOperation(opData);
785 ArtifactDefinition art = op.getImplementationArtifact();
787 Either<ArtifactDefinition, StorageOperationStatus> artRes = artifactOperation.addArifactToComponent(art, (String) opData.getUniqueId(), NodeTypeEnum.InterfaceOperation, failIfExist, true);
788 if (artRes.isRight()) {
789 titanGenericDao.rollback();
790 log.error("Failed to add artifact {} to interface {}", operationName, interfaceName);
792 newOperation.setImplementation(artRes.left().value());
794 newOperations.put(operationName, newOperation);
798 interfaceDefResult.setOperationsMap(newOperations);
800 log.debug("The returned InterfaceDefintion is {}", interfaceDefResult);
801 return Either.left(interfaceDefResult);
807 public StorageOperationStatus createInterfaceOnResource(InterfaceDefinition interf, String resourceId, String interfaceName, boolean failIfExist, boolean inTransaction, TitanVertex metadataVertex) {
809 Either<TitanVertex, TitanOperationStatus> interfaceResult = addInterfaceToGraph(interf, interfaceName, resourceId, metadataVertex);
811 if (interfaceResult.isRight()) {
812 if (false == inTransaction) {
813 titanGenericDao.rollback();
815 log.error("Failed to add interface {} to resource {}", interfaceName, resourceId);
816 return DaoStatusConverter.convertTitanStatusToStorageStatus(interfaceResult.right().value());
819 if (false == inTransaction) {
820 titanGenericDao.commit();
822 TitanVertex interfaceVertex = interfaceResult.left().value();
824 // InterfaceDefinition interfaceDefResult =
825 // convertInterfaceDataToInterfaceDefinition(interfaceData);
826 Map<String, Operation> operations = interf.getOperationsMap();
827 if (operations != null && !operations.isEmpty()) {
828 Set<String> opNames = operations.keySet();
829 for (String operationName : opNames) {
831 Operation op = operations.get(operationName);
832 Either<TitanVertex, TitanOperationStatus> operationResult = addOperationToGraph(interf, operationName, op, interfaceVertex);
833 if (operationResult.isRight()) {
834 if (false == inTransaction) {
835 titanGenericDao.rollback();
837 log.error("Failed to add operation {} to interface {}", operationName, interfaceName);
838 return DaoStatusConverter.convertTitanStatusToStorageStatus(operationResult.right().value());
840 if (false == inTransaction) {
841 titanGenericDao.commit();
843 TitanVertex operationVertex = operationResult.left().value();
845 ArtifactDefinition art = op.getImplementationArtifact();
847 String opId = (String) titanGenericDao.getProperty(operationVertex, GraphPropertiesDictionary.UNIQUE_ID.getProperty());
848 StorageOperationStatus artRes = artifactOperation.addArifactToComponent(art, opId, NodeTypeEnum.InterfaceOperation, failIfExist, operationVertex);
849 if (!artRes.equals(StorageOperationStatus.OK)) {
850 if (false == inTransaction) {
851 titanGenericDao.rollback();
853 log.error("Failed to add artifact {} to interface {}", operationName, interfaceName);
860 return StorageOperationStatus.OK;
866 public Either<Operation, StorageOperationStatus> deleteInterfaceOperation(String resourceId, String interfaceName, String operationId) {
867 return deleteInterfaceOperation(resourceId, interfaceName, operationId, false);
871 public Either<Operation, StorageOperationStatus> deleteInterfaceOperation(String resourceId, String interfaceName, String operationId, boolean inTransaction) {
873 Either<Operation, TitanOperationStatus> status = removeOperationOnGraph(resourceId, interfaceName, operationId);
874 if (status.isRight()) {
875 if (false == inTransaction) {
876 titanGenericDao.rollback();
878 log.error("Failed to delete operation {} of interface {} resource {}", operationId, interfaceName, resourceId);
879 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status.right().value()));
881 if (false == inTransaction) {
882 titanGenericDao.commit();
885 Operation opDefResult = status.left().value();// convertOperationDataToOperation(operationData);
886 log.debug("The returned Operation is {}", opDefResult);
887 return Either.left(opDefResult);
893 public Either<InterfaceDefinition, StorageOperationStatus> deleteInterfaceOfResourceOnGraph(String resourceId, InterfaceDefinition interfaceDef, boolean inTransaction) {
895 Map<String, Operation> operations = interfaceDef.getOperationsMap();
896 String interfaceNameSplitted = getShortInterfaceName(interfaceDef);
897 if (operations != null) {
898 for (Entry<String, Operation> entry : operations.entrySet()) {
900 Operation op = entry.getValue();
901 Either<Operation, StorageOperationStatus> removeOperationFromResource = deleteInterfaceOperation(resourceId, interfaceNameSplitted, op.getUniqueId(), true);
902 if (removeOperationFromResource.isRight()) {
903 if (false == inTransaction) {
904 titanGenericDao.rollback();
906 log.error("Failed to delete operation {} of interface {} resource {}", op.getUniqueId(), interfaceDef.getType(), resourceId);
907 return Either.right(removeOperationFromResource.right().value());
911 return Either.left(interfaceDef);
915 private Either<Operation, TitanOperationStatus> removeOperationOnGraph(String resourceId, String interfaceName, String operationId) {
916 log.debug("Before deleting operation from graph {}", operationId);
918 Either<List<ImmutablePair<InterfaceData, GraphEdge>>, TitanOperationStatus> childrenNodes = titanGenericDao.getChildrenNodes(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), resourceId, GraphEdgeLabels.INTERFACE, NodeTypeEnum.Interface,
919 InterfaceData.class);
921 if (childrenNodes.isRight()) {
922 log.debug("Not found interface {}", interfaceName);
923 return Either.right(childrenNodes.right().value());
925 OperationData opData = null;
926 for (ImmutablePair<InterfaceData, GraphEdge> interfaceDataNode : childrenNodes.left().value()) {
928 GraphEdge interfaceEdge = interfaceDataNode.getRight();
929 Map<String, Object> interfaceEdgeProp = interfaceEdge.getProperties();
931 String interfaceSplitedName = splitType(interfaceName);
933 if (interfaceEdgeProp.get(GraphPropertiesDictionary.NAME.getProperty()).equals(interfaceSplitedName)) {
934 Either<List<ImmutablePair<OperationData, GraphEdge>>, TitanOperationStatus> operationRes = titanGenericDao.getChildrenNodes(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), (String) interfaceDataNode.getLeft().getUniqueId(),
935 GraphEdgeLabels.INTERFACE_OPERATION, NodeTypeEnum.InterfaceOperation, OperationData.class);
936 if (operationRes.isRight()) {
937 log.error("Failed to find operation {} on interface {}", operationId, interfaceName);
938 return Either.right(operationRes.right().value());
940 List<ImmutablePair<OperationData, GraphEdge>> operations = operationRes.left().value();
942 for (ImmutablePair<OperationData, GraphEdge> operationPairEdge : operations) {
944 opData = operationPairEdge.getLeft();
945 if (opData.getUniqueId().equals(operationId)) {
947 Either<ImmutablePair<ArtifactData, GraphEdge>, TitanOperationStatus> artifactRes = titanGenericDao.getChild(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), (String) operationPairEdge.getLeft().getUniqueId(),
948 GraphEdgeLabels.ARTIFACT_REF, NodeTypeEnum.ArtifactRef, ArtifactData.class);
949 Either<ArtifactDefinition, StorageOperationStatus> arStatus = null;
950 if (artifactRes.isLeft()) {
951 ArtifactData arData = artifactRes.left().value().getKey();
952 arStatus = artifactOperation.removeArifactFromResource((String) operationPairEdge.getLeft().getUniqueId(), (String) arData.getUniqueId(), NodeTypeEnum.InterfaceOperation, true, true);
953 if (arStatus.isRight()) {
954 log.debug("failed to delete artifact {}", arData.getUniqueId());
955 return Either.right(TitanOperationStatus.INVALID_ID);
958 Either<OperationData, TitanOperationStatus> deleteOpStatus = titanGenericDao.deleteNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.InterfaceOperation), opData.getUniqueId(), OperationData.class);
959 if (deleteOpStatus.isRight()) {
960 log.debug("failed to delete operation {}", opData.getUniqueId());
961 return Either.right(TitanOperationStatus.INVALID_ID);
963 opData = deleteOpStatus.left().value();
964 Operation operation = new Operation(opData.getOperationDataDefinition());
965 if (arStatus != null) {
966 operation.setImplementation(arStatus.left().value());
968 if (operations.size() <= 1) {
969 Either<InterfaceData, TitanOperationStatus> deleteInterfaceStatus = titanGenericDao.deleteNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Interface), interfaceDataNode.left.getUniqueId(), InterfaceData.class);
970 if (deleteInterfaceStatus.isRight()) {
971 log.debug("failed to delete interface {}", interfaceDataNode.left.getUniqueId());
972 return Either.right(TitanOperationStatus.INVALID_ID);
977 return Either.left(operation);
984 log.debug("Not found operation {}", interfaceName);
985 return Either.right(TitanOperationStatus.INVALID_ID);
988 private String splitType(String interfaceName) {
989 String interfaceSplittedName;
990 String[] packageName = interfaceName.split("\\.");
992 if (packageName.length == 0) {
993 interfaceSplittedName = interfaceName;
995 interfaceSplittedName = packageName[packageName.length - 1];
998 return interfaceSplittedName.toLowerCase();
1004 * @param titanGenericDao
1006 public void setTitanGenericDao(TitanGenericDao titanGenericDao) {
1007 this.titanGenericDao = titanGenericDao;
1010 public void setArtifactOperation(ArtifactOperation artifactOperation) {
1011 this.artifactOperation = artifactOperation;
1015 public Either<InterfaceDefinition, StorageOperationStatus> createInterfaceType(InterfaceDefinition interf, boolean inTransaction) {
1016 Either<InterfaceDefinition, StorageOperationStatus> result = null;
1019 InterfaceData interfaceData = new InterfaceData(interf);
1020 interf.setUniqueId(interf.getType().toLowerCase());
1022 Either<InterfaceData, TitanOperationStatus> existInterface = titanGenericDao.getNode(interfaceData.getUniqueIdKey(), interfaceData.getUniqueId(), InterfaceData.class);
1024 if (existInterface.isLeft()) {
1026 log.debug("Interface type already exist {}", interfaceData);
1027 result = Either.right(StorageOperationStatus.ENTITY_ALREADY_EXISTS);
1031 log.debug("Before adding interface type to graph {}", interfaceData);
1032 Either<InterfaceData, TitanOperationStatus> createNodeResult = titanGenericDao.createNode(interfaceData, InterfaceData.class);
1033 log.debug("After adding property type to graph {}", interfaceData);
1035 if (createNodeResult.isRight()) {
1036 TitanOperationStatus operationStatus = createNodeResult.right().value();
1037 log.error("Failed to add interface {} to graph. status is {}", interf.getType(), operationStatus);
1038 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(operationStatus));
1042 InterfaceDefinition interfaceDefResult = convertInterfaceDataToInterfaceDefinition(interfaceData);
1043 Map<String, Operation> operations = interf.getOperationsMap();
1045 if (operations != null && !operations.isEmpty()) {
1046 Map<String, Operation> newOperations = new HashMap<String, Operation>();
1048 for (Map.Entry<String, Operation> operation : operations.entrySet()) {
1049 Either<OperationData, TitanOperationStatus> opStatus = addOperationToGraph(interf, operation.getKey(), operation.getValue(), interfaceData);
1050 if (opStatus.isRight()) {
1051 titanGenericDao.rollback();
1052 log.error("Failed to add operation {} to interface {}", operation.getKey(), interf.getType());
1054 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(opStatus.right().value()));
1057 OperationData opData = opStatus.left().value();
1058 Operation newOperation = this.convertOperationDataToOperation(opData);
1059 newOperations.put(operation.getKey(), newOperation);
1062 interfaceDefResult.setOperationsMap(newOperations);
1064 result = Either.left(interfaceDefResult);
1067 if (false == inTransaction) {
1068 if (result == null || result.isRight()) {
1069 log.error("Going to execute rollback on graph.");
1070 titanGenericDao.rollback();
1072 log.debug("Going to execute commit on graph.");
1073 titanGenericDao.commit();
1081 public Either<InterfaceDefinition, StorageOperationStatus> getInterface(String interfaceId) {
1082 Either<InterfaceData, TitanOperationStatus> getResult = titanGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Interface), interfaceId, InterfaceData.class);
1083 if (getResult.isLeft()) {
1084 InterfaceData interfaceData = getResult.left().value();
1085 return Either.left(convertInterfaceDataToInterfaceDefinition(interfaceData));
1087 TitanOperationStatus titanStatus = getResult.right().value();
1088 log.debug("Node with id {} was not found in the graph. status: {}", interfaceId, titanStatus);
1089 StorageOperationStatus storageOperationStatus = DaoStatusConverter.convertTitanStatusToStorageStatus(titanStatus);
1090 return Either.right(storageOperationStatus);
1095 public StorageOperationStatus associateInterfaceToNode(GraphNode node, InterfaceDefinition interfaceDefinition, TitanVertex metadataVertex) {
1097 Either<TitanVertex, TitanOperationStatus> interfaceData = titanGenericDao.getVertexByProperty(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Interface), interfaceDefinition.getUniqueId());
1098 if (interfaceData.isRight()) {
1099 return DaoStatusConverter.convertTitanStatusToStorageStatus(interfaceData.right().value());
1102 Map<String, Object> properties = new HashMap<String, Object>();
1104 String interfaceName = getShortInterfaceName(interfaceDefinition);
1106 properties.put(GraphPropertiesDictionary.NAME.getProperty(), interfaceName.toLowerCase());
1107 TitanOperationStatus createRelation = titanGenericDao.createEdge(metadataVertex, interfaceData.left().value(), GraphEdgeLabels.INTERFACE, properties);
1108 if (!createRelation.equals(TitanOperationStatus.OK)) {
1109 return DaoStatusConverter.convertTitanStatusToStorageStatus(createRelation);
1112 return StorageOperationStatus.OK;
1115 public String getShortInterfaceName(InterfaceDataDefinition interfaceDefinition) {
1116 String[] packageName = interfaceDefinition.getType().split("\\.");
1117 String interfaceName;
1118 if (packageName.length == 0) {
1119 interfaceName = interfaceDefinition.getType();
1121 interfaceName = packageName[packageName.length - 1];
1123 return interfaceName.toLowerCase();
1129 public Either<InterfaceDefinition, StorageOperationStatus> createInterfaceType(InterfaceDefinition interf) {
1130 return createInterfaceType(interf, false);
1134 public Either<Operation, StorageOperationStatus> getSpecificOperation(String resourceId, String interfaceType, String operationName) {
1135 log.trace("Getting operation, resourceId {}, interfaceType {}, operationName {}", resourceId, interfaceType, operationName);
1136 Either<Map<String, InterfaceDefinition>, StorageOperationStatus> allInterfacesOfResource = getAllInterfacesOfResource(resourceId, false);
1137 if (allInterfacesOfResource.isRight() || allInterfacesOfResource.left().value() == null || allInterfacesOfResource.left().value().get(interfaceType) == null) {
1138 log.debug("Couldn't find interface definition of type {} for resource id {}", interfaceType, resourceId);
1139 return Either.right(allInterfacesOfResource.right().value());
1141 InterfaceDefinition interfaceDefinition = allInterfacesOfResource.left().value().get(interfaceType);
1142 Map<String, Operation> operations = interfaceDefinition.getOperationsMap();
1143 if (operations == null || operations.get(operationName) == null) {
1144 log.debug("Couldn't find operation for operation name {}, interface type {}", operationName, interfaceType);
1145 return Either.right(StorageOperationStatus.GENERAL_ERROR);
1147 return Either.left(operations.get(operationName));
1151 public Either<InterfaceDefinition, StorageOperationStatus> dissociateInterfaceFromNode(GraphNode node, InterfaceDefinition interfaceDefinition) {
1153 Either<InterfaceData, TitanOperationStatus> interfaceData = titanGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Interface), interfaceDefinition.getUniqueId(), InterfaceData.class);
1154 if (interfaceData.isRight()) {
1155 log.debug("Couldn't find interface {}", interfaceDefinition);
1156 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(interfaceData.right().value()));
1159 InterfaceData value = interfaceData.left().value();
1160 Either<GraphRelation, TitanOperationStatus> deleteRelation = titanGenericDao.deleteRelation(node, value, GraphEdgeLabels.INTERFACE);
1161 if (deleteRelation.isRight()) {
1162 TitanOperationStatus status = deleteRelation.right().value();
1163 log.debug("Couldn't dissociate interface between node {} to node {}. Status is {}", node.getUniqueId(), value.getUniqueId(), status);
1164 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
1167 return Either.left(interfaceDefinition);