2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2020 Nordix Foundation
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 * SPDX-License-Identifier: Apache-2.0
17 * ============LICENSE_END=========================================================
20 package org.openecomp.sdc.be.components.impl;
22 import static org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR;
24 import fj.data.Either;
25 import java.util.Arrays;
26 import java.util.Collections;
27 import java.util.List;
28 import java.util.Optional;
29 import java.util.stream.Collectors;
30 import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
31 import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
32 import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
33 import org.openecomp.sdc.be.dao.api.ActionStatus;
34 import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
35 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
36 import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterCapabilityDataDefinition;
37 import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
38 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
39 import org.openecomp.sdc.be.datatypes.enums.NodeFilterConstraintType;
40 import org.openecomp.sdc.be.model.Component;
41 import org.openecomp.sdc.be.model.ComponentInstance;
42 import org.openecomp.sdc.be.model.User;
43 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
44 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
45 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
46 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
47 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
48 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
49 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
50 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
51 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
52 import org.openecomp.sdc.be.user.Role;
53 import org.openecomp.sdc.common.log.wrappers.Logger;
54 import org.openecomp.sdc.exception.ResponseFormat;
55 import org.springframework.beans.factory.annotation.Autowired;
57 @org.springframework.stereotype.Component("componentNodeFilterBusinessLogic")
58 public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
60 private static final Logger LOGGER = Logger.getLogger(ComponentNodeFilterBusinessLogic.class.getName());
62 private final NodeFilterOperation nodeFilterOperation;
63 private final NodeFilterValidator nodeFilterValidator;
66 public ComponentNodeFilterBusinessLogic(final IElementOperation elementDao,
67 final IGroupOperation groupOperation,
68 final IGroupInstanceOperation groupInstanceOperation,
69 final IGroupTypeOperation groupTypeOperation,
70 final InterfaceOperation interfaceOperation,
71 final InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
72 final ArtifactsOperations artifactToscaOperation,
73 final NodeFilterOperation nodeFilterOperation,
74 final NodeFilterValidator nodeFilterValidator) {
75 super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation,
76 interfaceLifecycleTypeOperation, artifactToscaOperation);
77 this.nodeFilterOperation = nodeFilterOperation;
78 this.nodeFilterValidator = nodeFilterValidator;
81 public Optional<CINodeFilterDataDefinition> createNodeFilterIfNotExist(final String componentId,
82 final String componentInstanceId,
83 final boolean shouldLock,
84 final ComponentTypeEnum componentTypeEnum)
85 throws BusinessLogicException {
87 final Component component = getComponent(componentId);
88 final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
89 Optional<CINodeFilterDataDefinition> filterDataDefinition = getCiNodeFilterDataDefinition(componentInstance);
90 if (filterDataDefinition.isPresent()) {
91 return filterDataDefinition;
93 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result;
94 boolean wasLocked = false;
97 lockComponent(component.getUniqueId(), component,"Create Node Filter on component");
100 result = nodeFilterOperation.createNodeFilter(componentId, componentInstanceId);
101 if (result.isRight()) {
102 janusGraphDao.rollback();
103 LOGGER.error(BUSINESS_PROCESS_ERROR,
104 "Failed to Create Node filter on component with id {}", componentId);
105 throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
106 .convertFromStorageResponse(result.right().value()), component.getSystemName()));
108 filterDataDefinition = Optional.ofNullable(result.left().value());
110 janusGraphDao.commit();
111 LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
113 } catch (final Exception e) {
114 janusGraphDao.rollback();
115 LOGGER.error(BUSINESS_PROCESS_ERROR,
116 "Exception occurred during add Component node filter property values: {}", e.getMessage(), e);
117 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
121 unlockComponent(component.getUniqueId(), componentTypeEnum);
124 return filterDataDefinition;
127 public Optional<String> deleteNodeFilterIfExists(final String componentId,
128 final String componentInstanceId,
129 final boolean shouldLock,
130 final ComponentTypeEnum componentTypeEnum)
131 throws BusinessLogicException {
133 final Component component = getComponent(componentId);
134 final Optional<CINodeFilterDataDefinition> nodeFilterDataDefinition =
135 getCiNodeFilterDataDefinition(componentInstanceId, component);
136 if (!nodeFilterDataDefinition.isPresent()) {
137 return Optional.ofNullable(componentInstanceId);
140 final Either<String, StorageOperationStatus> result;
141 boolean wasLocked = false;
144 lockComponent(component.getUniqueId(), component,"Delete Node Filter from component");
147 result = nodeFilterOperation.deleteNodeFilter(component, componentInstanceId);
148 if (result.isRight()) {
149 LOGGER.error(BUSINESS_PROCESS_ERROR,
150 "Failed to delete node filter in component {}. Response is {}. ", component.getName(),
151 result.right().value());
152 janusGraphDao.rollback();
153 throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
154 .convertFromStorageResponse(result.right().value()), component.getSystemName()));
156 janusGraphDao.commit();
157 LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
159 } catch (final Exception e) {
160 LOGGER.error(BUSINESS_PROCESS_ERROR,"Exception occurred during delete deleting node filter: {}",
162 janusGraphDao.rollback();
163 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
166 unlockComponent(component.getUniqueId(), componentTypeEnum);
169 return Optional.ofNullable(result.left().value());
172 public Optional<CINodeFilterDataDefinition> addNodeFilter(final String componentId,
173 final String componentInstanceId,
174 final NodeFilterConstraintAction action,
175 final String propertyName,
176 final String constraint,
177 final boolean shouldLock,
178 final ComponentTypeEnum componentTypeEnum,
179 final NodeFilterConstraintType nodeFilterConstraintType)
180 throws BusinessLogicException {
182 final Component component = getComponent(componentId);
183 CINodeFilterDataDefinition nodeFilterDataDefinition = validateAndReturnNodeFilterDefinition(componentInstanceId,
184 action, constraint, component);
185 boolean wasLocked = false;
188 lockComponent(component.getUniqueId(), component,"Add Node Filter on Component");
191 final RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition =
192 new RequirementNodeFilterPropertyDataDefinition();
193 requirementNodeFilterPropertyDataDefinition.setName(propertyName);
194 requirementNodeFilterPropertyDataDefinition.setConstraints(Collections.singletonList(constraint));
195 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = addNewNodeFilter(componentId,
196 componentInstanceId, propertyName, nodeFilterConstraintType, nodeFilterDataDefinition,
197 requirementNodeFilterPropertyDataDefinition);
198 if (result.isRight()) {
199 janusGraphDao.rollback();
200 throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
201 .convertFromStorageResponse(result.right().value()), component.getSystemName()));
203 nodeFilterDataDefinition = result.left().value();
205 janusGraphDao.commit();
206 LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
208 } catch (final Exception e) {
209 janusGraphDao.rollback();
210 LOGGER.error(BUSINESS_PROCESS_ERROR,
211 "Exception occurred during add component node filter property values: {}", e.getMessage(), e);
212 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
216 unlockComponent(component.getUniqueId(), componentTypeEnum);
219 return Optional.ofNullable(nodeFilterDataDefinition);
222 public Optional<CINodeFilterDataDefinition> deleteNodeFilter(final String componentId,
223 final String componentInstanceId,
224 final NodeFilterConstraintAction action,
225 final String constraint,
227 final boolean shouldLock,
228 final ComponentTypeEnum componentTypeEnum,
229 final NodeFilterConstraintType nodeFilterConstraintType)
230 throws BusinessLogicException {
232 final Component component = getComponent(componentId);
233 CINodeFilterDataDefinition nodeFilterDataDefinition =
234 validateAndReturnNodeFilterDefinition(componentInstanceId, action, constraint, component);
235 boolean wasLocked = false;
238 lockComponent(component.getUniqueId(), component,"Add Node Filter on Component");
241 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
242 .deleteConstraint(componentId, componentInstanceId, nodeFilterDataDefinition, position,
243 nodeFilterConstraintType);
244 if (result.isRight()) {
245 janusGraphDao.rollback();
246 throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
247 .convertFromStorageResponse(result.right().value()), component.getSystemName()));
249 nodeFilterDataDefinition = result.left().value();
251 janusGraphDao.commit();
252 LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
254 } catch (final Exception e) {
255 janusGraphDao.rollback();
256 LOGGER.error(BUSINESS_PROCESS_ERROR,
257 "Exception occurred during delete component node filter property values: {}", e.getMessage(), e);
258 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
262 unlockComponent(component.getUniqueId(), componentTypeEnum);
265 return Optional.ofNullable(nodeFilterDataDefinition);
268 public Optional<CINodeFilterDataDefinition> updateNodeFilter(final String componentId,
269 final String componentInstanceId,
270 final List<String> constraints,
271 final boolean shouldLock,
272 final ComponentTypeEnum componentTypeEnum)
273 throws BusinessLogicException {
275 final Component component = getComponent(componentId);
277 final Either<Boolean, ResponseFormat> response = nodeFilterValidator
278 .validateFilter(component, componentInstanceId, constraints, NodeFilterConstraintAction.UPDATE);
279 if (response.isRight()) {
280 throw new BusinessLogicException(componentsUtils
281 .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
283 final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId,
285 if (!componentInstance.isPresent()) {
286 throw new BusinessLogicException(ResponseFormatManager.getInstance()
287 .getResponseFormat(ActionStatus.GENERAL_ERROR));
289 CINodeFilterDataDefinition nodeFilterDataDefinition = componentInstance.get().getNodeFilter();
290 if (nodeFilterDataDefinition == null) {
291 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
293 boolean wasLocked = false;
296 lockComponent(component.getUniqueId(), component,"Update Node Filter on Component");
299 final List<RequirementNodeFilterPropertyDataDefinition> properties = constraints.stream()
300 .map(this::getRequirementNodeFilterPropertyDataDefinition).collect(Collectors.toList());
301 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
302 .updateProperties(componentId, componentInstanceId, nodeFilterDataDefinition, properties);
304 if (result.isRight()) {
305 janusGraphDao.rollback();
306 throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
307 .convertFromStorageResponse(result.right().value()), component.getSystemName()));
309 nodeFilterDataDefinition = result.left().value();
311 janusGraphDao.commit();
312 LOGGER.debug("Node filter successfully updated in component {} . ", component.getSystemName());
314 } catch (final Exception e) {
315 janusGraphDao.rollback();
316 LOGGER.error(BUSINESS_PROCESS_ERROR,
317 "Exception occurred during update component node filter property values: {}",
319 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
323 unlockComponent(component.getUniqueId(), componentTypeEnum);
326 return Optional.ofNullable(nodeFilterDataDefinition);
329 private Either<CINodeFilterDataDefinition, StorageOperationStatus> addNewNodeFilter(
330 final String componentId,
331 final String componentInstanceId,
332 final String propertyName,
333 final NodeFilterConstraintType nodeFilterConstraintType,
334 final CINodeFilterDataDefinition nodeFilterDataDefinition,
335 final RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition) {
337 if (NodeFilterConstraintType.PROPERTIES.equals(nodeFilterConstraintType)) {
338 return nodeFilterOperation.addNewProperty(componentId, componentInstanceId, nodeFilterDataDefinition,
339 requirementNodeFilterPropertyDataDefinition);
341 final RequirementNodeFilterCapabilityDataDefinition requirementNodeFilterCapabilityDataDefinition =
342 new RequirementNodeFilterCapabilityDataDefinition();
343 requirementNodeFilterCapabilityDataDefinition.setName(propertyName);
344 final ListDataDefinition<RequirementNodeFilterPropertyDataDefinition>
345 propertyDataDefinitionListDataDefinition = new ListDataDefinition<>();
346 propertyDataDefinitionListDataDefinition.getListToscaDataDefinition().addAll(
347 Collections.singleton(requirementNodeFilterPropertyDataDefinition));
348 requirementNodeFilterCapabilityDataDefinition.setProperties(propertyDataDefinitionListDataDefinition);
349 return nodeFilterOperation.addNewCapabilities(componentId, componentInstanceId, nodeFilterDataDefinition,
350 requirementNodeFilterCapabilityDataDefinition);
353 private void unlockComponent(final String componentUniqueId,
354 final ComponentTypeEnum componentType) {
355 graphLockOperation.unlockComponent(componentUniqueId, componentType.getNodeType());
358 public User validateUser(final String userId) {
359 final User user = userValidations.validateUserExists(userId);
360 userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
364 private Optional<ComponentInstance> getComponentInstance(final String componentInstanceId,
365 final Component component) {
366 return component.getComponentInstanceById(componentInstanceId);
369 private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(
370 final Optional<ComponentInstance> componentInstance) {
372 if (componentInstance.isPresent()) {
373 return Optional.ofNullable(componentInstance.get().getNodeFilter());
375 return Optional.empty();
378 private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(final String componentInstanceId,
379 final Component component)
380 throws BusinessLogicException {
382 final Either<Boolean, ResponseFormat> response = nodeFilterValidator
383 .validateComponentInstanceExist(component, componentInstanceId);
384 if (response.isRight()) {
385 throw new BusinessLogicException(componentsUtils
386 .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
388 final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
389 if (componentInstance.isPresent()) {
390 return Optional.ofNullable(componentInstance.get().getNodeFilter());
392 return Optional.empty();
395 private RequirementNodeFilterPropertyDataDefinition getRequirementNodeFilterPropertyDataDefinition(
396 final String constraint) {
398 final RequirementNodeFilterPropertyDataDefinition pdd = new RequirementNodeFilterPropertyDataDefinition();
399 pdd.setConstraints(Arrays.asList(constraint));
403 private CINodeFilterDataDefinition validateAndReturnNodeFilterDefinition(final String componentInstanceId,
404 final NodeFilterConstraintAction action,
405 final String constraint,
406 final Component component)
407 throws BusinessLogicException {
409 validateNodeFilter(component, componentInstanceId, action, constraint);
410 final Optional<CINodeFilterDataDefinition> cINodeFilterDataDefinition = getCiNodeFilterDataDefinition(
411 componentInstanceId, component);
412 if (!cINodeFilterDataDefinition.isPresent()) {
413 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
415 return cINodeFilterDataDefinition.get();
418 private void validateNodeFilter(final Component component,
419 final String componentInstanceId,
420 final NodeFilterConstraintAction action,
421 final String constraint) throws BusinessLogicException {
422 final Either<Boolean, ResponseFormat> response = nodeFilterValidator
423 .validateFilter(component, componentInstanceId, Collections.singletonList(constraint), action);
424 if (response.isRight()) {
425 throw new BusinessLogicException(componentsUtils
426 .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));