1d737869380221c7ae4a64185304adc4d0a53510
[sdc.git] /
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 void addPropertiesListToInput(PropertyDataDefinition declaredProp, InputDefinition input) {
69         // no need for implementation since we are in a policy scenario
70         return;
71     }
72
73     @Override
74     public StorageOperationStatus unDeclarePropertiesAsPolicies(Component component, PolicyDefinition policy) {
75         Optional<PropertyDefinition> propertyToUpdateCandidate =
76                 getDeclaredPropertyByPolicyId(component, policy.getUniqueId());
77
78         if(propertyToUpdateCandidate.isPresent()) {
79             return unDeclarePolicy(component, propertyToUpdateCandidate.get(), policy);
80         }
81
82         return StorageOperationStatus.OK;
83     }
84
85     private StorageOperationStatus unDeclarePolicy(Component component, PropertyDefinition propertyToUpdate, PolicyDefinition policy) {
86         updatePropertyAfterUndeclaration(propertyToUpdate, policy);
87
88         Either<PropertyDefinition, StorageOperationStatus> status = toscaOperationFacade
89                                                                             .updatePropertyOfComponent(component, propertyToUpdate);
90         if(status.isRight()) {
91             return status.right().value();
92         }
93
94         return StorageOperationStatus.OK;
95     }
96
97     private void updatePropertyAfterUndeclaration(PropertyDefinition propertyToUpdate, PolicyDefinition policy) {
98         List<GetPolicyValueDataDefinition> getPolicyValues = propertyToUpdate.getGetPolicyValues();
99         Optional<GetPolicyValueDataDefinition> getPolicyCandidateToRemove = getPolicyValues.stream()
100                                                                                     .filter(getPolicyValue -> getPolicyValue.getPolicyId()
101                                                                                                                       .equals(policy.getUniqueId()))
102                                                                                     .findAny();
103
104         getPolicyCandidateToRemove.ifPresent(getPolicyValue -> {
105             getPolicyValues.remove(getPolicyValue);
106             propertyToUpdate.setValue(getPolicyValue.getOrigPropertyValue());
107         });
108     }
109
110     private Optional<PropertyDefinition> getDeclaredPropertyByPolicyId(Component component,
111             String policyId) {
112         List<PropertyDefinition> properties = component.getProperties();
113
114         if(CollectionUtils.isEmpty(properties)) {
115             return Optional.empty();
116         }
117
118         for(PropertyDefinition propertyDefinition : properties) {
119             List<GetPolicyValueDataDefinition> getPolicyValues = propertyDefinition.getGetPolicyValues();
120             if(CollectionUtils.isEmpty(getPolicyValues)) {
121                 continue;
122             }
123
124
125             Optional<GetPolicyValueDataDefinition> getPolicyCandidate =
126                     getPolicyValues.stream().filter(getPolicy -> getPolicy.getPolicyId().equals(policyId)).findAny();
127
128             if(getPolicyCandidate.isPresent()) {
129                 propertyDefinition.setValue(getPolicyCandidate.get().getOrigPropertyValue());
130                 return Optional.of(propertyDefinition);
131             }
132         }
133
134         return Optional.empty();
135     }
136
137 }