2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
20 package org.openecomp.sdc.be.components.property;
22 import fj.data.Either;
23 import org.apache.commons.collections.CollectionUtils;
24 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
25 import org.openecomp.sdc.be.impl.ComponentsUtils;
26 import org.openecomp.sdc.be.model.Component;
27 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
28 import org.openecomp.sdc.be.model.InputDefinition;
29 import org.openecomp.sdc.be.model.PolicyDefinition;
30 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.PolicyOperation;
31 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
32 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
33 import org.openecomp.sdc.common.log.wrappers.Logger;
35 import java.util.ArrayList;
36 import java.util.Collections;
37 import java.util.List;
38 import java.util.Objects;
39 import java.util.Optional;
40 import java.util.stream.Collectors;
42 import static org.openecomp.sdc.be.components.property.GetInputUtils.isGetInputValueForInput;
44 @org.springframework.stereotype.Component
45 public class PolicyPropertyDeclarator extends DefaultPropertyDeclarator<PolicyDefinition, PropertyDataDefinition> {
47 private static final Logger log = Logger.getLogger(PolicyPropertyDeclarator.class);
48 private PolicyOperation policyOperation;
50 public PolicyPropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation, PolicyOperation policyOperation) {
51 super(componentsUtils, propertyOperation);
52 this.policyOperation = policyOperation;
56 public PropertyDataDefinition createDeclaredProperty(PropertyDataDefinition prop) {
57 return new PropertyDataDefinition(prop);
61 public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String policyId, List<PropertyDataDefinition> properties) {
62 log.debug("#updatePropertiesValues - updating policies properties for policy {} on component {}", policyId, component.getUniqueId());
63 StorageOperationStatus updateStatus = policyOperation.updatePolicyProperties(component, policyId, properties);
64 return updateStatus == StorageOperationStatus.OK ? Either.left(updateStatus) : Either.right(updateStatus);
68 public Optional<PolicyDefinition> resolvePropertiesOwner(Component component, String policyId) {
69 log.debug("#resolvePropertiesOwner - fetching policy {} of component {}", policyId, component.getUniqueId());
70 return Optional.ofNullable(component.getPolicyById(policyId));
74 public void addPropertiesListToInput(PropertyDataDefinition declaredProp, InputDefinition input) {
75 List<ComponentInstanceProperty> propertiesList = input.getProperties();
76 if(propertiesList == null) {
77 propertiesList = new ArrayList<>(); // adding the property with the new value for UI
79 propertiesList.add(new ComponentInstanceProperty(declaredProp));
80 input.setProperties(propertiesList);
85 public StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition inputForDelete) {
86 return getPolicyPropertiesDeclaredAsInput(component, inputForDelete.getUniqueId())
87 .map(policyProperties -> unDeclarePolicyProperties(component, inputForDelete, policyProperties))
88 .orElse(StorageOperationStatus.OK);
92 public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition inputForDelete) {
93 return getPolicyPropertiesDeclaredAsInput(component, inputForDelete.getUniqueId())
94 .map(policyProperties -> unDeclarePolicyProperties(component, inputForDelete, policyProperties))
95 .orElse(StorageOperationStatus.OK);
98 private StorageOperationStatus unDeclarePolicyProperties(Component container, InputDefinition input, PolicyProperties policyProperties) {
99 String policyId = policyProperties.getPolicyId();
100 List<PropertyDataDefinition> propsDeclaredAsInput = policyProperties.getProperties();
101 propsDeclaredAsInput.forEach(policyProp -> prepareValueBeforeDelete(input, policyProp, Collections.emptyList()));
102 return policyOperation.updatePolicyProperties(container, policyId, propsDeclaredAsInput);
105 private Optional<PolicyProperties> getPolicyPropertiesDeclaredAsInput(Component container, String inputId) {
106 if (container.getPolicies() == null) {
107 return Optional.empty();
109 return container.getPolicies()
112 .filter(policy -> Objects.nonNull(policy.getProperties()))
113 .map(policy -> getPolicyPropertiesDeclaredAsInput(policy, inputId))
114 .filter(PolicyProperties::isNotEmpty)
118 private boolean isPropertyDeclaredAsInputByInputId(PropertyDataDefinition property, String inputId) {
119 if (CollectionUtils.isEmpty(property.getGetInputValues())) {
122 return property.getGetInputValues().stream()
123 .filter(Objects::nonNull)
124 .anyMatch(getInputVal -> isGetInputValueForInput(getInputVal, inputId));
127 private PolicyProperties getPolicyPropertiesDeclaredAsInput(PolicyDefinition policy, String inputId) {
128 List<PropertyDataDefinition> collect = policy.getProperties()
130 .filter(prop -> isPropertyDeclaredAsInputByInputId(prop, inputId))
131 .collect(Collectors.toList());
132 return new PolicyProperties(policy.getUniqueId(), collect);
136 private class PolicyProperties {
137 private String policyId;
138 private List<PropertyDataDefinition> properties;
140 PolicyProperties(String policyId, List<PropertyDataDefinition> properties) {
141 this.policyId = policyId;
142 this.properties = (properties == null)? null : new ArrayList<>(properties);
145 String getPolicyId() {
149 public List<PropertyDataDefinition> getProperties() {
150 return new ArrayList<>(properties);
153 boolean isNotEmpty() {
154 return CollectionUtils.isNotEmpty(properties);