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.RequirementNodeFilterPropertyDataDefinition;
36 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
37 import org.openecomp.sdc.be.model.Component;
38 import org.openecomp.sdc.be.model.ComponentInstance;
39 import org.openecomp.sdc.be.model.User;
40 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
41 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
42 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
43 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
44 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
45 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
46 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
47 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
48 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
49 import org.openecomp.sdc.be.user.Role;
50 import org.openecomp.sdc.common.log.wrappers.Logger;
51 import org.openecomp.sdc.exception.ResponseFormat;
52 import org.springframework.beans.factory.annotation.Autowired;
54 @org.springframework.stereotype.Component("componentNodeFilterBusinessLogic")
55 public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
57 private static final Logger LOGGER = Logger.getLogger(ComponentNodeFilterBusinessLogic.class.getName());
59 private final NodeFilterOperation nodeFilterOperation;
60 private final NodeFilterValidator nodeFilterValidator;
63 public ComponentNodeFilterBusinessLogic(final IElementOperation elementDao,
64 final IGroupOperation groupOperation,
65 final IGroupInstanceOperation groupInstanceOperation,
66 final IGroupTypeOperation groupTypeOperation,
67 final InterfaceOperation interfaceOperation,
68 final InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
69 final ArtifactsOperations artifactToscaOperation,
70 final NodeFilterOperation nodeFilterOperation,
71 final NodeFilterValidator nodeFilterValidator) {
72 super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation,
73 interfaceLifecycleTypeOperation, artifactToscaOperation);
74 this.nodeFilterOperation = nodeFilterOperation;
75 this.nodeFilterValidator = nodeFilterValidator;
78 public Optional<CINodeFilterDataDefinition> createNodeFilterIfNotExist(final String componentId,
79 final String componentInstanceId,
80 final boolean shouldLock,
81 final ComponentTypeEnum componentTypeEnum)
82 throws BusinessLogicException {
84 final Component component = getComponent(componentId);
85 final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
86 Optional<CINodeFilterDataDefinition> filterDataDefinition = getCiNodeFilterDataDefinition(componentInstance);
87 if (filterDataDefinition.isPresent()) {
88 return filterDataDefinition;
90 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result;
91 boolean wasLocked = false;
94 lockComponent(component.getUniqueId(), component,"Create Node Filter on component");
97 result = nodeFilterOperation.createNodeFilter(componentId, componentInstanceId);
98 if (result.isRight()) {
99 janusGraphDao.rollback();
100 LOGGER.error(BUSINESS_PROCESS_ERROR,
101 "Failed to Create Node filter on component with id {}", componentId);
102 throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
103 .convertFromStorageResponse(result.right().value()), component.getSystemName()));
105 filterDataDefinition = Optional.ofNullable(result.left().value());
107 janusGraphDao.commit();
108 LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
110 } catch (final Exception e) {
111 janusGraphDao.rollback();
112 LOGGER.error(BUSINESS_PROCESS_ERROR,
113 "Exception occurred during add Component node filter property values: {}", e.getMessage(), e);
114 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
118 unlockComponent(component.getUniqueId(), componentTypeEnum);
121 return filterDataDefinition;
124 public Optional<String> deleteNodeFilterIfExists(final String componentId,
125 final String componentInstanceId,
126 final boolean shouldLock,
127 final ComponentTypeEnum componentTypeEnum)
128 throws BusinessLogicException {
130 final Component component = getComponent(componentId);
131 final Optional<CINodeFilterDataDefinition> nodeFilterDataDefinition =
132 getCiNodeFilterDataDefinition(componentInstanceId, component);
133 if (!nodeFilterDataDefinition.isPresent()) {
134 return Optional.ofNullable(componentInstanceId);
137 final Either<String, StorageOperationStatus> result;
138 boolean wasLocked = false;
141 lockComponent(component.getUniqueId(), component,"Delete Node Filter from component");
144 result = nodeFilterOperation.deleteNodeFilter(component, componentInstanceId);
145 if (result.isRight()) {
146 LOGGER.error(BUSINESS_PROCESS_ERROR,
147 "Failed to delete node filter in component {}. Response is {}. ", component.getName(),
148 result.right().value());
149 janusGraphDao.rollback();
150 throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
151 .convertFromStorageResponse(result.right().value()), component.getSystemName()));
153 janusGraphDao.commit();
154 LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
156 } catch (final Exception e) {
157 LOGGER.error(BUSINESS_PROCESS_ERROR,"Exception occurred during delete deleting node filter: {}",
159 janusGraphDao.rollback();
160 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
163 unlockComponent(component.getUniqueId(), componentTypeEnum);
166 return Optional.ofNullable(result.left().value());
171 public Optional<CINodeFilterDataDefinition> addNodeFilter(final String componentId,
172 final String componentInstanceId,
173 final NodeFilterConstraintAction action,
174 final String propertyName,
175 final String constraint,
176 final boolean shouldLock,
177 final ComponentTypeEnum componentTypeEnum)
178 throws BusinessLogicException {
180 final Component component = getComponent(componentId);
181 CINodeFilterDataDefinition nodeFilterDataDefinition = validateAndReturnNodeFilterDefinition(componentInstanceId,
182 action, constraint, component);
183 boolean wasLocked = false;
186 lockComponent(component.getUniqueId(), component,"Add Node Filter on Component");
189 final RequirementNodeFilterPropertyDataDefinition newProperty =
190 new RequirementNodeFilterPropertyDataDefinition();
191 newProperty.setName(propertyName);
192 newProperty.setConstraints(Collections.singletonList(constraint));
193 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
194 .addNewProperty(componentId, componentInstanceId, nodeFilterDataDefinition, newProperty);
196 if (result.isRight()) {
197 janusGraphDao.rollback();
198 throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
199 .convertFromStorageResponse(result.right().value()), component.getSystemName()));
201 nodeFilterDataDefinition = result.left().value();
203 janusGraphDao.commit();
204 LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
206 } catch (final Exception e) {
207 janusGraphDao.rollback();
208 LOGGER.error(BUSINESS_PROCESS_ERROR,
209 "Exception occurred during add component node filter property values: {}", e.getMessage(), e);
210 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
214 unlockComponent(component.getUniqueId(), componentTypeEnum);
217 return Optional.ofNullable(nodeFilterDataDefinition);
220 public Optional<CINodeFilterDataDefinition> deleteNodeFilter(final String componentId,
221 final String componentInstanceId,
222 final NodeFilterConstraintAction action,
223 final String constraint,
225 final boolean shouldLock,
226 final ComponentTypeEnum componentTypeEnum)
227 throws BusinessLogicException {
229 final Component component = getComponent(componentId);
230 CINodeFilterDataDefinition nodeFilterDataDefinition =
231 validateAndReturnNodeFilterDefinition(componentInstanceId, action, constraint, component);
232 boolean wasLocked = false;
235 lockComponent(component.getUniqueId(), component,"Add Node Filter on Component");
238 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
239 .deleteConstraint(componentId, componentInstanceId, nodeFilterDataDefinition, position);
240 if (result.isRight()) {
241 janusGraphDao.rollback();
242 throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
243 .convertFromStorageResponse(result.right().value()), component.getSystemName()));
245 nodeFilterDataDefinition = result.left().value();
247 janusGraphDao.commit();
248 LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
250 } catch (final Exception e) {
251 janusGraphDao.rollback();
252 LOGGER.error(BUSINESS_PROCESS_ERROR,
253 "Exception occurred during delete component node filter property values: {}", e.getMessage(), e);
254 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
258 unlockComponent(component.getUniqueId(), componentTypeEnum);
261 return Optional.ofNullable(nodeFilterDataDefinition);
264 public Optional<CINodeFilterDataDefinition> updateNodeFilter(final String componentId,
265 final String componentInstanceId,
266 final List<String> constraints,
267 final boolean shouldLock,
268 final ComponentTypeEnum componentTypeEnum)
269 throws BusinessLogicException {
271 final Component component = getComponent(componentId);
273 final Either<Boolean, ResponseFormat> response = nodeFilterValidator
274 .validateFilter(component, componentInstanceId, constraints, NodeFilterConstraintAction.UPDATE);
275 if (response.isRight()) {
276 throw new BusinessLogicException(componentsUtils
277 .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
279 final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId,
281 if (!componentInstance.isPresent()) {
282 throw new BusinessLogicException(ResponseFormatManager.getInstance()
283 .getResponseFormat(ActionStatus.GENERAL_ERROR));
285 CINodeFilterDataDefinition nodeFilterDataDefinition = componentInstance.get().getNodeFilter();
286 if (nodeFilterDataDefinition == null) {
287 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
289 boolean wasLocked = false;
292 lockComponent(component.getUniqueId(), component,"Update Node Filter on Component");
295 final List<RequirementNodeFilterPropertyDataDefinition> properties = constraints.stream()
296 .map(this::getRequirementNodeFilterPropertyDataDefinition).collect(Collectors.toList());
297 final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
298 .updateProperties(componentId, componentInstanceId, nodeFilterDataDefinition, properties);
300 if (result.isRight()) {
301 janusGraphDao.rollback();
302 throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
303 .convertFromStorageResponse(result.right().value()), component.getSystemName()));
305 nodeFilterDataDefinition = result.left().value();
307 janusGraphDao.commit();
308 LOGGER.debug("Node filter successfully updated in component {} . ", component.getSystemName());
310 } catch (final Exception e) {
311 janusGraphDao.rollback();
312 LOGGER.error(BUSINESS_PROCESS_ERROR,
313 "Exception occurred during update component node filter property values: {}",
315 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
319 unlockComponent(component.getUniqueId(), componentTypeEnum);
322 return Optional.ofNullable(nodeFilterDataDefinition);
325 private void unlockComponent(final String componentUniqueId,
326 final ComponentTypeEnum componentType) {
327 graphLockOperation.unlockComponent(componentUniqueId, componentType.getNodeType());
330 public User validateUser(final String userId) {
331 final User user = userValidations.validateUserExists(userId);
332 userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
336 private Optional<ComponentInstance> getComponentInstance(final String componentInstanceId,
337 final Component component) {
338 return component.getComponentInstanceById(componentInstanceId);
341 private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(
342 final Optional<ComponentInstance> componentInstance) {
344 if (componentInstance.isPresent()) {
345 return Optional.ofNullable(componentInstance.get().getNodeFilter());
347 return Optional.empty();
350 private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(final String componentInstanceId,
351 final Component component)
352 throws BusinessLogicException {
354 final Either<Boolean, ResponseFormat> response = nodeFilterValidator
355 .validateComponentInstanceExist(component, componentInstanceId);
356 if (response.isRight()) {
357 throw new BusinessLogicException(componentsUtils
358 .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
360 final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
361 if (componentInstance.isPresent()) {
362 return Optional.ofNullable(componentInstance.get().getNodeFilter());
364 return Optional.empty();
367 private RequirementNodeFilterPropertyDataDefinition getRequirementNodeFilterPropertyDataDefinition(
368 final String constraint) {
370 final RequirementNodeFilterPropertyDataDefinition pdd = new RequirementNodeFilterPropertyDataDefinition();
371 pdd.setConstraints(Arrays.asList(constraint));
375 private CINodeFilterDataDefinition validateAndReturnNodeFilterDefinition(final String componentInstanceId,
376 final NodeFilterConstraintAction action,
377 final String constraint,
378 final Component component)
379 throws BusinessLogicException {
381 validateNodeFilter(component, componentInstanceId, action, constraint);
382 final Optional<CINodeFilterDataDefinition> cINodeFilterDataDefinition = getCiNodeFilterDataDefinition(
383 componentInstanceId, component);
384 if (!cINodeFilterDataDefinition.isPresent()) {
385 throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
387 return cINodeFilterDataDefinition.get();
390 private void validateNodeFilter(final Component component,
391 final String componentInstanceId,
392 final NodeFilterConstraintAction action,
393 final String constraint) throws BusinessLogicException {
394 final Either<Boolean, ResponseFormat> response = nodeFilterValidator
395 .validateFilter(component, componentInstanceId, Collections.singletonList(constraint), action);
396 if (response.isRight()) {
397 throw new BusinessLogicException(componentsUtils
398 .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));