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.List;
27 import javax.annotation.Resource;
29 import org.openecomp.sdc.be.config.BeEcompErrorManager;
30 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
31 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
32 import org.openecomp.sdc.be.datatypes.elements.PolicyTypeDataDefinition;
33 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
34 import org.openecomp.sdc.be.model.PolicyTypeDefinition;
35 import org.openecomp.sdc.be.model.PropertyDefinition;
36 import org.openecomp.sdc.be.model.operations.api.IPolicyTypeOperation;
37 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
38 import org.openecomp.sdc.be.resources.data.PolicyTypeData;
39 import org.openecomp.sdc.be.resources.data.PropertyData;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42 import org.springframework.stereotype.Component;
44 import fj.data.Either;
46 @Component("policy-type-operation")
47 public class PolicyTypeOperation extends AbstractOperation implements IPolicyTypeOperation {
49 private static final String CREATE_FLOW_CONTEXT = "CreatePolicyType";
50 private static final String GET_FLOW_CONTEXT = "GetPolicyType";
53 private PropertyOperation propertyOperation;
55 public PolicyTypeOperation() {
59 private static Logger log = LoggerFactory.getLogger(PolicyTypeOperation.class.getName());
62 public Either<PolicyTypeDefinition, StorageOperationStatus> getLatestPolicyTypeByType(String policyTypeName) {
63 return getLatestPolicyTypeByType(policyTypeName, false);
66 private Either<PolicyTypeDefinition, StorageOperationStatus> getLatestPolicyTypeByType(String type, boolean inTransaction) {
67 Map<String, Object> mapCriteria = new HashMap<>();
68 mapCriteria.put(GraphPropertiesDictionary.TYPE.getProperty(), type);
69 mapCriteria.put(GraphPropertiesDictionary.IS_HIGHEST_VERSION.getProperty(), true);
71 return getPolicyTypeByCriteria(type, mapCriteria, inTransaction);
75 public Either<PolicyTypeDefinition, StorageOperationStatus> addPolicyType(PolicyTypeDefinition policyType) {
76 return addPolicyType(policyType, false);
80 public Either<PolicyTypeDefinition, StorageOperationStatus> addPolicyType(PolicyTypeDefinition policyTypeDef, boolean inTransaction) {
82 Either<PolicyTypeDefinition, StorageOperationStatus> result = null;
86 Either<PolicyTypeData, TitanOperationStatus> eitherStatus = addPolicyTypeToGraph(policyTypeDef);
88 if (eitherStatus.isRight()) {
89 BeEcompErrorManager.getInstance().logBeFailedCreateNodeError(CREATE_FLOW_CONTEXT, policyTypeDef.getType(), eitherStatus.right().value().name());
90 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(eitherStatus.right().value()));
93 PolicyTypeData policyTypeData = eitherStatus.left().value();
95 String uniqueId = policyTypeData.getUniqueId();
96 Either<PolicyTypeDefinition, StorageOperationStatus> policyTypeRes = this.getPolicyType(uniqueId, true);
98 if (policyTypeRes.isRight()) {
99 BeEcompErrorManager.getInstance().logBeFailedRetrieveNodeError(GET_FLOW_CONTEXT, policyTypeDef.getType(), eitherStatus.right().value().name());
102 result = policyTypeRes;
109 handleTransactionCommitRollback(inTransaction, result);
114 private Either<PolicyTypeData, TitanOperationStatus> addPolicyTypeToGraph(PolicyTypeDefinition policyTypeDef) {
115 log.debug("Got policy type {}", policyTypeDef);
117 String ptUniqueId = UniqueIdBuilder.buildPolicyTypeUid(policyTypeDef.getType(), policyTypeDef.getVersion());
119 PolicyTypeData policyTypeData = buildPolicyTypeData(policyTypeDef, ptUniqueId);
121 log.debug("Before adding policy type to graph. policyTypeData = {}", policyTypeData);
123 Either<PolicyTypeData, TitanOperationStatus> eitherPolicyTypeData = titanGenericDao.createNode(policyTypeData, PolicyTypeData.class);
124 log.debug("After adding policy type to graph. status is = {}", eitherPolicyTypeData);
126 if (eitherPolicyTypeData.isRight()) {
127 TitanOperationStatus operationStatus = eitherPolicyTypeData.right().value();
128 log.error("Failed to add policy type {} to graph. status is {}", policyTypeDef.getType(), operationStatus);
129 return Either.right(operationStatus);
132 PolicyTypeData resultCTD = eitherPolicyTypeData.left().value();
133 List<PropertyDefinition> properties = policyTypeDef.getProperties();
134 Either<Map<String, PropertyData>, TitanOperationStatus> addPropertiesToPolicyType = propertyOperation.addPropertiesToElementType(resultCTD.getUniqueId(), NodeTypeEnum.PolicyType, properties);
135 if (addPropertiesToPolicyType.isRight()) {
136 log.error("Failed add properties {} to policy {}", properties, policyTypeDef.getType());
137 return Either.right(addPropertiesToPolicyType.right().value());
140 return Either.left(eitherPolicyTypeData.left().value());
143 public Either<PolicyTypeDefinition, StorageOperationStatus> getPolicyTypeByCriteria(String type, Map<String, Object> properties, boolean inTransaction) {
144 Either<PolicyTypeDefinition, StorageOperationStatus> result = null;
146 if (type == null || type.isEmpty()) {
147 log.error("type is empty");
148 result = Either.right(StorageOperationStatus.INVALID_ID);
152 Either<List<PolicyTypeData>, TitanOperationStatus> eitherPolicyData = titanGenericDao.getByCriteria(NodeTypeEnum.PolicyType, properties, PolicyTypeData.class);
153 if (eitherPolicyData.isRight()) {
154 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(eitherPolicyData.right().value()));
156 PolicyTypeDataDefinition dataDefinition = eitherPolicyData.left().value().stream().map(e -> e.getPolicyTypeDataDefinition()).findFirst().get();
157 result = getPolicyType(dataDefinition.getUniqueId(), inTransaction);
163 handleTransactionCommitRollback(inTransaction, result);
168 public Either<PolicyTypeDefinition, StorageOperationStatus> getPolicyType(String uniqueId, boolean inTransaction) {
169 return getElementType(this::getPolicyTypeByUid, uniqueId, inTransaction);
172 private Either<PolicyTypeDefinition, TitanOperationStatus> getPolicyTypeByUid(String uniqueId) {
173 Either<PolicyTypeDefinition, TitanOperationStatus> result = null;
175 Either<PolicyTypeData, TitanOperationStatus> eitherPolicyTypeData = titanGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.PolicyType), uniqueId, PolicyTypeData.class);
177 if (eitherPolicyTypeData.isRight()) {
178 TitanOperationStatus status = eitherPolicyTypeData.right().value();
179 log.debug("Policy type {} cannot be found in graph. status is {}", uniqueId, status);
180 return Either.right(status);
183 PolicyTypeData policyTypeData = eitherPolicyTypeData.left().value();
184 PolicyTypeDefinition policyTypeDefinition = new PolicyTypeDefinition(policyTypeData.getPolicyTypeDataDefinition());
186 TitanOperationStatus propertiesStatus = propertyOperation.fillProperties(uniqueId, propList -> policyTypeDefinition.setProperties(propList));
187 if (propertiesStatus != TitanOperationStatus.OK) {
188 log.error("Failed to fetch properties of policy type {}", uniqueId);
189 return Either.right(propertiesStatus);
192 result = Either.left(policyTypeDefinition);
197 private PolicyTypeData buildPolicyTypeData(PolicyTypeDefinition policyTypeDefinition, String ptUniqueId) {
199 PolicyTypeData policyTypeData = new PolicyTypeData(policyTypeDefinition);
201 policyTypeData.getPolicyTypeDataDefinition().setUniqueId(ptUniqueId);
202 Long creationDate = policyTypeData.getPolicyTypeDataDefinition().getCreationTime();
203 if (creationDate == null) {
204 creationDate = System.currentTimeMillis();
207 policyTypeData.getPolicyTypeDataDefinition().setCreationTime(creationDate);
208 policyTypeData.getPolicyTypeDataDefinition().setModificationTime(creationDate);
209 return policyTypeData;