Change to enable SDC list type input
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / property / PolicyPropertyDeclarator.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20 package org.openecomp.sdc.be.components.property;
21
22 import static org.openecomp.sdc.be.components.property.GetInputUtils.isGetInputValueForInput;
23
24 import fj.data.Either;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.List;
28 import java.util.Objects;
29 import java.util.Optional;
30 import java.util.stream.Collectors;
31 import org.apache.commons.collections.CollectionUtils;
32 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
33 import org.openecomp.sdc.be.impl.ComponentsUtils;
34 import org.openecomp.sdc.be.model.Component;
35 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
36 import org.openecomp.sdc.be.model.InputDefinition;
37 import org.openecomp.sdc.be.model.PolicyDefinition;
38 import org.openecomp.sdc.be.model.jsontitan.operations.PolicyOperation;
39 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
40 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
41 import org.openecomp.sdc.common.log.wrappers.Logger;
42
43 @org.springframework.stereotype.Component
44 public class PolicyPropertyDeclarator extends DefaultPropertyDeclarator<PolicyDefinition, PropertyDataDefinition> {
45
46     private static final Logger log = Logger.getLogger(PolicyPropertyDeclarator.class);
47     private PolicyOperation policyOperation;
48
49     public PolicyPropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation, PolicyOperation policyOperation) {
50         super(componentsUtils, propertyOperation);
51         this.policyOperation = policyOperation;
52     }
53
54     @Override
55     public PropertyDataDefinition createDeclaredProperty(PropertyDataDefinition prop) {
56         return new PropertyDataDefinition(prop);
57     }
58
59     @Override
60     public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String policyId, List<PropertyDataDefinition> properties) {
61         log.debug("#updatePropertiesValues - updating policies properties for policy {} on component {}", policyId, component.getUniqueId());
62         StorageOperationStatus updateStatus = policyOperation.updatePolicyProperties(component, policyId, properties);
63         return updateStatus == StorageOperationStatus.OK ? Either.left(updateStatus) : Either.right(updateStatus);
64     }
65
66     @Override
67     public Optional<PolicyDefinition> resolvePropertiesOwner(Component component, String policyId) {
68         log.debug("#resolvePropertiesOwner - fetching policy {} of component {}", policyId, component.getUniqueId());
69         return Optional.ofNullable(component.getPolicyById(policyId));
70     }
71
72     @Override
73     public void addPropertiesListToInput(PropertyDataDefinition declaredProp, InputDefinition input) {
74         List<ComponentInstanceProperty> propertiesList = input.getProperties();
75         if(propertiesList == null) {
76             propertiesList = new ArrayList<>(); // adding the property with the new value for UI
77         }
78         propertiesList.add(new ComponentInstanceProperty(declaredProp));
79         input.setProperties(propertiesList);
80
81     }
82
83     @Override
84     public StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition inputForDelete) {
85         return getPolicyPropertiesDeclaredAsInput(component, inputForDelete.getUniqueId())
86                 .map(policyProperties -> unDeclarePolicyProperties(component, inputForDelete, policyProperties))
87                 .orElse(StorageOperationStatus.OK);
88     }
89
90     @Override
91     public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition inputForDelete) {
92         return getPolicyPropertiesDeclaredAsInput(component, inputForDelete.getUniqueId())
93                 .map(policyProperties -> unDeclarePolicyProperties(component, inputForDelete, policyProperties))
94                 .orElse(StorageOperationStatus.OK);
95     }
96
97     private StorageOperationStatus unDeclarePolicyProperties(Component container, InputDefinition input, PolicyProperties policyProperties) {
98         String policyId = policyProperties.getPolicyId();
99         List<PropertyDataDefinition> propsDeclaredAsInput = policyProperties.getProperties();
100         propsDeclaredAsInput.forEach(policyProp -> prepareValueBeforeDelete(input, policyProp, Collections.emptyList()));
101         return policyOperation.updatePolicyProperties(container, policyId, propsDeclaredAsInput);
102     }
103
104     private Optional<PolicyProperties> getPolicyPropertiesDeclaredAsInput(Component container, String inputId) {
105         if (container.getPolicies() == null) {
106             return Optional.empty();
107         }
108         return container.getPolicies()
109                 .values()
110                 .stream()
111                 .filter(policy -> Objects.nonNull(policy.getProperties()))
112                 .map(policy -> getPolicyPropertiesDeclaredAsInput(policy, inputId))
113                 .filter(PolicyProperties::isNotEmpty)
114                 .findFirst();
115     }
116
117     private boolean isPropertyDeclaredAsInputByInputId(PropertyDataDefinition property, String inputId) {
118         if (CollectionUtils.isEmpty(property.getGetInputValues())) {
119             return false;
120         }
121         return property.getGetInputValues().stream()
122                 .filter(Objects::nonNull)
123                 .anyMatch(getInputVal -> isGetInputValueForInput(getInputVal, inputId));
124     }
125
126     private PolicyProperties getPolicyPropertiesDeclaredAsInput(PolicyDefinition policy, String inputId) {
127         List<PropertyDataDefinition> collect = policy.getProperties()
128                 .stream()
129                 .filter(prop -> isPropertyDeclaredAsInputByInputId(prop, inputId))
130                 .collect(Collectors.toList());
131         return new PolicyProperties(policy.getUniqueId(), collect);
132
133     }
134
135     private class PolicyProperties {
136         private String policyId;
137         private List<PropertyDataDefinition> properties;
138
139         PolicyProperties(String policyId, List<PropertyDataDefinition> properties) {
140             this.policyId = policyId;
141             this.properties = (properties == null)? null : new ArrayList<>(properties);
142         }
143
144         String getPolicyId() {
145             return policyId;
146         }
147
148         public List<PropertyDataDefinition> getProperties() {
149             return new ArrayList<>(properties);
150         }
151
152         boolean isNotEmpty() {
153             return CollectionUtils.isNotEmpty(properties);
154         }
155     }
156 }