Add Support for node_filters 57/109157/2
authoraribeiro <anderson.ribeiro@est.tech>
Mon, 25 May 2020 10:33:22 +0000 (11:33 +0100)
committerOfir Sonsino <ofir.sonsino@intl.att.com>
Sun, 21 Jun 2020 07:12:09 +0000 (07:12 +0000)
Allows for node_filter to be specified for a node template
to provide processing instructions to the orchestrator

Issue-ID: SDC-3095
Change-Id: I4e496e300552049d9bfd00df878b86d9fb97312b
Signed-off-by: aribeiro <anderson.ribeiro@est.tech>
17 files changed:
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentNodeFilterBusinessLogic.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/NodeFilterValidator.java
catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java
catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentInstanceServlet.java
catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentNodeFilterServlet.java [new file with mode: 0644]
catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceFilterServlet.java [deleted file]
catalog-be/src/test/java/org/openecomp/sdc/be/components/BaseServiceBusinessLogicTest.java
catalog-be/src/test/java/org/openecomp/sdc/be/components/ServiceDistributionBLTest.java
catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceBussinessLogicBaseTestSetup.java
catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentInstanceServletTest.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeFilterOperation.java
catalog-ui/src/app/ng2/components/logic/service-dependencies/service-dependencies.component.html
catalog-ui/src/app/ng2/components/logic/service-dependencies/service-dependencies.component.ts
catalog-ui/src/app/ng2/services/component-services/topology-template.service.ts

index a7c926e..544f030 100644 (file)
@@ -240,16 +240,6 @@ public abstract class BaseBusinessLogic {
         }
     }
 
-    protected ActionStatus lockComponentAndReturnStatus(final String componentId,
-                                                        final Component component,
-                                                        final String ecompErrorContext) {
-        final ActionStatus lock = lockElement(componentId, component, ecompErrorContext);
-        if (lock!= ActionStatus.OK) {
-            logAndThrowComponentException(lock, component.getUniqueId(), component.getName());
-        }
-        return ActionStatus.OK;
-    }
-
     protected void lockComponent(String componentId, Component component, boolean needLock, String ecompErrorContext) {
         if (needLock) {
             lockComponent(componentId, component, ecompErrorContext);
index 486a6b2..30cfac2 100644 (file)
@@ -44,6 +44,7 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
@@ -73,6 +74,7 @@ import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
 import org.openecomp.sdc.be.impl.ForwardingPathUtils;
 import org.openecomp.sdc.be.impl.ServiceFilterUtils;
 import org.openecomp.sdc.be.info.CreateAndAssotiateInfo;
@@ -116,6 +118,7 @@ import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
 import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
 import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
 import org.openecomp.sdc.be.resources.data.ComponentInstanceData;
+import org.openecomp.sdc.be.user.Role;
 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
 import org.openecomp.sdc.common.api.Constants;
@@ -150,7 +153,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
     private ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL;
     private ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator;
     private ForwardingPathOperation forwardingPathOperation;
-    private NodeFilterOperation serviceFilterOperation;
+    private NodeFilterOperation nodeFilterOperation;
 
     @Autowired
     public ComponentInstanceBusinessLogic(IElementOperation elementDao,
@@ -162,7 +165,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         ComponentInstanceOperation componentInstanceOperation, ArtifactsBusinessLogic artifactBusinessLogic,
         ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL,
         ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator,
-        ForwardingPathOperation forwardingPathOperation, NodeFilterOperation serviceFilterOperation,
+        ForwardingPathOperation forwardingPathOperation, NodeFilterOperation nodeFilterOperation,
         ArtifactsOperations artifactToscaOperation) {
         super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation,
             interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation);
@@ -171,7 +174,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         this.compInstMergeDataBL = compInstMergeDataBL;
         this.onChangeInstanceOperationOrchestrator = onChangeInstanceOperationOrchestrator;
         this.forwardingPathOperation = forwardingPathOperation;
-        this.serviceFilterOperation = serviceFilterOperation;
+        this.nodeFilterOperation = nodeFilterOperation;
     }
 
     @Autowired
@@ -786,14 +789,20 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return updateComponentInstanceMetadata(containerComponentParam, containerComponentId, componentInstanceId, userId, componentInstance, false, true);
     }
 
-    public Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId, ComponentInstance componentInstance, boolean inTransaction,
-                                                                                     boolean needLock) {
+    public Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(
+        final String containerComponentParam,
+        final String containerComponentId,
+        final String componentInstanceId,
+        final String userId,
+        ComponentInstance componentInstance,
+        final boolean inTransaction,
+        boolean needLock) {
 
         validateUserExists(userId);
 
         final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
 
-        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
+        final Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
 
         validateCanWorkOnComponent(containerComponent, userId);
         ComponentTypeEnum instanceType = getComponentType(containerComponentType);
@@ -1010,7 +1019,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                         oldInstanceName, newInstanceName);
         for( Entry<String, CINodeFilterDataDefinition> entry :  renamedNodesFilter.entrySet()){
             Either<CINodeFilterDataDefinition, StorageOperationStatus>
-                    renameEither = serviceFilterOperation.updateNodeFilter(
+                    renameEither = nodeFilterOperation.updateNodeFilter(
                     containerComponent.getUniqueId(),entry.getKey(),entry.getValue());
             if (renameEither.isRight()){
                 return  Either.right(componentsUtils.getResponseFormatForResourceInstance(
@@ -1051,86 +1060,99 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return oldComponentInstance;
     }
 
-    public ComponentInstance deleteComponentInstance(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId) {
+    public ComponentInstance deleteComponentInstance(final String containerComponentParam,
+                                                     final String containerComponentId,
+                                                     final String componentInstanceId, String userId)
+        throws BusinessLogicException {
 
         validateUserExists(userId);
-
         final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
 
-        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
+        final Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
         validateCanWorkOnComponent(containerComponent, userId);
 
         boolean failed = false;
-        ComponentInstance deletedRelatedInst;
+        final Optional<ComponentInstance> componentInstanceOptional = containerComponent.getComponentInstanceById(componentInstanceId);
+        if (!componentInstanceOptional.isPresent()) {
+            throw new BusinessLogicException(componentsUtils
+                .getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND));
+        }
+        ComponentInstance componentInstance = componentInstanceOptional.get();
+
         try {
-            if (containerComponent instanceof Service) {
-                ComponentInstance componentInstance = containerComponent.getComponentInstanceById(componentInstanceId).get();
-                Either<String, StorageOperationStatus> deleteServiceFilterEither =
-                        serviceFilterOperation.deleteNodeFilter((Service) containerComponent, componentInstanceId);
+            if (containerComponent instanceof Service || containerComponent instanceof Resource &&
+                isVFC(componentInstance.getOriginType())) {
+
+                final Either<String, StorageOperationStatus> deleteServiceFilterEither =
+                        nodeFilterOperation.deleteNodeFilter(containerComponent, componentInstanceId);
                 if (deleteServiceFilterEither.isRight()) {
-                    ActionStatus status = componentsUtils.convertFromStorageResponse(deleteServiceFilterEither.right().value(),
+                    final ActionStatus status = componentsUtils.convertFromStorageResponse(deleteServiceFilterEither.right().value(),
                             containerComponentType);
                     janusGraphDao.rollback();
                     throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(status, componentInstanceId));
                 }
-                Either<ComponentInstance, ResponseFormat> resultOp = deleteServiceFiltersRelatedTobeDeletedComponentInstance((Service) containerComponent,
-                        componentInstance, ComponentTypeEnum.SERVICE, userId);
+                final Either<ComponentInstance, ResponseFormat> resultOp = deleteNodeFiltersFromComponentInstance(
+                    containerComponent, componentInstance, containerComponentType, userId);
                 if (resultOp.isRight()) {
                     janusGraphDao.rollback();
                     throw new ByResponseFormatComponentException(resultOp.right().value());
                 }
             }
             lockComponent(containerComponent, "deleteComponentInstance");
-            ComponentInstance deletedCompInstance = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
+            final ComponentInstance deletedCompInstance = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
 
-            deletedRelatedInst = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId,
+            componentInstance = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId,
                     containerComponentType, deletedCompInstance);
-            ActionStatus onDeleteOperationsStatus = onChangeInstanceOperationOrchestrator.doOnDeleteInstanceOperations(containerComponent, componentInstanceId);
+            final ActionStatus onDeleteOperationsStatus = onChangeInstanceOperationOrchestrator.doOnDeleteInstanceOperations(containerComponent, componentInstanceId);
             if (ActionStatus.OK != onDeleteOperationsStatus) {
                 throw new ByActionStatusComponentException(onDeleteOperationsStatus);
             }
-        } catch (ComponentException e) {
+        } catch (final ComponentException e) {
             failed = true;
             throw e;
         }
         finally {
             unlockComponent(failed, containerComponent);
         }
-        return deletedRelatedInst;
-    }
-
-    public Either<ComponentInstance, ResponseFormat> deleteServiceFiltersRelatedTobeDeletedComponentInstance(
-            Service service, ComponentInstance componentInstance, ComponentTypeEnum containerComponentType, String userId) {
-        if (containerComponentType.equals(ComponentTypeEnum.SERVICE)) {
-            Set<String> serviceFiltersIDsToBeDeleted =
-                    getServiceFiltersRelatedToComponentInstance(service.getUniqueId(), componentInstance);
-            if (!serviceFiltersIDsToBeDeleted.isEmpty()) {
-                Set<String> ids = service.getComponentInstances().stream()
-                                         .filter(ci -> serviceFiltersIDsToBeDeleted
-                                                               .contains(ci.getName()))
-                                         .map(ComponentInstance::getUniqueId)
-                                         .collect(Collectors.toSet());
-                Either<Set<String>, StorageOperationStatus> deleteServiceFiltersEither =
-                        serviceFilterOperation.deleteNodeFilters(service, ids);
-                if (deleteServiceFiltersEither.isRight()) {
-                    ActionStatus status = componentsUtils.convertFromStorageResponse(deleteServiceFiltersEither.right().value(),
-                            containerComponentType);
-                    return Either.right(componentsUtils.getResponseFormat(status, componentInstance.getName()));
+        return componentInstance;
+    }
+
+    public Either<ComponentInstance, ResponseFormat> deleteNodeFiltersFromComponentInstance(
+        final Component component,
+        final ComponentInstance componentInstance,
+        final ComponentTypeEnum containerComponentType,
+        final String userId) {
+
+        final Set<String> componentFiltersIDsToBeDeleted =
+            getComponentFiltersRelatedToComponentInstance(component.getUniqueId(), componentInstance);
+        if (!componentFiltersIDsToBeDeleted.isEmpty()) {
+            final Set<String> ids = component.getComponentInstances().stream()
+                .filter(ci -> componentFiltersIDsToBeDeleted.contains(ci.getName()))
+                .map(ComponentInstance::getUniqueId).collect(Collectors.toSet());
+            final Either<Set<String>, StorageOperationStatus> deleteComponentNodeFiltersEither =
+                nodeFilterOperation.deleteNodeFilters(component, ids);
+            if (deleteComponentNodeFiltersEither.isRight()) {
+                final ActionStatus status = componentsUtils
+                    .convertFromStorageResponse(deleteComponentNodeFiltersEither.right().value(),
+                        containerComponentType);
+                return Either.right(componentsUtils.getResponseFormat(status, componentInstance.getName()));
+            }
+            for (final String id : ids) {
+                final Optional<ComponentInstance> componentInstanceById = component.getComponentInstanceById(id);
+                if (!componentInstanceById.isPresent()) {
+                    return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
                 }
-                for (String id : ids) {
-                    final Optional<ComponentInstance> componentInstanceById = service.getComponentInstanceById(id);
-                    if (!componentInstanceById.isPresent()){
-                        return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-                    }
-                    ComponentInstance ci = componentInstanceById.get();
-                    ci.setDirectives(Collections.emptyList());
-
-                    final Either<ComponentInstance, ResponseFormat> componentInstanceResponseFormatEither =
-                            updateComponentInstanceMetadata(ComponentTypeEnum.SERVICE_PARAM_NAME, service.getUniqueId(),
-                                    ci.getUniqueId(), userId, ci, true, false);
-                    if (componentInstanceResponseFormatEither.isRight()) {
-                        return componentInstanceResponseFormatEither;
-                    }
+                final ComponentInstance componentInstanceToBeUpdated = componentInstanceById.get();
+                final List<String> directives = componentInstanceToBeUpdated.getDirectives();
+                if (CollectionUtils.isNotEmpty(directives)) {
+                    directives.removeAll(directives);
+                    componentInstanceToBeUpdated.setDirectives(Collections.emptyList());
+                }
+                final Either<ComponentInstance, ResponseFormat> componentInstanceResponseFormatEither =
+                    updateComponentInstanceMetadata(containerComponentType.getValue(), component.getUniqueId(),
+                        componentInstanceToBeUpdated.getUniqueId(), userId, componentInstanceToBeUpdated, true, false);
+                if (componentInstanceResponseFormatEither.isRight()) {
+                    return componentInstanceResponseFormatEither;
                 }
             }
         }
@@ -1139,14 +1161,14 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
 
 
-    private Set<String> getServiceFiltersRelatedToComponentInstance(String containerComponentId,
-            ComponentInstance componentInstance) {
+    private Set<String> getComponentFiltersRelatedToComponentInstance(String containerComponentId,
+                                                                      ComponentInstance componentInstance) {
         ComponentParametersView filter = new ComponentParametersView(true);
         filter.setIgnoreComponentInstances(false);
-        Either<Service, StorageOperationStatus> serviceFilterOrigin =
+        Either<Component, StorageOperationStatus> componentFilterOrigin =
                 toscaOperationFacade.getToscaElement(containerComponentId, filter);
-        final Service service = serviceFilterOrigin.left().value();
-        final Set<String> nodesFiltersToBeDeleted = ServiceFilterUtils.getNodesFiltersToBeDeleted(service,
+        final Component component = componentFilterOrigin.left().value();
+        final Set<String> nodesFiltersToBeDeleted = ComponentsUtils.getNodesFiltersToBeDeleted(component,
                 componentInstance);
         return nodesFiltersToBeDeleted;
     }
@@ -1163,10 +1185,6 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return componentInstance;
     }
 
-
-
-
-
     private void deleteForwardingPaths(String serviceId,  List<String> pathIdsToDelete){
 
         Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
@@ -2624,107 +2642,6 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         }
     }
 
-    /*private ResponseFormat updateCapabilityPropertyOnContainerComponent(ComponentInstanceProperty property, String newValue, Component containerComponent, ComponentInstance foundResourceInstance,
-                                                                        String capabilityType, String capabilityName, String ownerId) {
-        String componentInstanceUniqueId = foundResourceInstance.getUniqueId();
-        Map<String, List<CapabilityDefinition>> capabilities = Optional.ofNullable(foundResourceInstance.getCapabilities())
-                .orElse(Collections.emptyMap());
-        List<CapabilityDefinition> capPerType = Optional.ofNullable(capabilities.get(capabilityType)).orElse(Collections.emptyList());
-        Optional<CapabilityDefinition> cap = capPerType.stream().filter(c -> c.getName().equals(capabilityName) && c.getOwnerId().equals(ownerId)).findAny();
-        if (cap.isPresent()) {
-            List<ComponentInstanceProperty> capProperties = cap.get().getProperties();
-            if (capProperties != null) {
-                Optional<ComponentInstanceProperty> instanceProperty = capProperties.stream().filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny();
-                StorageOperationStatus status;
-                if (instanceProperty.isPresent()) {
-                    String capKey = ModelConverter.buildCapabilityPropertyKey(foundResourceInstance.getOriginType().isAtomicType(), capabilityType, capabilityName, componentInstanceUniqueId, cap.get());
-                    instanceProperty.get().setValue(newValue);
-                    List<String> path = new ArrayList<>();
-                    path.add(componentInstanceUniqueId);
-                    path.add(capKey);
-                    instanceProperty.get().setPath(path);
-                    status = toscaOperationFacade.updateComponentInstanceCapabiltyProperty(containerComponent, componentInstanceUniqueId, capKey, instanceProperty.get());
-                    if (status != StorageOperationStatus.OK) {
-                        ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
-                        return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
-
-                    }
-                    foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
-                }
-            }
-        }
-        return componentsUtils.getResponseFormat(ActionStatus.OK);
-    }*/
-
-    /*public Either<List<ComponentInstanceProperty>, ResponseFormat> updateInstanceCapabilityProperties(ComponentTypeEnum componentTypeEnum, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName, String ownerId,
-                                                                                                      List<ComponentInstanceProperty> properties, String userId) {
-        Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
-
-        validateUserExists(userId);
-
-        if (componentTypeEnum == null) {
-            BeEcompErrorManager.getInstance().logInvalidInputError("updateInstanceCapabilityProperty", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
-        }
-        Either<Component, StorageOperationStatus> getResourceResult = toscaOperationFacade.getToscaFullElement(containerComponentId);
-
-        if (getResourceResult.isRight()) {
-            log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, containerComponentId);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
-        }
-        Component containerComponent = getResourceResult.left().value();
-
-        if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
-            log.info("Restricted operation for user: {} on component {}", userId, containerComponentId);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
-        }
-        Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId);
-        if (resourceInstanceStatus.isRight()) {
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
-        }
-        ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
-        // lock resource
-        StorageOperationStatus lockStatus = graphLockOperation.lockComponent(containerComponentId, componentTypeEnum.getNodeType());
-        if (lockStatus != StorageOperationStatus.OK) {
-            log.debug("Failed to lock component {}", containerComponentId);
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
-        }
-
-        Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = dataTypeCache.getAll();
-        if (allDataTypes.isRight()) {
-            JanusGraphOperationStatus status = allDataTypes.right().value();
-            BeEcompErrorManager.getInstance().logInternalFlowError("UpdatePropertyValueOnComponentInstance", "Failed to update property value on instance. Status is " + status, ErrorSeverity.ERROR);
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status))));
-        }
-
-        try {
-            for (ComponentInstanceProperty property : properties) {
-                Either<String, ResponseFormat> newPropertyValueEither = validatePropertyObjectValue(property, false);
-                newPropertyValueEither.bimap(updatedValue ->
-                        updateCapabilityPropertyOnContainerComponent(property,updatedValue, containerComponent, foundResourceInstance, capabilityType, capabilityName, ownerId),
-                        Either::right);
-            }
-            Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
-
-            if (updateContainerRes.isRight()) {
-                ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
-                resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
-                return resultOp;
-            }
-            resultOp = Either.left(properties);
-            return resultOp;
-
-        } finally {
-            if (resultOp == null || resultOp.isRight()) {
-                janusGraphDao.rollback();
-            } else {
-                janusGraphDao.commit();
-            }
-            // unlock resource
-            graphLockOperation.unlockComponent(containerComponentId, componentTypeEnum.getNodeType());
-        }
-    }*/
-
     public Either<List<ComponentInstanceProperty>, ResponseFormat> updateInstanceCapabilityProperties(ComponentTypeEnum componentTypeEnum, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName,
                                                                                                       List<ComponentInstanceProperty> properties, String userId) {
         Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
@@ -3227,8 +3144,15 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
             log.error("Failed to deleteComponentInstance with instanceId[{}]", componentInstanceId);
             return Either.right(new ResponseFormat());
         }
+    }
 
+    public boolean isVFC(final OriginTypeEnum originTypeEnum) {
+        return OriginTypeEnum.VFC.equals(originTypeEnum);
+    }
 
+    public void validateUser(final String userId) {
+        final User user = userValidations.validateUserExists(userId);
+        userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
     }
 
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentNodeFilterBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentNodeFilterBusinessLogic.java
new file mode 100644 (file)
index 0000000..0356b63
--- /dev/null
@@ -0,0 +1,417 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+import static org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR;
+
+import fj.data.Either;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
+import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
+import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
+import org.openecomp.sdc.be.model.operations.api.IElementOperation;
+import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
+import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
+import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
+import org.openecomp.sdc.be.user.Role;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@org.springframework.stereotype.Component("componentNodeFilterBusinessLogic")
+public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
+
+    private static final Logger LOGGER = Logger.getLogger(ComponentNodeFilterBusinessLogic.class.getName());
+
+    private final NodeFilterOperation nodeFilterOperation;
+    private final NodeFilterValidator nodeFilterValidator;
+
+    @Autowired
+    public ComponentNodeFilterBusinessLogic(final IElementOperation elementDao,
+                                            final IGroupOperation groupOperation,
+                                            final IGroupInstanceOperation groupInstanceOperation,
+                                            final IGroupTypeOperation groupTypeOperation,
+                                            final InterfaceOperation interfaceOperation,
+                                            final InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
+                                            final ArtifactsOperations artifactToscaOperation,
+                                            final NodeFilterOperation nodeFilterOperation,
+                                            final NodeFilterValidator nodeFilterValidator) {
+        super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation,
+            interfaceLifecycleTypeOperation, artifactToscaOperation);
+        this.nodeFilterOperation = nodeFilterOperation;
+        this.nodeFilterValidator = nodeFilterValidator;
+    }
+
+    public Optional<CINodeFilterDataDefinition> createNodeFilterIfNotExist(final String componentId,
+                                                                           final String componentInstanceId,
+                                                                           final boolean shouldLock,
+                                                                           final ComponentTypeEnum componentTypeEnum)
+        throws BusinessLogicException {
+
+        final Component component = getComponent(componentId);
+        final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
+        Optional<CINodeFilterDataDefinition> filterDataDefinition = getCiNodeFilterDataDefinition(componentInstance);
+        if (filterDataDefinition.isPresent()) {
+            return filterDataDefinition;
+        }
+        final Either<CINodeFilterDataDefinition, StorageOperationStatus> result;
+        boolean wasLocked = false;
+        try {
+            if (shouldLock) {
+                lockComponent(component.getUniqueId(), component,"Create Node Filter on component");
+                wasLocked = true;
+            }
+            result = nodeFilterOperation.createNodeFilter(componentId, componentInstanceId);
+            if (result.isRight()) {
+                janusGraphDao.rollback();
+                LOGGER.error(BUSINESS_PROCESS_ERROR,
+                    "Failed to Create Node filter on component with id {}", componentId);
+                throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
+                    .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+            } else {
+                filterDataDefinition = Optional.ofNullable(result.left().value());
+            }
+            janusGraphDao.commit();
+            LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
+
+        } catch (final Exception e) {
+            janusGraphDao.rollback();
+            LOGGER.error(BUSINESS_PROCESS_ERROR,
+                "Exception occurred during add Component node filter property values: {}", e.getMessage(), e);
+            throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+        } finally {
+            if (wasLocked) {
+                unlockComponent(component.getUniqueId(), componentTypeEnum);
+            }
+        }
+        return filterDataDefinition;
+    }
+
+    public Optional<String> deleteNodeFilterIfExists(final String componentId,
+                                                     final String componentInstanceId,
+                                                     final boolean shouldLock,
+                                                     final ComponentTypeEnum componentTypeEnum)
+        throws BusinessLogicException {
+
+        final Component component = getComponent(componentId);
+        final Optional<CINodeFilterDataDefinition> nodeFilterDataDefinition =
+            getCiNodeFilterDataDefinition(componentInstanceId, component);
+        if (!nodeFilterDataDefinition.isPresent()) {
+            return Optional.ofNullable(componentInstanceId);
+        }
+
+        final Either<String, StorageOperationStatus> result;
+        boolean wasLocked = false;
+        try {
+            if (shouldLock) {
+                lockComponent(component.getUniqueId(), component,"Delete Node Filter from component");
+                wasLocked = true;
+            }
+            result = nodeFilterOperation.deleteNodeFilter(component, componentInstanceId);
+            if (result.isRight()) {
+                LOGGER.error(BUSINESS_PROCESS_ERROR,
+                    "Failed to delete node filter in component {}. Response is {}. ", component.getName(),
+                    result.right().value());
+                janusGraphDao.rollback();
+                throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
+                    .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+            }
+            janusGraphDao.commit();
+            LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
+
+        } catch (final Exception e) {
+            LOGGER.error(BUSINESS_PROCESS_ERROR,"Exception occurred during delete deleting node filter: {}",
+                e.getMessage(), e);
+            janusGraphDao.rollback();
+            throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+        } finally {
+            if (wasLocked) {
+                unlockComponent(component.getUniqueId(), componentTypeEnum);
+            }
+        }
+        return Optional.ofNullable(result.left().value());
+    }
+
+
+
+    public Optional<CINodeFilterDataDefinition> addNodeFilter(final String componentId,
+                                                              final String componentInstanceId,
+                                                              final NodeFilterConstraintAction action,
+                                                              final String propertyName,
+                                                              final String constraint,
+                                                              final boolean shouldLock,
+                                                              final ComponentTypeEnum componentTypeEnum)
+        throws BusinessLogicException {
+
+        final Component component = getComponent(componentId);
+        CINodeFilterDataDefinition nodeFilterDataDefinition = validateAndReturnNodeFilterDefinition(componentInstanceId,
+            action, constraint, component);
+        boolean wasLocked = false;
+        try {
+            if (shouldLock) {
+                lockComponent(component.getUniqueId(), component,"Add Node Filter on Component");
+                wasLocked = true;
+            }
+            final RequirementNodeFilterPropertyDataDefinition newProperty =
+                new RequirementNodeFilterPropertyDataDefinition();
+            newProperty.setName(propertyName);
+            newProperty.setConstraints(Collections.singletonList(constraint));
+            final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
+                .addNewProperty(componentId, componentInstanceId, nodeFilterDataDefinition, newProperty);
+
+            if (result.isRight()) {
+                janusGraphDao.rollback();
+                throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
+                    .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+            } else {
+                nodeFilterDataDefinition = result.left().value();
+            }
+            janusGraphDao.commit();
+            LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
+
+        } catch (final Exception e) {
+            janusGraphDao.rollback();
+            LOGGER.error(BUSINESS_PROCESS_ERROR,
+                "Exception occurred during add component node filter property values: {}", e.getMessage(), e);
+            throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+        } finally {
+            if (wasLocked) {
+                unlockComponent(component.getUniqueId(), componentTypeEnum);
+            }
+        }
+        return Optional.ofNullable(nodeFilterDataDefinition);
+    }
+
+    public Optional<CINodeFilterDataDefinition> deleteNodeFilter(final String componentId,
+                                                                 final String componentInstanceId,
+                                                                 final NodeFilterConstraintAction action,
+                                                                 final String constraint,
+                                                                 final int position,
+                                                                 final boolean shouldLock,
+                                                                 final ComponentTypeEnum componentTypeEnum)
+        throws BusinessLogicException {
+
+        final Component component = getComponent(componentId);
+        CINodeFilterDataDefinition nodeFilterDataDefinition =
+            validateAndReturnNodeFilterDefinition(componentInstanceId, action, constraint, component);
+        boolean wasLocked = false;
+        try {
+            if (shouldLock) {
+                lockComponent(component.getUniqueId(), component,"Add Node Filter on Component");
+                wasLocked = true;
+            }
+            final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
+                .deleteConstraint(componentId, componentInstanceId, nodeFilterDataDefinition, position);
+            if (result.isRight()) {
+                janusGraphDao.rollback();
+                throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
+                    .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+            } else {
+                nodeFilterDataDefinition = result.left().value();
+            }
+            janusGraphDao.commit();
+            LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
+
+        } catch (final Exception e) {
+            janusGraphDao.rollback();
+            LOGGER.error(BUSINESS_PROCESS_ERROR,
+                "Exception occurred during delete component node filter property values: {}", e.getMessage(), e);
+            throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+        } finally {
+            if (wasLocked) {
+                unlockComponent(component.getUniqueId(), componentTypeEnum);
+            }
+        }
+        return Optional.ofNullable(nodeFilterDataDefinition);
+    }
+
+    public Optional<CINodeFilterDataDefinition> updateNodeFilter(final String componentId,
+                                                                 final String componentInstanceId,
+                                                                 final List<String> constraints,
+                                                                 final boolean shouldLock,
+                                                                 final ComponentTypeEnum componentTypeEnum)
+        throws BusinessLogicException {
+
+        final Component component = getComponent(componentId);
+
+        final Either<Boolean, ResponseFormat> response = nodeFilterValidator
+            .validateNodeFilter(component, componentInstanceId, constraints, NodeFilterConstraintAction.UPDATE);
+        if (response.isRight()) {
+            throw new BusinessLogicException(componentsUtils
+                .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+        }
+        boolean wasLocked = false;
+        if (shouldLock) {
+            lockComponent(component.getUniqueId(), component,"Update Node Filter on Component");
+            wasLocked = true;
+        }
+        final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId,
+            component);
+        if (!componentInstance.isPresent()) {
+            throw new BusinessLogicException(ResponseFormatManager.getInstance()
+                .getResponseFormat(ActionStatus.GENERAL_ERROR));
+        }
+        CINodeFilterDataDefinition nodeFilterDataDefinition = componentInstance.get().getNodeFilter();
+        if (nodeFilterDataDefinition == null) {
+            throw new BusinessLogicException(componentsUtils
+                .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+        }
+        try {
+            final List<RequirementNodeFilterPropertyDataDefinition> properties = constraints.stream()
+                .map(this::getRequirementNodeFilterPropertyDataDefinition).collect(Collectors.toList());
+            final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
+                .updateProperties(componentId, componentInstanceId, nodeFilterDataDefinition, properties);
+
+            if (result.isRight()) {
+                janusGraphDao.rollback();
+                throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
+                    .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+            } else {
+                nodeFilterDataDefinition = result.left().value();
+            }
+            janusGraphDao.commit();
+            LOGGER.debug("Node filter successfully updated in component {} . ", component.getSystemName());
+
+        } catch (final Exception e) {
+            janusGraphDao.rollback();
+            LOGGER.error(BUSINESS_PROCESS_ERROR,
+                "Exception occurred during update component node filter property values: {}",
+                e.getMessage(), e);
+            throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+        } finally {
+            if (wasLocked) {
+                unlockComponent(component.getUniqueId(), componentTypeEnum);
+            }
+        }
+        return Optional.ofNullable(nodeFilterDataDefinition);
+    }
+
+    private void unlockComponent(final String componentUniqueId,
+                                 final ComponentTypeEnum componentType) {
+        graphLockOperation.unlockComponent(componentUniqueId, componentType.getNodeType());
+    }
+
+    public User validateUser(final String userId) {
+        final User user = userValidations.validateUserExists(userId);
+        userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
+        return user;
+    }
+
+    private Component getComponent(final String componentId) throws BusinessLogicException {
+
+        final Either<Component, StorageOperationStatus> result =
+            toscaOperationFacade.getToscaElement(componentId);
+
+        if (result.isRight()) {
+            final StorageOperationStatus errorStatus = result.right().value();
+            LOGGER.error(BUSINESS_PROCESS_ERROR, this.getClass().getName(),
+                "Failed to fetch component information by component id, error {}", errorStatus);
+            throw new BusinessLogicException(componentsUtils.getResponseFormat(
+                componentsUtils.convertFromStorageResponse(errorStatus)));
+        }
+        return result.left().value();
+    }
+
+    private Optional<ComponentInstance> getComponentInstance(final String componentInstanceId,
+                                                             final Component component) {
+        return component.getComponentInstanceById(componentInstanceId);
+    }
+
+    private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(
+        final Optional<ComponentInstance> componentInstance) {
+
+        if (componentInstance.isPresent()) {
+            return Optional.ofNullable(componentInstance.get().getNodeFilter());
+        }
+        return Optional.empty();
+    }
+
+    private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(final String componentInstanceId,
+                                                                               final Component component)
+        throws BusinessLogicException {
+
+        final Either<Boolean, ResponseFormat> response = nodeFilterValidator
+            .validateComponentInstanceExist(component, componentInstanceId);
+        if (response.isRight()) {
+            throw new BusinessLogicException(componentsUtils
+                .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+        }
+        final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
+        if (componentInstance.isPresent()) {
+            return Optional.ofNullable(componentInstance.get().getNodeFilter());
+        }
+        return Optional.empty();
+    }
+
+    private RequirementNodeFilterPropertyDataDefinition getRequirementNodeFilterPropertyDataDefinition(
+        final String constraint) {
+
+        final RequirementNodeFilterPropertyDataDefinition pdd = new RequirementNodeFilterPropertyDataDefinition();
+        pdd.setConstraints(Arrays.asList(constraint));
+        return pdd;
+    }
+
+    private CINodeFilterDataDefinition validateAndReturnNodeFilterDefinition(final String componentInstanceId,
+                                                                             final NodeFilterConstraintAction action,
+                                                                             final String constraint,
+                                                                             final Component component)
+        throws BusinessLogicException {
+
+        validateNodeFilter(component, componentInstanceId, action, constraint);
+        final Optional<CINodeFilterDataDefinition> cINodeFilterDataDefinition = getCiNodeFilterDataDefinition(
+            componentInstanceId, component);
+        if (!cINodeFilterDataDefinition.isPresent()) {
+            throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
+        }
+        return cINodeFilterDataDefinition.get();
+    }
+
+    private void validateNodeFilter(final Component component,
+                                    final String componentInstanceId,
+                                    final NodeFilterConstraintAction action,
+                                    final String constraint) throws BusinessLogicException {
+        final Either<Boolean, ResponseFormat> response = nodeFilterValidator
+            .validateNodeFilter(component, componentInstanceId, Collections.singletonList(constraint), action);
+        if (response.isRight()) {
+            throw new BusinessLogicException(componentsUtils
+                .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+        }
+    }
+}
\ No newline at end of file
index bdcc67c..f4ccb86 100644 (file)
 
 package org.openecomp.sdc.be.components.impl;
 
+import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
+import static org.openecomp.sdc.be.components.utils.ConsumptionUtils.handleConsumptionInputMappedToCapabilityProperty;
+import static org.openecomp.sdc.be.components.utils.ConsumptionUtils.isAssignedValueFromValidType;
+import static org.openecomp.sdc.be.components.utils.InterfaceOperationUtils.getOperationOutputName;
+import static org.openecomp.sdc.be.components.utils.InterfaceOperationUtils.isOperationInputMappedToOtherOperationOutput;
+import static org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum.UPDATE_SERVICE_METADATA;
+import static org.openecomp.sdc.be.tosca.InterfacesOperationsConverter.SELF;
+import static org.openecomp.sdc.be.types.ServiceConsumptionSource.SERVICE_INPUT;
+import static org.openecomp.sdc.be.types.ServiceConsumptionSource.STATIC;
+
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import fj.data.Either;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.collections4.ListUtils;
@@ -41,12 +67,10 @@ import org.openecomp.sdc.be.components.health.HealthCheckBusinessLogic;
 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
-import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
 import org.openecomp.sdc.be.components.path.ForwardingPathValidator;
 import org.openecomp.sdc.be.components.utils.InterfaceOperationUtils;
 import org.openecomp.sdc.be.components.utils.PropertiesUtils;
-import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
 import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
 import org.openecomp.sdc.be.components.validation.component.ComponentContactIdValidator;
 import org.openecomp.sdc.be.components.validation.component.ComponentDescriptionValidator;
@@ -69,13 +93,11 @@ import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
 import org.openecomp.sdc.be.datamodel.ServiceRelations;
 import org.openecomp.sdc.be.datamodel.utils.PropertyValueConstraintValidationUtil;
 import org.openecomp.sdc.be.datamodel.utils.UiComponentDataConverter;
-import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ForwardingPathDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationOutputDefinition;
-import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentFieldsEnum;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
@@ -107,7 +129,6 @@ import org.openecomp.sdc.be.model.category.CategoryDefinition;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ForwardingPathOperation;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
-import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
@@ -117,7 +138,6 @@ import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
 import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils;
 import org.openecomp.sdc.be.plugins.ServiceCreationPlugin;
-import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
 import org.openecomp.sdc.be.resources.data.ComponentInstanceData;
 import org.openecomp.sdc.be.resources.data.ComponentMetadataData;
 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
@@ -136,43 +156,16 @@ import org.openecomp.sdc.common.api.ArtifactTypeEnum;
 import org.openecomp.sdc.common.api.Constants;
 import org.openecomp.sdc.common.datastructure.Wrapper;
 import org.openecomp.sdc.common.kpi.api.ASDCKpiApi;
-import org.openecomp.sdc.common.log.elements.LoggerSupportability;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 import org.openecomp.sdc.common.util.GeneralUtility;
 import org.openecomp.sdc.common.util.ThreadLocalsHolder;
 import org.openecomp.sdc.common.util.ValidationUtils;
 import org.openecomp.sdc.exception.ResponseFormat;
+import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.context.WebApplicationContext;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
-import static org.openecomp.sdc.be.components.utils.ConsumptionUtils.handleConsumptionInputMappedToCapabilityProperty;
-import static org.openecomp.sdc.be.components.utils.ConsumptionUtils.isAssignedValueFromValidType;
-import static org.openecomp.sdc.be.components.utils.InterfaceOperationUtils.getOperationOutputName;
-import static org.openecomp.sdc.be.components.utils.InterfaceOperationUtils.isOperationInputMappedToOtherOperationOutput;
-import static org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum.UPDATE_SERVICE_METADATA;
-import static org.openecomp.sdc.be.tosca.InterfacesOperationsConverter.SELF;
-import static org.openecomp.sdc.be.types.ServiceConsumptionSource.SERVICE_INPUT;
-import static org.openecomp.sdc.be.types.ServiceConsumptionSource.STATIC;
-
 
 @org.springframework.stereotype.Component("serviceBusinessLogic")
 public class ServiceBusinessLogic extends ComponentBusinessLogic {
@@ -185,7 +178,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
     private static final String INITIAL_VERSION = "0.1";
     private static final String STATUS_SUCCESS_200 = "200";
     private static final String STATUS_DEPLOYED = "DEPLOYED";
-    private static final LoggerSupportability loggerSupportability = LoggerSupportability.getLogger(ServiceBusinessLogic.class.getName());
     static final String IS_VALID = "isValid";
 
     private ForwardingPathOperation forwardingPathOperation;
@@ -196,8 +188,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
     private final ServiceDistributionValidation serviceDistributionValidation;
     private final ForwardingPathValidator forwardingPathValidator;
     private final UiComponentDataConverter uiComponentDataConverter;
-    private final NodeFilterOperation serviceFilterOperation;
-    private final NodeFilterValidator serviceFilterValidator;
 
     private ServiceTypeValidator serviceTypeValidator;
     private List<ServiceCreationPlugin> serviceCreationPluginList;
@@ -230,24 +220,24 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
 
     @Autowired
     public ServiceBusinessLogic(IElementOperation elementDao,
-        IGroupOperation groupOperation,
-        IGroupInstanceOperation groupInstanceOperation,
-        IGroupTypeOperation groupTypeOperation,
-        GroupBusinessLogic groupBusinessLogic,
-        InterfaceOperation interfaceOperation,
-        InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
-        ArtifactsBusinessLogic artifactsBusinessLogic,
-        IDistributionEngine distributionEngine, ComponentInstanceBusinessLogic componentInstanceBusinessLogic,
-        ServiceDistributionValidation serviceDistributionValidation, ForwardingPathValidator forwardingPathValidator,
-        UiComponentDataConverter uiComponentDataConverter, NodeFilterOperation serviceFilterOperation,
-        NodeFilterValidator serviceFilterValidator, ArtifactsOperations artifactToscaOperation,
-        ComponentContactIdValidator componentContactIdValidator,
-        ComponentNameValidator componentNameValidator,
-        ComponentTagsValidator componentTagsValidator,
-        ComponentValidator componentValidator,
-        ComponentIconValidator componentIconValidator,
-        ComponentProjectCodeValidator componentProjectCodeValidator,
-        ComponentDescriptionValidator componentDescriptionValidator) {
+                                IGroupOperation groupOperation,
+                                IGroupInstanceOperation groupInstanceOperation,
+                                IGroupTypeOperation groupTypeOperation,
+                                GroupBusinessLogic groupBusinessLogic,
+                                InterfaceOperation interfaceOperation,
+                                InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
+                                ArtifactsBusinessLogic artifactsBusinessLogic,
+                                IDistributionEngine distributionEngine, ComponentInstanceBusinessLogic componentInstanceBusinessLogic,
+                                ServiceDistributionValidation serviceDistributionValidation, ForwardingPathValidator forwardingPathValidator,
+                                UiComponentDataConverter uiComponentDataConverter,
+                                ArtifactsOperations artifactToscaOperation,
+                                ComponentContactIdValidator componentContactIdValidator,
+                                ComponentNameValidator componentNameValidator,
+                                ComponentTagsValidator componentTagsValidator,
+                                ComponentValidator componentValidator,
+                                ComponentIconValidator componentIconValidator,
+                                ComponentProjectCodeValidator componentProjectCodeValidator,
+                                ComponentDescriptionValidator componentDescriptionValidator) {
         super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, groupBusinessLogic,
             interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic, artifactToscaOperation, componentContactIdValidator,
                 componentNameValidator, componentTagsValidator, componentValidator,
@@ -257,9 +247,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
         this.serviceDistributionValidation = serviceDistributionValidation;
         this.forwardingPathValidator = forwardingPathValidator;
         this.uiComponentDataConverter = uiComponentDataConverter;
-        this.serviceFilterOperation = serviceFilterOperation;
-        this.serviceFilterValidator = serviceFilterValidator;
-
     }
 
 
@@ -1239,7 +1226,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
     private void validateUserAndRole(Service serviceUpdate, User user, String errorContext) {
         user = validateUser(user, errorContext, serviceUpdate, null, false);
         validateUserRole(user, serviceUpdate, new ArrayList<>(), null, null);
-
     }
 
     @VisibleForTesting
@@ -2509,252 +2495,6 @@ public class ServiceBusinessLogic extends ComponentBusinessLogic {
         return Either.left(dataTransfer);
     }
 
-    public Either<String, ResponseFormat> deleteIfNotAlreadyDeletedServiceFilter(String serviceId, String resourceId, String userId, boolean lock) {
-        validateUserExists(userId);
-
-         Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
-        if (storageStatus.isRight()) {
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), ""));
-        }
-        Service service = storageStatus.left().value();
-
-        Either<Boolean, ResponseFormat> response = serviceFilterValidator.validateComponentInstanceExist(service, resourceId);
-        if (storageStatus.isRight()) {
-            return Either.right(response.right().value());
-        }
-        final Optional<ComponentInstance> optionalComponentInstance = service.getComponentInstanceById(resourceId);
-        if (!optionalComponentInstance.isPresent() ){
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-        }
-        CINodeFilterDataDefinition nodeFilter = optionalComponentInstance.get().getNodeFilter();
-        if (nodeFilter == null){
-            return Either.left(resourceId);
-        }
-
-        Either<String, StorageOperationStatus> result;
-        try{
-            if (lock) {
-                lockComponent(service.getUniqueId(), service, "Delete Service Filter from service");
-            }
-            result = serviceFilterOperation.deleteNodeFilter(service , resourceId);
-            if (result.isRight()) {
-                log.debug("Failed to delete node filter in service {}. Response is {}. ", service.getName(), result.right().value());
-                janusGraphDao.rollback();
-                return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE)));
-            }
-            janusGraphDao.commit();
-            log.debug("Node filter successfully changed in service {} . ", service.getSystemName());
-
-        } catch (Exception e){
-            log.error("Exception occurred during delete forwarding path : {}", e.getMessage(), e);
-            janusGraphDao.rollback();
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-        } finally {
-            graphLockOperation.unlockComponent(service.getUniqueId(), NodeTypeEnum.Service);
-        }
-        return Either.left(result.left().value());
-    }
-
-
-    public Either<CINodeFilterDataDefinition, ResponseFormat> createIfNotAlreadyExistServiceFilter(String serviceId, String componentInstanceId, String userId, boolean lock) {
-        String errorContext =  "createIfNotAlreadyExistServiceFilter";
-        User user = validateUserExists(userId);
-
-        Either<Service, StorageOperationStatus> serviceEither = toscaOperationFacade.getToscaElement(serviceId);
-        if (serviceEither.isRight()) {
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceEither.right().value(), ComponentTypeEnum.SERVICE), ""));
-        }
-        final Service service = serviceEither.left().value();
-        validateUserAndRole(service, user, errorContext);
-
-        Optional<ComponentInstance> optionalComponentInstance = service.getComponentInstanceById(componentInstanceId);
-        if (!optionalComponentInstance.isPresent()){
-            return Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
-        }
-        ComponentInstance componentInstance = optionalComponentInstance.get();
-        CINodeFilterDataDefinition serviceFilter = componentInstance.getNodeFilter();
-        if (serviceFilter != null){
-            return Either.left(serviceFilter);
-        }
-        if (lock) {
-            lockComponent(service.getUniqueId(), service, "Create Service Filter");
-        }
-        Either<CINodeFilterDataDefinition, StorageOperationStatus> result;
-
-        CINodeFilterDataDefinition serviceFilterResult;
-        try {
-            result =  serviceFilterOperation.createNodeFilter(serviceId, componentInstanceId);
-            if (result.isRight()) {
-                janusGraphDao.rollback();
-                return Either.right(componentsUtils.getResponseFormat(
-                        componentsUtils.convertFromStorageResponse(result.right().value(), ComponentTypeEnum.SERVICE),
-                        ""));
-            } else {
-                serviceFilterResult = result.left().value();
-            }
-            janusGraphDao.commit();
-
-        } catch (Exception e) {
-            janusGraphDao.rollback();
-            log.error("Exception occurred during add or update service filter property values: {}", e.getMessage(),
-                    e);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
-        } finally {
-            graphLockOperation.unlockComponent(service.getUniqueId(), NodeTypeEnum.Service);
-        }
-        return Either.left(serviceFilterResult);
-    }
-
-
-    public Either<CINodeFilterDataDefinition, ResponseFormat> updateServiceFilter(String serviceId, String componentInstanceId,
-            List<String> constraints,  User inUser, boolean lock) {
-        User user = validateUserExists(inUser.getUserId());
-        validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
-        Either<Service, StorageOperationStatus> serviceStorageOperationStatusEither = toscaOperationFacade.getToscaElement(serviceId);
-
-        if(serviceStorageOperationStatusEither.isRight()){
-            StorageOperationStatus errorStatus = serviceStorageOperationStatusEither.right().value();
-            log.debug("Failed to fetch service information by service id, error {}", errorStatus);
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(errorStatus)));
-        }
-        Service storedService = serviceStorageOperationStatusEither.left().value();
-
-        Either<Boolean, ResponseFormat> booleanResponseFormatEither =
-                serviceFilterValidator.validateNodeFilter(storedService, componentInstanceId, constraints,
-                        NodeFilterConstraintAction.UPDATE);
-        if(booleanResponseFormatEither.isRight()){
-            return Either.right(booleanResponseFormatEither.right().value());
-        }
-
-
-        Either<Boolean, ResponseFormat> lockResult = null;
-        if (lock) {
-            lockComponent(storedService.getUniqueId(), storedService, "Add or Update Service Filter on Service");
-        }
-        Optional<ComponentInstance> componentInstanceOptional = storedService.getComponentInstanceById(componentInstanceId);
-        if (!componentInstanceOptional.isPresent()){
-            return  Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
-        }
-        CINodeFilterDataDefinition serviceFilter = componentInstanceOptional.get().getNodeFilter();
-        if(serviceFilter == null){
-            return  Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
-        }
-        CINodeFilterDataDefinition serviceFilterResult;
-        try {
-            List<RequirementNodeFilterPropertyDataDefinition> properties =  constraints.stream().map(this::getRequirementNodeFilterPropertyDataDefinition).collect(Collectors.toList());
-            Either<CINodeFilterDataDefinition, StorageOperationStatus>  result =  serviceFilterOperation.updateProperties(serviceId, componentInstanceId, serviceFilter ,properties);
-
-            if (result.isRight()) {
-                janusGraphDao.rollback();
-                return Either.right(componentsUtils.getResponseFormat(
-                        componentsUtils.convertFromStorageResponse(result.right().value(), ComponentTypeEnum.SERVICE),
-                        ""));
-            } else {
-                serviceFilterResult = result.left().value();
-            }
-            janusGraphDao.commit();
-
-        } catch (Exception e) {
-            janusGraphDao.rollback();
-            log.error("Exception occurred during add or update service filter property values: {}", e.getMessage(),
-                    e);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
-        } finally {
-            if (lockResult != null && lockResult.isLeft() && lockResult.left().value()) {
-                graphLockOperation.unlockComponent(storedService.getUniqueId(), NodeTypeEnum.Service);
-            }
-        }
-        return Either.left(serviceFilterResult);
-    }
-
-    private RequirementNodeFilterPropertyDataDefinition getRequirementNodeFilterPropertyDataDefinition(String constraint){
-        RequirementNodeFilterPropertyDataDefinition pdd = new RequirementNodeFilterPropertyDataDefinition();
-        pdd.setConstraints(Arrays.asList(constraint));
-        return pdd;
-    }
-
-    public Either<CINodeFilterDataDefinition, ResponseFormat> addOrDeleteServiceFilter(String serviceId, String componentInstanceId,
-            NodeFilterConstraintAction action, String propertyName, String constraint, int position, User inUser, boolean lock) {
-        User user = validateUserExists(inUser.getUserId());
-        validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
-
-        Either<Service, StorageOperationStatus> serviceStorageOperationStatusEither = toscaOperationFacade.getToscaElement(serviceId);
-
-        if(serviceStorageOperationStatusEither.isRight()){
-            StorageOperationStatus errorStatus = serviceStorageOperationStatusEither.right().value();
-            log.debug("Failed to fetch service information by service id, error {}", errorStatus);
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(errorStatus)));
-        }
-        Service storedService = serviceStorageOperationStatusEither.left().value();
-
-        Either<Boolean, ResponseFormat> booleanResponseFormatEither =
-                serviceFilterValidator.validateNodeFilter(storedService, componentInstanceId,
-                        Collections.singletonList(constraint), action);
-        if(booleanResponseFormatEither.isRight()){
-            return Either.right(booleanResponseFormatEither.right().value());
-        }
-
-        Either<CINodeFilterDataDefinition, StorageOperationStatus> result = null;
-
-        CINodeFilterDataDefinition serviceFilterResult = null;
-        ActionStatus lockStatus = null;
-        try {
-            if (lock) {
-                lockStatus = lockComponentAndReturnStatus(storedService.getUniqueId(), storedService, "Add or Update Service Filter on Service");
-            }
-
-            Optional<ComponentInstance> componentInstanceOptional = storedService.getComponentInstanceById(componentInstanceId);
-            if (!componentInstanceOptional.isPresent()) {
-                return Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
-            }
-            CINodeFilterDataDefinition serviceFilter = componentInstanceOptional.get().getNodeFilter();
-            if (serviceFilter == null) {
-                return Either.right(ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
-            }
-
-
-            switch (action) {
-                case ADD:
-                    RequirementNodeFilterPropertyDataDefinition newProperty = new RequirementNodeFilterPropertyDataDefinition();
-                    newProperty.setName(propertyName);
-                    newProperty.setConstraints(Collections.singletonList(constraint));
-                    result = serviceFilterOperation.addNewProperty(serviceId, componentInstanceId, serviceFilter, newProperty);
-                    break;
-                case DELETE:
-                    result = serviceFilterOperation.deleteConstraint(serviceId, componentInstanceId, serviceFilter, position);
-                    break;
-                default:
-                    log.error("Unsupported operation " + action);
-                    return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
-            }
-
-            if (result != null && result.isRight()) {
-                janusGraphDao.rollback();
-                return Either.right(componentsUtils.getResponseFormat(
-                        componentsUtils.convertFromStorageResponse(result.right().value(), ComponentTypeEnum.SERVICE),
-                        ""));
-            } else {
-                serviceFilterResult = result.left().value();
-            }
-            janusGraphDao.commit();
-
-        } catch (Exception e) {
-            janusGraphDao.rollback();
-            log.error("Exception occurred during add or update node filter property values: {}", e.getMessage(),
-                    e);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
-        } finally {
-            if (ActionStatus.OK == lockStatus) {
-                graphLockOperation.unlockComponent(storedService.getUniqueId(), NodeTypeEnum.Service);
-            }
-        }
-        return Either.left(serviceFilterResult);
-    }
-
     @Autowired(required = false)
     public void setServiceCreationPluginList(List<ServiceCreationPlugin> serviceCreationPluginList) {
         this.serviceCreationPluginList = serviceCreationPluginList;
index 021e6b4..3c770d1 100644 (file)
@@ -22,18 +22,23 @@ package org.openecomp.sdc.be.components.validation;
 
 import com.google.common.collect.ImmutableSet;
 import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
 import org.apache.commons.lang3.StringUtils;
 import org.openecomp.sdc.be.components.impl.ResponseFormatManager;
 import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
-import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
 import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.PropertyDefinition;
-import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
 import org.openecomp.sdc.be.ui.model.UIConstraint;
@@ -41,17 +46,9 @@ import org.openecomp.sdc.exception.ResponseFormat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-
-@Component("NodeFilterValidator")
+@org.springframework.stereotype.Component("NodeFilterValidator")
 public class NodeFilterValidator {
 
     private static final String SOURCE = "Source";
@@ -70,18 +67,19 @@ public class NodeFilterValidator {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(NodeFilterValidator.class);
 
-    public Either<Boolean, ResponseFormat> validateComponentInstanceExist(Service service, String componentInstanceId) {
-        if (service == null || StringUtils.isEmpty(componentInstanceId)) {
+    public Either<Boolean, ResponseFormat> validateComponentInstanceExist(
+        final Component component,
+        final String componentInstanceId) {
+        if (component == null || StringUtils.isEmpty(componentInstanceId)) {
             LOGGER.debug("Input data cannot be empty");
             return getErrorResponse(ActionStatus.NODE_FILTER_NOT_FOUND);
         }
-        if (CollectionUtils.isEmpty(service.getComponentInstances())) {
+        if (CollectionUtils.isEmpty(component.getComponentInstances())) {
             LOGGER.debug("Component Instance list is empty");
             return getErrorResponse(ActionStatus.NODE_FILTER_NOT_FOUND);
         }
-        boolean found =
-                service.getComponentInstances().stream().anyMatch(ci -> ci.getUniqueId().equals(componentInstanceId));
-        if (!found) {
+        if (component.getComponentInstances().stream()
+            .noneMatch(ci -> ci.getUniqueId().equals(componentInstanceId))) {
             LOGGER.debug("Component Instance list is empty");
             return getErrorResponse(ActionStatus.NODE_FILTER_NOT_FOUND);
         }
@@ -93,20 +91,16 @@ public class NodeFilterValidator {
         return Either.right(errorResponse);
     }
 
-    public Either<Boolean, ResponseFormat> validateNodeFilter(CINodeFilterDataDefinition nodeFilter, String serviceId,
-            String complonentInstanceId) {
-        return Either.left(Boolean.TRUE);
-    }
-
-
-    public Either<Boolean, ResponseFormat> validateNodeFilter(Service parentComponent, String componentInstanceId,
-            List<String> uiConstraints, NodeFilterConstraintAction action) {
+    public Either<Boolean, ResponseFormat> validateNodeFilter(final Component parentComponent,
+                                                              final String componentInstanceId,
+                                                              final List<String> uiConstraints,
+                                                              final NodeFilterConstraintAction action) {
         try {
-            for (String uiConstraint : uiConstraints) {
+            for (final String uiConstraint : uiConstraints) {
                 if (NodeFilterConstraintAction.ADD != action && NodeFilterConstraintAction.UPDATE != action) {
                     break;
                 }
-                UIConstraint constraint = new ConstraintConvertor().convert(uiConstraint);
+                final UIConstraint constraint = new ConstraintConvertor().convert(uiConstraint);
                 if (ConstraintConvertor.PROPERTY_CONSTRAINT.equals(constraint.getSourceType())) {
                     final Either<Boolean, ResponseFormat> booleanResponseFormatEither =
                             validatePropertyConstraint(parentComponent, componentInstanceId, constraint);
@@ -121,7 +115,7 @@ public class NodeFilterValidator {
                     }
                 }
             }
-        } catch (Exception e) {
+        } catch (final Exception e) {
             LOGGER.debug("Provided constraint" + uiConstraints, e);
             return Either.right(componentsUtils.getResponseFormat(ActionStatus.CONSTRAINT_FORMAT_INCORRECT));
         }
@@ -129,10 +123,11 @@ public class NodeFilterValidator {
         return Either.left(true);
     }
 
-    private Either<Boolean, ResponseFormat> validatePropertyConstraint(Service parentComponent,
-            String componentInstanceId, UIConstraint uiConstraint) {
+    private Either<Boolean, ResponseFormat> validatePropertyConstraint(
+        final Component  parentComponent,
+        final String componentInstanceId, final UIConstraint uiConstraint) {
         String source = SOURCE;
-        Optional<ComponentInstance> brotherComponentInstance;
+        final Optional<ComponentInstance> brotherComponentInstance;
 
         List<? extends PropertyDefinition> sourcePropertyDefinition =
                 parentComponent.getName().equals(uiConstraint.getSourceName()) ? parentComponent.getProperties() :
@@ -213,12 +208,13 @@ public class NodeFilterValidator {
         }
     }
 
-    private Either<Boolean, ResponseFormat> validateStaticValueAndOperator(Service parentComponent,
-            String componentInstanceId, UIConstraint uiConstraint) {
+    private Either<Boolean, ResponseFormat> validateStaticValueAndOperator(
+        final Component  parentComponent,
+        final String componentInstanceId, final UIConstraint uiConstraint) {
         if (!(Objects.nonNull(uiConstraint) && uiConstraint.getValue() instanceof String)) {
             return Either.left(false);
         }
-        Optional<ComponentInstanceProperty> componentInstanceProperty =
+        final Optional<ComponentInstanceProperty> componentInstanceProperty =
                 parentComponent.getComponentInstancesProperties().get(componentInstanceId).stream()
                                .filter(property -> uiConstraint.getServicePropertyName().equals(property.getName()))
                                .findFirst();
index 62a3063..3479c5f 100644 (file)
@@ -30,7 +30,14 @@ import com.google.gson.GsonBuilder;
 import com.google.gson.reflect.TypeToken;
 import fj.F;
 import fj.data.Either;
-import java.util.function.Function;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
 import org.openecomp.sdc.be.auditing.api.AuditEventFactory;
@@ -70,13 +77,16 @@ import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
 import org.openecomp.sdc.be.dao.graph.datatype.AdditionalInformationEnum;
+import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
 import org.openecomp.sdc.be.datatypes.elements.AdditionalInfoParameterInfo;
+import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
 import org.openecomp.sdc.be.model.ArtifactDefinition;
 import org.openecomp.sdc.be.model.CapabilityTypeDefinition;
 import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ConsumerDefinition;
 import org.openecomp.sdc.be.model.DataTypeDefinition;
 import org.openecomp.sdc.be.model.GroupTypeDefinition;
@@ -99,6 +109,7 @@ import org.openecomp.sdc.be.resources.data.auditing.model.OperationalEnvAuditDat
 import org.openecomp.sdc.be.resources.data.auditing.model.ResourceCommonInfo;
 import org.openecomp.sdc.be.resources.data.auditing.model.ResourceVersionInfo;
 import org.openecomp.sdc.be.tosca.ToscaError;
+import org.openecomp.sdc.be.ui.model.UIConstraint;
 import org.openecomp.sdc.be.ui.model.UiLeftPaletteComponent;
 import org.openecomp.sdc.common.api.Constants;
 import org.openecomp.sdc.common.log.enums.LogLevel;
@@ -111,12 +122,6 @@ import org.openecomp.sdc.exception.ResponseFormat;
 import org.slf4j.MarkerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import javax.servlet.http.HttpServletRequest;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
 @org.springframework.stereotype.Component("componentUtils")
 public class ComponentsUtils {
 
@@ -1669,6 +1674,53 @@ public class ComponentsUtils {
         return uiLeftPaletteComponents;
     }
 
+    private static Set<String> getNodesFiltersToBeDeleted(final Component component,
+                                                         final String componentInstanceName) {
+        return component.getComponentInstances().stream()
+            .filter(ci -> isNodeFilterUsingChangedCi(ci, componentInstanceName))
+            .map(ComponentInstance::getName).collect(Collectors.toSet());
+    }
+    
+    public static Set<String> getNodesFiltersToBeDeleted(final Component component, 
+                                                         final ComponentInstance componentInstance) {
+        return getNodesFiltersToBeDeleted(component, componentInstance.getName());
+    }
+
+    private static boolean isNodeFilterUsingChangedCi(final ComponentInstance componentInstance, 
+                                                      final String componentInstanceName) {
+        if (CollectionUtils.isEmpty(componentInstance.getDirectives())) {
+            return false;
+        }
+        if (componentInstance.getNodeFilter() == null || componentInstance.getNodeFilter().getProperties() == null
+            || componentInstance.getNodeFilter().getProperties().getListToscaDataDefinition() == null) {
+            return false;
+        }
+        return componentInstance.getNodeFilter().getProperties().getListToscaDataDefinition().stream()
+            .anyMatch(property -> isPropertyConstraintChangedByCi(property, componentInstanceName));
+    }
+
+    private static boolean isPropertyConstraintChangedByCi(
+        final RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition, 
+        final String componentInstanceName) {
+        final List<String> constraints = requirementNodeFilterPropertyDataDefinition.getConstraints();
+        if (constraints == null) {
+            return false;
+        }
+        return constraints.stream().anyMatch(constraint -> isConstraintChangedByCi(constraint, componentInstanceName));
+    }
+
+    private static boolean isConstraintChangedByCi(final String constraint, 
+                                                   final String componentInstanceName) {
+        final UIConstraint uiConstraint = new ConstraintConvertor().convert(constraint);
+        if (uiConstraint == null || uiConstraint.getSourceType() == null) {
+            return false;
+        }
+        if (!uiConstraint.getSourceType().equals(ConstraintConvertor.PROPERTY_CONSTRAINT)) {
+            return false;
+        }
+        return uiConstraint.getSourceName().equals(componentInstanceName);
+    }
+
     public F<StorageOperationStatus, ResponseFormat> toResponseFormat() {
         return sos -> getResponseFormat(convertFromStorageResponse(sos));
     }
index d9a890d..64f6550 100644 (file)
@@ -38,7 +38,6 @@ import io.swagger.v3.oas.annotations.servers.Server;
 import io.swagger.v3.oas.annotations.servers.Servers;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tags;
-import org.apache.commons.collections.CollectionUtils;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Type;
@@ -46,6 +45,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import javax.inject.Inject;
 import javax.servlet.http.HttpServletRequest;
@@ -66,11 +66,12 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ComponentNodeFilterBusinessLogic;
 import org.openecomp.sdc.be.components.impl.GroupBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceImportManager;
-import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.aaf.AafPermission;
 import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed;
+import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
@@ -132,19 +133,19 @@ public class ComponentInstanceServlet extends AbstractValidationsServlet {
 
     private final GroupBusinessLogic groupBL;
     private final ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
-    private final ServiceBusinessLogic serviceBusinessLogic;
+    private final ComponentNodeFilterBusinessLogic nodeFilterBusinessLogic;
 
 
     @Inject
     public ComponentInstanceServlet(UserBusinessLogic userBusinessLogic,
-        GroupBusinessLogic groupBL, ComponentInstanceBusinessLogic componentInstanceBL,
-        ComponentsUtils componentsUtils, ServletUtils servletUtils,
-        ResourceImportManager resourceImportManager,
-        ServiceBusinessLogic serviceBusinessLogic) {
+                                    GroupBusinessLogic groupBL, ComponentInstanceBusinessLogic componentInstanceBL,
+                                    ComponentsUtils componentsUtils, ServletUtils servletUtils,
+                                    ResourceImportManager resourceImportManager,
+                                    ComponentNodeFilterBusinessLogic nodeFilterBusinessLogic) {
         super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
         this.groupBL = groupBL;
         this.componentInstanceBusinessLogic = componentInstanceBL;
-        this.serviceBusinessLogic = serviceBusinessLogic;
+        this.nodeFilterBusinessLogic = nodeFilterBusinessLogic;
     }
 
     @POST
@@ -207,64 +208,67 @@ public class ComponentInstanceServlet extends AbstractValidationsServlet {
                     schema = @Schema(allowableValues = {ComponentTypeEnum.RESOURCE_PARAM_NAME,
                             ComponentTypeEnum.SERVICE_PARAM_NAME,
                             ComponentTypeEnum.PRODUCT_PARAM_NAME})) @PathParam("containerComponentType") final String containerComponentType,
-            @Context final HttpServletRequest request) throws IOException {
+            @Context final HttpServletRequest request) throws IOException, BusinessLogicException {
 
-        String url = request.getMethod() + " " + request.getRequestURI();
+        final String url = request.getMethod() + " " + request.getRequestURI();
         log.debug(START_HANDLE_REQUEST_OF, url);
         loggerSupportability.log(LoggerSupportabilityActions.UPDATE_COMPONENT_INSTANCE,StatusCode.STARTED,"update Component Instance Metadata");
+        final String userId = request.getHeader(Constants.USER_ID_HEADER);
+        componentInstanceBusinessLogic.validateUser(userId);
         try {
-
             log.debug(START_HANDLE_REQUEST_OF, url);
-
-            InputStream inputStream = request.getInputStream();
-
-            byte[] bytes = IOUtils.toByteArray(inputStream);
+            final byte[] bytes = IOUtils.toByteArray(request.getInputStream());
 
             if (bytes == null || bytes.length == 0) {
                 log.info(EMPTY_BODY_WAS_SENT);
                 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT));
             }
 
-            String userId = request.getHeader(Constants.USER_ID_HEADER);
-
-            String data = new String(bytes);
-            ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(containerComponentType);
+            final String data = new String(bytes);
+            final ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(containerComponentType);
             if (componentInstanceBusinessLogic == null) {
                 log.debug(UNSUPPORTED_COMPONENT_TYPE, containerComponentType);
-                return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.UNSUPPORTED_ERROR, containerComponentType));
+                return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.UNSUPPORTED_ERROR,
+                    containerComponentType));
             }
-            Either<ComponentInstance, ResponseFormat> convertResponse = convertToResourceInstance(data);
-
+            final Either<ComponentInstance, ResponseFormat> convertResponse = convertToResourceInstance(data);
             if (convertResponse.isRight()) {
                 BeEcompErrorManager.getInstance().logBeSystemError(RESOURCE_INSTANCE_UPDATE_RESOURCE_INSTANCE);
                 log.debug(FAILED_TO_CONVERT_RECEIVED_DATA_TO_BE_FORMAT);
                 return buildErrorResponse(convertResponse.right().value());
             }
 
-            ComponentInstance resourceInstance = convertResponse.left().value();
-            Either<ComponentInstance, ResponseFormat> actionResponse = componentInstanceBusinessLogic.updateComponentInstanceMetadata(containerComponentType, componentId, componentInstanceId, userId, resourceInstance);
-            loggerSupportability.log(LoggerSupportabilityActions.UPDATE_COMPONENT_INSTANCE,actionResponse.left().value().getComponentMetadataForSupportLog(),StatusCode.COMPLETE,"update Component Instance Metadata by {}",userId);
+
+            final ComponentInstance componentInstance = convertResponse.left().value();
+            final Either<ComponentInstance, ResponseFormat> actionResponse = componentInstanceBusinessLogic
+                .updateComponentInstanceMetadata(containerComponentType, componentId, componentInstanceId, userId, componentInstance);
+            loggerSupportability.log(LoggerSupportabilityActions.UPDATE_COMPONENT_INSTANCE,actionResponse.left().value()
+                .getComponentMetadataForSupportLog(),StatusCode.COMPLETE,"update Component Instance Metadata by {}", userId);
             if (actionResponse.isRight()) {
                 return buildErrorResponse(actionResponse.right().value());
             }
-            ComponentInstance resultValue = actionResponse.left().value();
-            if (componentTypeEnum.equals(ComponentTypeEnum.SERVICE)){
-                if(CollectionUtils.isNotEmpty(resourceInstance.getDirectives())) {
-                    Either<CINodeFilterDataDefinition, ResponseFormat> either =
-                        serviceBusinessLogic.createIfNotAlreadyExistServiceFilter(componentId, componentInstanceId, userId,
-                            true);
-                    if (either.isRight()){
-                        BeEcompErrorManager.getInstance().logBeSystemError("Resource Instance - updateResourceInstance Failed to create service filter.");
-                        log.debug("Failed to create service filter.");
+
+            final ComponentInstance resultValue = actionResponse.left().value();
+            if (ComponentTypeEnum.SERVICE.equals(componentTypeEnum) ||
+                ComponentTypeEnum.RESOURCE.equals(componentTypeEnum) &&
+                    componentInstanceBusinessLogic.isVFC(componentInstance.getOriginType())) {
+
+                if(CollectionUtils.isNotEmpty(componentInstance.getDirectives())) {
+                    final Optional<CINodeFilterDataDefinition> nodeFilterDataDefinition =
+                            nodeFilterBusinessLogic.createNodeFilterIfNotExist(componentId, componentInstanceId,
+                                true,  componentTypeEnum);
+                    if (!nodeFilterDataDefinition.isPresent()){
+                        BeEcompErrorManager.getInstance().logBeSystemError("Failed to create node filter.");
+                        log.error("Failed to create node filter.");
                         return buildErrorResponse(convertResponse.right().value());
                     }
-                    resultValue.setNodeFilter(either.left().value());
-
+                    resultValue.setNodeFilter(nodeFilterDataDefinition.get());
                 } else {
-                    Either<String, ResponseFormat> either = serviceBusinessLogic.deleteIfNotAlreadyDeletedServiceFilter(componentId, componentInstanceId,  userId,true);
-                    if (either.isRight()){
-                        BeEcompErrorManager.getInstance().logBeSystemError("Resource Instance - updateResourceInstance Failed to delete service filter.");
-                        log.debug("Failed to delete service filter.");
+                    final Optional<String> result = nodeFilterBusinessLogic
+                        .deleteNodeFilterIfExists(componentId, componentInstanceId,  true, componentTypeEnum);
+                    if (!result.isPresent()){
+                        BeEcompErrorManager.getInstance().logBeSystemError("Failed to delete node filter.");
+                        log.error("Failed to delete node filter.");
                         return buildErrorResponse(convertResponse.right().value());
                     }
                     resultValue.setNodeFilter(null);
@@ -273,7 +277,7 @@ public class ComponentInstanceServlet extends AbstractValidationsServlet {
 
             return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), actionResponse.left().value());
 
-        } catch (Exception e) {
+        } catch (final Exception e) {
             BeEcompErrorManager.getInstance().logBeRestApiGeneralError(UPDATE_RESOURCE_INSTANCE);
             log.debug(UPDATE_RESOURCE_INSTANCE_WITH_EXCEPTION, e);
             throw e;
@@ -377,7 +381,7 @@ public class ComponentInstanceServlet extends AbstractValidationsServlet {
         } catch (Exception e) {
             BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete Resource Instance");
             log.debug("delete resource instance with exception", e);
-            throw e;
+            return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
         }
     }
 
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentNodeFilterServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentNodeFilterServlet.java
new file mode 100644 (file)
index 0000000..4a43ab2
--- /dev/null
@@ -0,0 +1,299 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.servlets;
+
+import fj.data.Either;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ComponentNodeFilterBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ResourceImportManager;
+import org.openecomp.sdc.be.components.impl.aaf.AafPermission;
+import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed;
+import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
+import org.openecomp.sdc.be.config.BeEcompErrorManager;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
+import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.impl.ServletUtils;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.tosca.utils.NodeFilterConverter;
+import org.openecomp.sdc.be.ui.model.UIConstraint;
+import org.openecomp.sdc.be.ui.model.UINodeFilter;
+import org.openecomp.sdc.be.user.UserBusinessLogic;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Path("/v1/catalog/{componentType}/{componentId}/resourceInstances/{componentInstanceId}/nodeFilter")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Singleton
+public class ComponentNodeFilterServlet extends AbstractValidationsServlet {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ComponentNodeFilterServlet.class);
+    private static final String START_HANDLE_REQUEST_OF = "Start handle request of {}";
+    private static final String MODIFIER_ID_IS = "modifier id is {}";
+
+    private static final String FAILED_TO_PARSE_COMPONENT = "failed to parse component";
+
+    private static final String FAILED_TO_CREATE_NODE_FILTER = "failed to create node filter";
+    private static final String NODE_FILTER_CREATION = "Node Filter Creation";
+    private static final String CREATE_NODE_FILTER_WITH_AN_ERROR = "create node filter with an error";
+
+    private static final String FAILED_TO_UPDATE_NODE_FILTER = "failed to update node filter";
+    private static final String NODE_FILTER_UPDATE = "Node Filter Update";
+    private static final String UPDATE_NODE_FILTER_WITH_AN_ERROR = "update node filter with an error";
+
+    private static final String FAILED_TO_DELETE_NODE_FILTER = "failed to delete node filter";
+    private static final String NODE_FILTER_DELETE = "Node Filter Delete";
+    private static final String DELETE_NODE_FILTER_WITH_AN_ERROR = "delete node filter with an error";
+
+    private final ComponentNodeFilterBusinessLogic componentNodeFilterBusinessLogic;
+
+    @Inject
+    public ComponentNodeFilterServlet(final UserBusinessLogic userBusinessLogic,
+                                      final ComponentInstanceBusinessLogic componentInstanceBL,
+                                      final ComponentsUtils componentsUtils,
+                                      final ServletUtils servletUtils,
+                                      final ResourceImportManager resourceImportManager,
+                                      final ComponentNodeFilterBusinessLogic componentNodeFilterBusinessLogic) {
+        super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
+        this.componentNodeFilterBusinessLogic = componentNodeFilterBusinessLogic;
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/")
+    @Operation(description = "Add Component Filter Constraint", method = "POST",
+        summary = "Add Component Filter Constraint", responses = {
+        @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
+        @ApiResponse(responseCode = "201", description = "Create Component Filter"),
+        @ApiResponse(responseCode = "403", description = "Restricted operation"),
+        @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
+    @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
+    public Response addComponentFilterConstraint(
+        @Parameter(description = "UIConstraint data", required = true) String constraintData,
+        @Parameter(description = "Component Id") @PathParam("componentId") String componentId,
+        @Parameter(description = "Component Instance Id") @PathParam("componentInstanceId") String componentInstanceId,
+        @Parameter(description = "valid values: resources / services",
+            schema = @Schema(allowableValues = {
+                ComponentTypeEnum.RESOURCE_PARAM_NAME,
+                ComponentTypeEnum.SERVICE_PARAM_NAME})) @PathParam("componentType") final String componentType,
+        @Context final HttpServletRequest request,
+        @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
+
+        LOGGER.debug(START_HANDLE_REQUEST_OF, request.getMethod(), request.getRequestURI());
+        LOGGER.debug(MODIFIER_ID_IS, userId);
+        final User userModifier = componentNodeFilterBusinessLogic.validateUser(userId);
+
+        final ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(componentType);
+        try {
+            final Either<UIConstraint, ResponseFormat> convertResponse = parseToConstraint(constraintData, userModifier,
+                componentTypeEnum);
+            if (convertResponse.isRight()) {
+                LOGGER.error(FAILED_TO_PARSE_COMPONENT);
+                return buildErrorResponse(convertResponse.right().value());
+            }
+            final UIConstraint uiConstraint = convertResponse.left().value();
+            if (uiConstraint == null) {
+                LOGGER.debug(FAILED_TO_PARSE_COMPONENT);
+                return buildErrorResponse(convertResponse.right().value());
+            }
+            final Optional<CINodeFilterDataDefinition> actionResponse;
+            final String constraint = new ConstraintConvertor().convert(uiConstraint);
+            actionResponse = componentNodeFilterBusinessLogic
+                .addNodeFilter(componentId.toLowerCase(), componentInstanceId, NodeFilterConstraintAction.ADD,
+                    uiConstraint.getServicePropertyName(), constraint, true, componentTypeEnum);
+
+            if (!actionResponse.isPresent()) {
+                LOGGER.error(FAILED_TO_CREATE_NODE_FILTER);
+                return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+            }
+            final UINodeFilter nodeFilter = new NodeFilterConverter().convertToUi(actionResponse.get());
+
+            return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), nodeFilter);
+
+        } catch (final Exception e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION);
+            LOGGER.error(CREATE_NODE_FILTER_WITH_AN_ERROR, e);
+            return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+        }
+    }
+
+    @PUT
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/")
+    @Operation(description = "Update Component Filter Constraint", method = "PUT",
+        summary = "Update Component Filter Constraint", responses = {
+        @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
+        @ApiResponse(responseCode = "201", description = "Create Component Filter"),
+        @ApiResponse(responseCode = "403", description = "Restricted operation"),
+        @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
+    @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
+    public Response updateComponentFilterConstraint(
+        @Parameter(description = "UIConstraint data", required = true) String constraintData,
+        @Parameter(description = "Component Id") @PathParam("componentId") String componentId,
+        @Parameter(description = "Component Instance Id") @PathParam("componentInstanceId") String componentInstanceId,
+        @Parameter(description = "valid values: resources / services",
+            schema = @Schema(allowableValues = {
+                ComponentTypeEnum.RESOURCE_PARAM_NAME,
+                ComponentTypeEnum.SERVICE_PARAM_NAME})) @PathParam("componentType") final String componentType,
+        @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
+
+        LOGGER.debug(START_HANDLE_REQUEST_OF, request.getMethod(), request.getRequestURI());
+        LOGGER.debug(MODIFIER_ID_IS, userId);
+        final User userModifier = componentNodeFilterBusinessLogic.validateUser(userId);
+
+        try {
+            final ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(componentType);
+            final Either<List, ResponseFormat> convertResponse = parseToConstraints(constraintData, userModifier,
+                componentTypeEnum);
+            if (convertResponse.isRight()) {
+                LOGGER.error(FAILED_TO_PARSE_COMPONENT);
+                return buildErrorResponse(convertResponse.right().value());
+            }
+            final List<Map<String, String>> uiConstraintsMaps = (List<Map<String, String>>) convertResponse.left()
+                .value();
+            if (uiConstraintsMaps == null) {
+                LOGGER.debug("failed to parse data");
+                return buildErrorResponse(convertResponse.right().value());
+            }
+            final ObjectMapper objectMapper = new ObjectMapper();
+            final List<UIConstraint> uiConstraints = uiConstraintsMaps.stream()
+                .map(dataMap -> objectMapper.convertValue(dataMap, UIConstraint.class)).collect(
+                    Collectors.toList());
+            if (uiConstraints == null) {
+                LOGGER.debug("failed to parse data");
+                return buildErrorResponse(convertResponse.right().value());
+            }
+            final Optional<CINodeFilterDataDefinition> actionResponse;
+            final List<String> constraints = new ConstraintConvertor().convertToList(uiConstraints);
+
+            actionResponse = componentNodeFilterBusinessLogic
+                .updateNodeFilter(componentId.toLowerCase(), componentInstanceId, constraints,
+                    true, componentTypeEnum);
+
+            if (!actionResponse.isPresent()) {
+                LOGGER.error(FAILED_TO_UPDATE_NODE_FILTER);
+                return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+            }
+
+            return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
+                new NodeFilterConverter().convertToUi(actionResponse.get()));
+
+        } catch (final Exception e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_UPDATE);
+            LOGGER.error(UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
+            return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+        }
+    }
+
+    @DELETE
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/{constraintIndex}")
+    @Operation(description = "Delete Component Filter Constraint", method = "Delete",
+        summary = "Delete Component Filter Constraint", responses = {
+        @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
+        @ApiResponse(responseCode = "201", description = "Delete Component Filter Constraint"),
+        @ApiResponse(responseCode = "403", description = "Restricted operation"),
+        @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
+    @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
+    public Response deleteComponentFilterConstraint(
+        @Parameter(description = "Component Id") @PathParam("componentId") String componentId,
+        @Parameter(description = "Component Instance Id") @PathParam("componentInstanceId") String componentInstanceId,
+        @Parameter(description = "Constraint Index") @PathParam("constraintIndex") int index,
+        @Parameter(description = "valid values: resources / services",
+            schema = @Schema(allowableValues = {
+                ComponentTypeEnum.RESOURCE_PARAM_NAME,
+                ComponentTypeEnum.SERVICE_PARAM_NAME})) @PathParam("componentType") final String componentType,
+        @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
+
+        LOGGER.debug(START_HANDLE_REQUEST_OF, request.getMethod(), request.getRequestURI());
+        LOGGER.debug(MODIFIER_ID_IS, userId);
+        componentNodeFilterBusinessLogic.validateUser(userId);
+
+        try {
+            final Optional<CINodeFilterDataDefinition> actionResponse;
+            actionResponse = componentNodeFilterBusinessLogic
+                .deleteNodeFilter(componentId.toLowerCase(), componentInstanceId, NodeFilterConstraintAction.DELETE,
+                    null, index, true, ComponentTypeEnum.findByParamName(componentType));
+
+            if (!actionResponse.isPresent()) {
+                LOGGER.debug(FAILED_TO_DELETE_NODE_FILTER);
+                return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+            }
+
+            return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
+                new NodeFilterConverter().convertToUi(actionResponse.get()));
+
+        } catch (final Exception e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_DELETE);
+            LOGGER.debug(DELETE_NODE_FILTER_WITH_AN_ERROR, e);
+            return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+
+        }
+    }
+
+    private Either<UIConstraint, ResponseFormat> parseToConstraint(final String componentJson,
+                                                                   final User user,
+                                                                   final ComponentTypeEnum componentTypeEnum) {
+        return getComponentsUtils().convertJsonToObjectUsingObjectMapper(componentJson, user, UIConstraint.class,
+            AuditingActionEnum.CREATE_RESOURCE, componentTypeEnum);
+    }
+
+    private Either<List, ResponseFormat> parseToConstraints(final String componentJson,
+                                                            final User user,
+                                                            final ComponentTypeEnum componentTypeEnum) {
+        return getComponentsUtils().convertJsonToObjectUsingObjectMapper(componentJson, user, List.class,
+            AuditingActionEnum.CREATE_RESOURCE, componentTypeEnum);
+    }
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceFilterServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceFilterServlet.java
deleted file mode 100644 (file)
index a37ab01..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * SDC
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.sdc.be.servlets;
-
-import fj.data.Either;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.media.ArraySchema;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.servers.Server;
-import io.swagger.v3.oas.annotations.servers.Servers;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.tags.Tags;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
-import org.openecomp.sdc.be.components.impl.ResourceImportManager;
-import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
-import org.openecomp.sdc.be.components.impl.aaf.AafPermission;
-import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed;
-import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
-import org.openecomp.sdc.be.config.BeEcompErrorManager;
-import org.openecomp.sdc.be.dao.api.ActionStatus;
-import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
-import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
-import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
-import org.openecomp.sdc.be.impl.ComponentsUtils;
-import org.openecomp.sdc.be.impl.ServletUtils;
-import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
-import org.openecomp.sdc.be.tosca.utils.NodeFilterConverter;
-import org.openecomp.sdc.be.ui.model.UIConstraint;
-import org.openecomp.sdc.be.ui.model.UINodeFilter;
-import org.openecomp.sdc.be.user.UserBusinessLogic;
-import org.openecomp.sdc.common.api.Constants;
-import org.openecomp.sdc.exception.ResponseFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-@Path("/v1/catalog/services/{serviceId}/resourceInstances/{resourceInstanceId}/nodeFilter")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Tags({@Tag(name = "SDC Internal APIs")})
-@Servers({@Server(url = "/sdc2/rest")})
-@Singleton
-public class ServiceFilterServlet extends AbstractValidationsServlet {
-
-    private static final Logger log = LoggerFactory.getLogger(ServiceFilterServlet.class);
-    private static final String START_HANDLE_REQUEST_OF = "Start handle request of {}";
-    private static final String MODIFIER_ID_IS = "modifier id is {}";
-    private static final String FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER = "failed to update or create node filter";
-    private static final String FAILED_TO_PARSE_SERVICE = "failed to parse service";
-    private static final String NODE_FILTER_CREATION_OR_UPDATE = "Node Filter Creation or update";
-    private static final String CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR =
-            "create or update node filter with an error";
-    private final ServiceBusinessLogic serviceBusinessLogic;
-
-    @Inject
-    public ServiceFilterServlet(UserBusinessLogic userBusinessLogic,
-        ComponentInstanceBusinessLogic componentInstanceBL,
-        ComponentsUtils componentsUtils, ServletUtils servletUtils,
-        ResourceImportManager resourceImportManager,
-        ServiceBusinessLogic serviceBusinessLogic) {
-        super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
-        this.serviceBusinessLogic = serviceBusinessLogic;
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("/")
-    @Operation(description = "Add Service Filter Constraint", method = "POST",
-            summary = "Add Service Filter Constraint", responses = {
-            @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
-            @ApiResponse(responseCode = "201", description = "Create Service Filter"),
-            @ApiResponse(responseCode = "403", description = "Restricted operation"),
-            @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
-    @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
-    public Response addServiceFilterConstraint(@Parameter(description = "Service data", required = true) String data,
-            @Parameter(description = "Service Id") @PathParam("serviceId") String serviceId,
-            @Parameter(description = "Resource Instance Id") @PathParam("resourceInstanceId") String ciId,
-            @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
-
-        String url = request.getMethod() + " " + request.getRequestURI();
-        log.debug(START_HANDLE_REQUEST_OF, url);
-        final HttpSession session = request.getSession();
-        ServletContext context = session.getServletContext();
-        User modifier = new User();
-        modifier.setUserId(userId);
-        log.debug(MODIFIER_ID_IS, userId);
-
-        Response response;
-
-        try {
-            String serviceIdLower = serviceId.toLowerCase();
-
-            Either<UIConstraint, ResponseFormat> convertResponse = parseToConstraint(data, modifier);
-            if (convertResponse.isRight()) {
-                log.debug(FAILED_TO_PARSE_SERVICE);
-                response = buildErrorResponse(convertResponse.right().value());
-                return response;
-            }
-            UIConstraint uiConstraint = convertResponse.left().value();
-            if (uiConstraint == null) {
-                log.debug(FAILED_TO_PARSE_SERVICE);
-                response = buildErrorResponse(convertResponse.right().value());
-                return response;
-            }
-            Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
-            String constraint = new ConstraintConvertor().convert(uiConstraint);
-            actionResponse = serviceBusinessLogic
-                                     .addOrDeleteServiceFilter(serviceIdLower, ciId, NodeFilterConstraintAction.ADD, uiConstraint.getServicePropertyName(),
-                                             constraint, -1, modifier, true);
-
-            if (actionResponse.isRight()) {
-                log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
-                response = buildErrorResponse(actionResponse.right().value());
-                return response;
-            }
-
-            CINodeFilterDataDefinition value = actionResponse.left().value();
-            UINodeFilter nodeFilter = new NodeFilterConverter().convertToUi(value);
-            return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), nodeFilter);
-
-        } catch (Exception e) {
-            BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION_OR_UPDATE);
-            log.debug(CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
-            response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
-            return response;
-
-        }
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("/")
-    @Operation(description = "Update Service Filter Constraint", method = "PUT",
-            summary = "Update Service Filter Constraint", responses = {
-            @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
-            @ApiResponse(responseCode = "201", description = "Create Service Filter"),
-            @ApiResponse(responseCode = "403", description = "Restricted operation"),
-            @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
-    @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
-    public Response updateServiceFilterConstraint(@Parameter(description = "Service data", required = true) String data,
-            @Parameter(description = "Service Id") @PathParam("serviceId") String serviceId,
-            @Parameter(description = "Resource Instance Id") @PathParam("resourceInstanceId") String ciId,
-            @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
-        ServletContext context = request.getSession().getServletContext();
-        String url = request.getMethod() + " " + request.getRequestURI();
-        log.debug(START_HANDLE_REQUEST_OF, url);
-
-        User modifier = new User();
-        modifier.setUserId(userId);
-        log.debug(MODIFIER_ID_IS, userId);
-
-        Response response;
-
-        try {
-            String serviceIdLower = serviceId.toLowerCase();
-
-            Either<List, ResponseFormat> convertResponse = parseToConstraints(data, modifier);
-            if (convertResponse.isRight()) {
-                log.debug(FAILED_TO_PARSE_SERVICE);
-                response = buildErrorResponse(convertResponse.right().value());
-                return response;
-            }
-            List<Map<String,String>> uiConstraintsMaps = (List<Map<String,String>>) convertResponse.left().value();
-            if (uiConstraintsMaps == null) {
-                log.debug("failed to parse data");
-                response = buildErrorResponse(convertResponse.right().value());
-                return response;
-            }
-            final ObjectMapper objectMapper = new ObjectMapper();
-            List<UIConstraint> uiConstraints = uiConstraintsMaps.stream().map(dataMap -> objectMapper.convertValue(dataMap, UIConstraint.class)).collect(
-                    Collectors.toList());
-            if (uiConstraints == null) {
-                log.debug("failed to parse data");
-                response = buildErrorResponse(convertResponse.right().value());
-                return response;
-            }
-            Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
-            List<String> constraints = new ConstraintConvertor().convertToList(uiConstraints);
-            actionResponse = serviceBusinessLogic.updateServiceFilter(serviceIdLower, ciId, constraints, modifier, true);
-
-            if (actionResponse.isRight()) {
-                log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
-                response = buildErrorResponse(actionResponse.right().value());
-                return response;
-            }
-
-            CINodeFilterDataDefinition value = actionResponse.left().value();
-            return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
-                    new NodeFilterConverter().convertToUi(value));
-
-        } catch (Exception e) {
-            BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION_OR_UPDATE);
-            log.debug(CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
-            response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
-            return response;
-
-        }
-    }
-
-    @DELETE
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("/{constraintIndex}")
-    @Operation(description = "Delete Service Filter Constraint", method = "Delete",
-            summary = "Delete Service Filter Constraint", responses = {
-            @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))),
-            @ApiResponse(responseCode = "201", description = "Delete Service Filter Constraint"),
-            @ApiResponse(responseCode = "403", description = "Restricted operation"),
-            @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
-    @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
-    public Response deleteServiceFilterConstraint(
-            @Parameter(description = "Service Id") @PathParam("serviceId") String serviceId,
-            @Parameter(description = "Resource Instance Id") @PathParam("resourceInstanceId") String ciId,
-            @Parameter(description = "Constraint Index") @PathParam("constraintIndex") int index,
-            @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
-        String url = request.getMethod() + " " + request.getRequestURI();
-        log.debug(START_HANDLE_REQUEST_OF, url);
-
-        User modifier = new User();
-        modifier.setUserId(userId);
-        log.debug(MODIFIER_ID_IS, userId);
-
-        Response response;
-
-        try {
-            String serviceIdLower = serviceId.toLowerCase();
-
-            Either<CINodeFilterDataDefinition, ResponseFormat> actionResponse;
-            actionResponse = serviceBusinessLogic
-                                     .addOrDeleteServiceFilter(serviceIdLower, ciId, NodeFilterConstraintAction.DELETE,
-                                             null, null,  index, modifier, true);
-
-            if (actionResponse.isRight()) {
-
-                log.debug(FAILED_TO_UPDATE_OR_CREATE_NODE_FILTER);
-                response = buildErrorResponse(actionResponse.right().value());
-                return response;
-            }
-
-            final CINodeFilterDataDefinition value = actionResponse.left().value();
-            return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
-                    new NodeFilterConverter().convertToUi(value));
-
-        } catch (Exception e) {
-            BeEcompErrorManager.getInstance().logBeRestApiGeneralError(NODE_FILTER_CREATION_OR_UPDATE);
-            log.debug(CREATE_OR_UPDATE_NODE_FILTER_WITH_AN_ERROR, e);
-            response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
-            return response;
-
-        }
-    }
-
-    private Either<UIConstraint, ResponseFormat> parseToConstraint(String serviceJson, User user) {
-        return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, UIConstraint.class,
-                AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);
-    }
-
-    private Either<List, ResponseFormat> parseToConstraints(String serviceJson, User user) {
-        return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, List.class,
-                AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);
-    }
-}
index 1b8fd42..d5fe4f1 100644 (file)
  */
 package org.openecomp.sdc.be.components;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
 import com.google.common.collect.Sets;
 import fj.data.Either;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.ServletContext;
 import org.junit.Before;
 import org.mockito.Mockito;
 import org.openecomp.sdc.ElementOperationMock;
@@ -36,7 +44,6 @@ import org.openecomp.sdc.be.components.impl.ServiceBusinessLogicTest;
 import org.openecomp.sdc.be.components.impl.generic.GenericTypeBusinessLogic;
 import org.openecomp.sdc.be.components.path.ForwardingPathValidator;
 import org.openecomp.sdc.be.components.utils.ComponentBusinessLogicMock;
-import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
 import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao;
@@ -57,7 +64,6 @@ import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.be.model.category.CategoryDefinition;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ForwardingPathOperation;
-import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
@@ -73,15 +79,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.context.WebApplicationContext;
 
-import javax.servlet.ServletContext;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
-
 public abstract class BaseServiceBusinessLogicTest extends ComponentBusinessLogicMock {
     private static final Logger log = LoggerFactory.getLogger(ServiceBusinessLogicTest.class);
     private static final String SERVICE_CATEGORY = "Mobility";
@@ -94,8 +91,6 @@ public abstract class BaseServiceBusinessLogicTest extends ComponentBusinessLogi
     protected final ServiceDistributionValidation serviceDistributionValidation = Mockito.mock(ServiceDistributionValidation.class);
     protected final ForwardingPathValidator forwardingPathValidator = Mockito.mock(ForwardingPathValidator.class);
     protected final UiComponentDataConverter uiComponentDataConverter = Mockito.mock(UiComponentDataConverter.class);
-    protected final NodeFilterOperation serviceFilterOperation = Mockito.mock(NodeFilterOperation.class);
-    protected final NodeFilterValidator serviceFilterValidator = Mockito.mock(NodeFilterValidator.class);
     private ServiceBusinessLogic bl;
     private ResponseFormatManager responseManager = null;
     private IElementOperation mockElementDao;
@@ -173,7 +168,7 @@ public abstract class BaseServiceBusinessLogicTest extends ComponentBusinessLogi
             groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation,
             artifactsBusinessLogic, distributionEngine, componentInstanceBusinessLogic,
             serviceDistributionValidation, forwardingPathValidator, uiComponentDataConverter,
-            serviceFilterOperation, serviceFilterValidator, artifactToscaOperation, componentContactIdValidator, componentNameValidator,
+            artifactToscaOperation, componentContactIdValidator, componentNameValidator,
             componentTagsValidator, componentValidator, componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator);
         bl.setUserAdmin(mockUserAdmin);
         bl.setGraphLockOperation(graphLockOperation);
index 5c13564..68fa486 100644 (file)
  */
 package org.openecomp.sdc.be.components;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
 import fj.data.Either;
 import org.junit.Before;
 import org.junit.Test;
@@ -37,7 +43,6 @@ import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
 import org.openecomp.sdc.be.components.path.ForwardingPathValidator;
 import org.openecomp.sdc.be.components.utils.ComponentBusinessLogicMock;
-import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
 import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.datamodel.utils.UiComponentDataConverter;
@@ -47,18 +52,11 @@ import org.openecomp.sdc.be.model.ComponentParametersView;
 import org.openecomp.sdc.be.model.DistributionStatusEnum;
 import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.common.impl.ExternalConfiguration;
 import org.openecomp.sdc.common.util.ThreadLocalsHolder;
 import org.openecomp.sdc.exception.ResponseFormat;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.when;
-
 /**
  * Created by chaya on 10/26/2017.
  */
@@ -71,8 +69,6 @@ public class ServiceDistributionBLTest extends ComponentBusinessLogicMock {
     private final ComponentInstanceBusinessLogic componentInstanceBusinessLogic = Mockito.mock(ComponentInstanceBusinessLogic.class);
     private final ForwardingPathValidator forwardingPathValidator = Mockito.mock(ForwardingPathValidator.class);
     private final UiComponentDataConverter uiComponentDataConverter = Mockito.mock(UiComponentDataConverter.class);
-    private final NodeFilterOperation serviceFilterOperation = Mockito.mock(NodeFilterOperation.class);
-    private final NodeFilterValidator serviceFilterValidator = Mockito.mock(NodeFilterValidator.class);
 
 
     @InjectMocks
@@ -80,7 +76,7 @@ public class ServiceDistributionBLTest extends ComponentBusinessLogicMock {
         groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation,
         artifactsBusinessLogic, distributionEngine, componentInstanceBusinessLogic,
         serviceDistributionValidation, forwardingPathValidator, uiComponentDataConverter,
-        serviceFilterOperation, serviceFilterValidator, artifactToscaOperation, componentContactIdValidator,
+        artifactToscaOperation, componentContactIdValidator,
         componentNameValidator, componentTagsValidator, componentValidator, componentIconValidator,
         componentProjectCodeValidator, componentDescriptionValidator);
 
index b812fd9..a4a3b4d 100644 (file)
 
 package org.openecomp.sdc.be.components.impl;
 
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
 import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import javax.servlet.ServletContext;
 import org.junit.Before;
 import org.mockito.Mockito;
 import org.openecomp.sdc.ElementOperationMock;
@@ -29,7 +39,6 @@ import org.openecomp.sdc.be.components.distribution.engine.DistributionEngine;
 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.components.impl.generic.GenericTypeBusinessLogic;
 import org.openecomp.sdc.be.components.path.ForwardingPathValidator;
-import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
 import org.openecomp.sdc.be.components.validation.ServiceDistributionValidation;
 import org.openecomp.sdc.be.components.validation.UserValidations;
 import org.openecomp.sdc.be.components.validation.component.ComponentContactIdValidator;
@@ -65,7 +74,6 @@ import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.be.model.category.CategoryDefinition;
-import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
@@ -80,17 +88,6 @@ import org.openecomp.sdc.common.api.Constants;
 import org.openecomp.sdc.exception.ResponseFormat;
 import org.springframework.web.context.WebApplicationContext;
 
-import javax.servlet.ServletContext;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.when;
-
 public class ServiceBussinessLogicBaseTestSetup extends BaseBusinessLogicMock{
 
     protected ServiceBusinessLogic bl;
@@ -119,8 +116,6 @@ public class ServiceBussinessLogicBaseTestSetup extends BaseBusinessLogicMock{
     ComponentInstanceBusinessLogic componentInstanceBusinessLogic = Mockito.mock(ComponentInstanceBusinessLogic.class);
     ForwardingPathValidator forwardingPathValidator = Mockito.mock(ForwardingPathValidator.class);
     UiComponentDataConverter uiComponentDataConverter = Mockito.mock(UiComponentDataConverter.class);
-    protected final NodeFilterOperation serviceFilterOperation = Mockito.mock(NodeFilterOperation.class);
-    protected final NodeFilterValidator serviceFilterValidator = Mockito.mock(NodeFilterValidator.class);
     protected ServiceTypeValidator serviceTypeValidator = new ServiceTypeValidator(componentsUtils);
     protected ServiceCategoryValidator serviceCategoryValidator = new ServiceCategoryValidator(componentsUtils, mockElementDao);
     protected ServiceRoleValidator serviceRoleValidator = new ServiceRoleValidator(componentsUtils);
@@ -135,9 +130,6 @@ public class ServiceBussinessLogicBaseTestSetup extends BaseBusinessLogicMock{
     protected final ComponentValidator componentValidator = Mockito.mock(ComponentValidator.class);
     protected ServiceValidator serviceValidator = createServiceValidator();
 
-
-
-
     protected User user = null;
     protected Resource genericService = null;
 
@@ -218,7 +210,7 @@ public class ServiceBussinessLogicBaseTestSetup extends BaseBusinessLogicMock{
                 groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation,
                 artifactBl, distributionEngine, componentInstanceBusinessLogic,
                 serviceDistributionValidation, forwardingPathValidator, uiComponentDataConverter,
-                serviceFilterOperation, serviceFilterValidator, artifactToscaOperation, componentContactIdValidator,
+                artifactToscaOperation, componentContactIdValidator,
                 componentNameValidator, componentTagsValidator, componentValidator,
                 componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator);
         bl.setComponentContactIdValidator(componentContactIdValidator);
index f5b558e..d801314 100644 (file)
 
 package org.openecomp.sdc.be.servlets;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.when;
+import static org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum.SERVICE_PARAM_NAME;
+
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.eclipse.jetty.http.HttpStatus;
 import org.glassfish.hk2.utilities.binding.AbstractBinder;
 import org.glassfish.jersey.server.ResourceConfig;
@@ -33,6 +52,7 @@ import org.junit.Test;
 import org.mockito.ArgumentMatchers;
 import org.mockito.Mockito;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ComponentNodeFilterBusinessLogic;
 import org.openecomp.sdc.be.components.impl.GroupBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceImportManager;
 import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
@@ -55,26 +75,6 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import org.springframework.web.context.WebApplicationContext;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.when;
-import static org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum.SERVICE_PARAM_NAME;
-
 /**
  * The test suite designed for test functionality of ComponentInstanceServlet class
  */
@@ -94,6 +94,7 @@ public class ComponentInstanceServletTest extends JerseyTest {
     private static GroupBusinessLogic groupBusinessLogic;
     private static ResourceImportManager resourceImportManager;
     private static ServiceBusinessLogic serviceBusinessLogic;
+    private static ComponentNodeFilterBusinessLogic componentNodeFilterBusinessLogic;
 
     @BeforeClass
     public static void setup() {
@@ -261,6 +262,7 @@ public class ComponentInstanceServletTest extends JerseyTest {
                         bind(servletUtils).to(ServletUtils.class);
                         bind(resourceImportManager).to(ResourceImportManager.class);
                         bind(serviceBusinessLogic).to(ServiceBusinessLogic.class);
+                        bind(componentNodeFilterBusinessLogic).to(ComponentNodeFilterBusinessLogic.class);
                     }
                 })
                 .property("contextConfig", context);
@@ -280,6 +282,7 @@ public class ComponentInstanceServletTest extends JerseyTest {
         servletUtils = Mockito.mock(ServletUtils.class);
         responseFormat = Mockito.mock(ResponseFormat.class);
         serviceBusinessLogic = Mockito.mock(ServiceBusinessLogic.class);
+        componentNodeFilterBusinessLogic = Mockito.mock(ComponentNodeFilterBusinessLogic.class);
     }
 
     private static void stubMethods() {
index 13ad534..7ed7818 100644 (file)
@@ -26,7 +26,6 @@ import fj.data.Either;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
-
 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
@@ -36,7 +35,7 @@ import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
-import org.openecomp.sdc.be.model.Service;
+import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
@@ -47,23 +46,21 @@ public class NodeFilterOperation extends BaseOperation {
 
     private static Logger logger = Logger.getLogger(NodeFilterOperation.class);
 
-    public Either<Set<String>, StorageOperationStatus> deleteNodeFilters(Service service,
-            Set<String> componentInstanceIds) {
-        Either<GraphVertex, JanusGraphOperationStatus> getComponentVertex;
-        Either<GraphVertex, JanusGraphOperationStatus> getNodeFilterVertex;
+    public Either<Set<String>, StorageOperationStatus> deleteNodeFilters(final Component component,
+                                                                         final Set<String> componentInstanceIds) {
+        final Either<GraphVertex, JanusGraphOperationStatus> getComponentVertex;
+        final Either<GraphVertex, JanusGraphOperationStatus> getNodeFilterVertex;
         StorageOperationStatus status;
 
-        getComponentVertex = janusGraphDao.getVertexById(service.getUniqueId(), JsonParseFlagEnum.NoParse);
+        getComponentVertex = janusGraphDao.getVertexById(component.getUniqueId(), JsonParseFlagEnum.NoParse);
         if (getComponentVertex.isRight()) {
             return Either.right(
                     DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getComponentVertex.right().value()));
         }
-
-        getNodeFilterVertex =
-                janusGraphDao.getChildVertex(getComponentVertex.left().value(), EdgeLabelEnum.NODE_FILTER_TEMPLATE,
-                        JsonParseFlagEnum.NoParse);
+        getNodeFilterVertex = janusGraphDao.getChildVertex(getComponentVertex.left().value(),
+            EdgeLabelEnum.NODE_FILTER_TEMPLATE, JsonParseFlagEnum.NoParse);
         if (getNodeFilterVertex.isLeft()) {
-            status = deleteToscaDataElements(service.getUniqueId(), EdgeLabelEnum.NODE_FILTER_TEMPLATE,
+            status = deleteToscaDataElements(component.getUniqueId(), EdgeLabelEnum.NODE_FILTER_TEMPLATE,
                     new ArrayList<>(componentInstanceIds));
             if (status != StorageOperationStatus.OK) {
                 return Either.right(status);
@@ -74,9 +71,10 @@ public class NodeFilterOperation extends BaseOperation {
     }
 
 
-    public Either<String, StorageOperationStatus> deleteNodeFilter(Service service, String componentInstanceId) {
+    public Either<String, StorageOperationStatus> deleteNodeFilter(final Component component,
+                                                                   final String componentInstanceId) {
         final Either<Set<String>, StorageOperationStatus> listStorageOperationStatusEither =
-                deleteNodeFilters(service, ImmutableSet.of(componentInstanceId));
+                deleteNodeFilters(component, ImmutableSet.of(componentInstanceId));
         if (listStorageOperationStatusEither.isRight()) {
             return Either.right(listStorageOperationStatusEither.right().value());
         }
index 833f6f3..f093143 100644 (file)
@@ -15,7 +15,7 @@
     </span>
   </div>
 
-  <div class="i-sdc-designer-sidebar-section-content-item-rules-section" *ngIf="isDependent && isServiceProxy()">
+  <div class="i-sdc-designer-sidebar-section-content-item-rules-section" *ngIf="isDependent">
 
     <div class="i-sdc-designer-sidebar-section-content-item-rule" [ngClass]="{'hand': !readonly}"
          *ngFor="let rule of rulesList; let i = index">
index f3fd363..4957824 100644 (file)
@@ -315,7 +315,8 @@ export class ServiceDependenciesComponent {
         this.topologyTemplateService.createServiceFilterConstraints(
             this.compositeService.uniqueId,
             this.currentServiceInstance.uniqueId,
-            newRuleToCreate
+            newRuleToCreate,
+            this.compositeService.componentType
         ).subscribe( (response) => {
             this.updateRulesListEvent.emit(response.properties);
             this.isLoading = false;
@@ -331,7 +332,8 @@ export class ServiceDependenciesComponent {
         this.topologyTemplateService.updateServiceFilterConstraints(
             this.compositeService.uniqueId,
             this.currentServiceInstance.uniqueId,
-            allRulesToUpdate
+            allRulesToUpdate,
+            this.compositeService.componentType
         ).subscribe((response) => {
             this.updateRulesListEvent.emit(response.properties);
             this.isLoading = false;
@@ -354,7 +356,8 @@ export class ServiceDependenciesComponent {
         this.topologyTemplateService.deleteServiceFilterConstraints(
             this.compositeService.uniqueId,
             this.currentServiceInstance.uniqueId,
-            index
+            index,
+            this.compositeService.componentType
         ).subscribe( (response) => {
             this.updateRulesListEvent.emit(response.properties);
             this.isLoading = false;
index 6d19ed8..095c8d6 100644 (file)
@@ -384,16 +384,16 @@ export class TopologyTemplateService {
         return this.getComponentDataByFieldsName(componentType, componentId, [COMPONENT_FIELDS.COMPONENT_INSTANCES_PROPERTIES]);
     }
 
-    createServiceFilterConstraints(componentMetaDataId: string, componentInstanceId: string, constraint: ConstraintObject): Observable<any> {
-        return this.http.post<any>(this.baseUrl + 'services/' + componentMetaDataId + '/resourceInstances/' + componentInstanceId + '/nodeFilter', constraint);
+    createServiceFilterConstraints(componentMetaDataId: string, componentInstanceId: string, constraint: ConstraintObject, componentType: string): Observable<any> {
+        return this.http.post<any>(this.baseUrl + this.getServerTypeUrl(componentType) + componentMetaDataId + '/resourceInstances/' + componentInstanceId + '/nodeFilter', constraint);
     }
 
-    updateServiceFilterConstraints(componentMetaDataId: string, componentInstanceId: string, constraints: ConstraintObject[]):Observable<any> {
-        return this.http.put<any>(this.baseUrl + 'services/' + componentMetaDataId + '/resourceInstances/' + componentInstanceId + '/nodeFilter', constraints)
+    updateServiceFilterConstraints(componentMetaDataId: string, componentInstanceId: string, constraints: ConstraintObject[], componentType: string):Observable<any>{
+        return this.http.put<any>(this.baseUrl + this.getServerTypeUrl(componentType) + componentMetaDataId + '/resourceInstances/' + componentInstanceId + '/nodeFilter', constraints)
     }
 
-    deleteServiceFilterConstraints(componentMetaDataId: string, componentInstanceId: string, constraintIndex: number): Observable<any>{
-        return this.http.delete<any>(this.baseUrl + 'services/' + componentMetaDataId + '/resourceInstances/' + componentInstanceId + '/nodeFilter/' + constraintIndex)
+    deleteServiceFilterConstraints(componentMetaDataId: string, componentInstanceId: string, constraintIndex: number, componentType: string): Observable<any>{
+        return this.http.delete<any>(this.baseUrl + this.getServerTypeUrl(componentType) + componentMetaDataId + '/resourceInstances/' + componentInstanceId + '/nodeFilter/' + constraintIndex)
     }
 
     deletePolicy(component: Component, policy: PolicyInstance): Observable<PolicyInstance> {