Change to enable SDC list type input
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / property / propertytopolicydeclarators / ComponentPropertyToPolicyDeclarator.java
1 package org.openecomp.sdc.be.components.property.propertytopolicydeclarators;
2
3 import fj.data.Either;
4 import java.util.List;
5 import java.util.Optional;
6 import org.apache.commons.collections4.CollectionUtils;
7 import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic;
8 import org.openecomp.sdc.be.components.property.DefaultPropertyDeclarator;
9 import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
10 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
11 import org.openecomp.sdc.be.impl.ComponentsUtils;
12 import org.openecomp.sdc.be.model.Component;
13 import org.openecomp.sdc.be.model.InputDefinition;
14 import org.openecomp.sdc.be.model.PolicyDefinition;
15 import org.openecomp.sdc.be.model.PropertyDefinition;
16 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
17 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
18 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
19
20 @org.springframework.stereotype.Component
21 public class ComponentPropertyToPolicyDeclarator extends DefaultPropertyDeclarator<Component, PropertyDataDefinition> {
22
23     private ToscaOperationFacade toscaOperationFacade;
24     PropertyBusinessLogic propertyBL;
25
26
27     public ComponentPropertyToPolicyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation,
28             ToscaOperationFacade toscaOperationFacade, PropertyBusinessLogic propertyBusinessLogic) {
29         super(componentsUtils, propertyOperation);
30         this.toscaOperationFacade = toscaOperationFacade;
31         this.propertyBL = propertyBusinessLogic;
32     }
33
34     @Override
35     public PropertyDataDefinition createDeclaredProperty(PropertyDataDefinition prop) {
36         return new PropertyDataDefinition(prop);
37     }
38
39     @Override
40     public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String policyId,
41             List<PropertyDataDefinition> properties) {
42         if(CollectionUtils.isNotEmpty(properties)) {
43             for(PropertyDataDefinition property : properties) {
44                 Either<PropertyDefinition, StorageOperationStatus>
45                         storageStatus = toscaOperationFacade
46                                                 .updatePropertyOfComponent(component, new PropertyDefinition(property));
47                 if(storageStatus.isRight()) {
48                     return Either.right(storageStatus.right().value());
49                 }
50             }
51         }
52         return Either.left(properties);
53
54     }
55
56     @Override
57     public Optional<Component> resolvePropertiesOwner(Component component, String propertyId) {
58         return Optional.of(component);
59     }
60
61     @Override
62     public StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition input) {
63         // no need for implementation since we are in a policy scenario
64         return StorageOperationStatus.OK;
65     }
66
67     @Override
68     public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition input) {
69         // no need for implementation since we are in a policy scenario
70         return StorageOperationStatus.OK;
71     }
72
73     @Override
74     public void addPropertiesListToInput(PropertyDataDefinition declaredProp, InputDefinition input) {
75         // no need for implementation since we are in a policy scenario
76     }
77
78     @Override
79     public StorageOperationStatus unDeclarePropertiesAsPolicies(Component component, PolicyDefinition policy) {
80         Optional<PropertyDefinition> propertyToUpdateCandidate =
81                 getDeclaredPropertyByPolicyId(component, policy.getUniqueId());
82
83         if(propertyToUpdateCandidate.isPresent()) {
84             return unDeclarePolicy(component, propertyToUpdateCandidate.get(), policy);
85         }
86
87         return StorageOperationStatus.OK;
88     }
89
90     private StorageOperationStatus unDeclarePolicy(Component component, PropertyDefinition propertyToUpdate, PolicyDefinition policy) {
91         updatePropertyAfterUndeclaration(propertyToUpdate, policy);
92
93         Either<PropertyDefinition, StorageOperationStatus> status = toscaOperationFacade
94                                                                             .updatePropertyOfComponent(component, propertyToUpdate);
95         if(status.isRight()) {
96             return status.right().value();
97         }
98
99         return StorageOperationStatus.OK;
100     }
101
102     private void updatePropertyAfterUndeclaration(PropertyDefinition propertyToUpdate, PolicyDefinition policy) {
103         List<GetPolicyValueDataDefinition> getPolicyValues = propertyToUpdate.getGetPolicyValues();
104         Optional<GetPolicyValueDataDefinition> getPolicyCandidateToRemove = getPolicyValues.stream()
105                                                                                     .filter(getPolicyValue -> getPolicyValue.getPolicyId()
106                                                                                                                       .equals(policy.getUniqueId()))
107                                                                                     .findAny();
108
109         getPolicyCandidateToRemove.ifPresent(getPolicyValue -> {
110             getPolicyValues.remove(getPolicyValue);
111             propertyToUpdate.setValue(getPolicyValue.getOrigPropertyValue());
112         });
113     }
114
115     private Optional<PropertyDefinition> getDeclaredPropertyByPolicyId(Component component,
116             String policyId) {
117         List<PropertyDefinition> properties = component.getProperties();
118
119         if(CollectionUtils.isEmpty(properties)) {
120             return Optional.empty();
121         }
122
123         for(PropertyDefinition propertyDefinition : properties) {
124             List<GetPolicyValueDataDefinition> getPolicyValues = propertyDefinition.getGetPolicyValues();
125             if(CollectionUtils.isEmpty(getPolicyValues)) {
126                 continue;
127             }
128
129
130             Optional<GetPolicyValueDataDefinition> getPolicyCandidate =
131                     getPolicyValues.stream().filter(getPolicy -> getPolicy.getPolicyId().equals(policyId)).findAny();
132
133             if(getPolicyCandidate.isPresent()) {
134                 propertyDefinition.setValue(getPolicyCandidate.get().getOrigPropertyValue());
135                 return Optional.of(propertyDefinition);
136             }
137         }
138
139         return Optional.empty();
140     }
141
142 }