aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentPropertyToPolicyDeclarator.java
blob: 362f80ff1fb79e537e9f461c43f17bab67bb2968 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package org.openecomp.sdc.be.components.property.propertytopolicydeclarators;

import fj.data.Either;
import java.util.List;
import java.util.Optional;
import org.apache.commons.collections4.CollectionUtils;
import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic;
import org.openecomp.sdc.be.components.property.DefaultPropertyDeclarator;
import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
import org.openecomp.sdc.be.impl.ComponentsUtils;
import org.openecomp.sdc.be.model.Component;
import org.openecomp.sdc.be.model.InputDefinition;
import org.openecomp.sdc.be.model.PolicyDefinition;
import org.openecomp.sdc.be.model.PropertyDefinition;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;

@org.springframework.stereotype.Component
public class ComponentPropertyToPolicyDeclarator extends DefaultPropertyDeclarator<Component, PropertyDataDefinition> {

    private ToscaOperationFacade toscaOperationFacade;
    PropertyBusinessLogic propertyBL;


    public ComponentPropertyToPolicyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation,
            ToscaOperationFacade toscaOperationFacade, PropertyBusinessLogic propertyBusinessLogic) {
        super(componentsUtils, propertyOperation);
        this.toscaOperationFacade = toscaOperationFacade;
        this.propertyBL = propertyBusinessLogic;
    }

    @Override
    public PropertyDataDefinition createDeclaredProperty(PropertyDataDefinition prop) {
        return new PropertyDataDefinition(prop);
    }

    @Override
    public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String policyId,
            List<PropertyDataDefinition> properties) {
        if(CollectionUtils.isNotEmpty(properties)) {
            for(PropertyDataDefinition property : properties) {
                Either<PropertyDefinition, StorageOperationStatus>
                        storageStatus = toscaOperationFacade
                                                .updatePropertyOfComponent(component, new PropertyDefinition(property));
                if(storageStatus.isRight()) {
                    return Either.right(storageStatus.right().value());
                }
            }
        }
        return Either.left(properties);

    }

    @Override
    public Optional<Component> resolvePropertiesOwner(Component component, String propertyId) {
        return Optional.of(component);
    }

    @Override
    public StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition input) {
        // no need for implementation since we are in a policy scenario
        return StorageOperationStatus.OK;
    }

    @Override
    public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition input) {
        // no need for implementation since we are in a policy scenario
        return StorageOperationStatus.OK;
    }

    @Override
    public void addPropertiesListToInput(PropertyDataDefinition declaredProp, InputDefinition input) {
        // no need for implementation since we are in a policy scenario
    }

    @Override
    public StorageOperationStatus unDeclarePropertiesAsPolicies(Component component, PolicyDefinition policy) {
        Optional<PropertyDefinition> propertyToUpdateCandidate =
                getDeclaredPropertyByPolicyId(component, policy.getUniqueId());

        if(propertyToUpdateCandidate.isPresent()) {
            return unDeclarePolicy(component, propertyToUpdateCandidate.get(), policy);
        }

        return StorageOperationStatus.OK;
    }

    private StorageOperationStatus unDeclarePolicy(Component component, PropertyDefinition propertyToUpdate, PolicyDefinition policy) {
        updatePropertyAfterUndeclaration(propertyToUpdate, policy);

        Either<PropertyDefinition, StorageOperationStatus> status = toscaOperationFacade
                                                                            .updatePropertyOfComponent(component, propertyToUpdate);
        if(status.isRight()) {
            return status.right().value();
        }

        return StorageOperationStatus.OK;
    }

    private void updatePropertyAfterUndeclaration(PropertyDefinition propertyToUpdate, PolicyDefinition policy) {
        List<GetPolicyValueDataDefinition> getPolicyValues = propertyToUpdate.getGetPolicyValues();
        Optional<GetPolicyValueDataDefinition> getPolicyCandidateToRemove = getPolicyValues.stream()
                                                                                    .filter(getPolicyValue -> getPolicyValue.getPolicyId()
                                                                                                                      .equals(policy.getUniqueId()))
                                                                                    .findAny();

        getPolicyCandidateToRemove.ifPresent(getPolicyValue -> {
            getPolicyValues.remove(getPolicyValue);
            propertyToUpdate.setValue(getPolicyValue.getOrigPropertyValue());
        });
    }

    private Optional<PropertyDefinition> getDeclaredPropertyByPolicyId(Component component,
            String policyId) {
        List<PropertyDefinition> properties = component.getProperties();

        if(CollectionUtils.isEmpty(properties)) {
            return Optional.empty();
        }

        for(PropertyDefinition propertyDefinition : properties) {
            List<GetPolicyValueDataDefinition> getPolicyValues = propertyDefinition.getGetPolicyValues();
            if(CollectionUtils.isEmpty(getPolicyValues)) {
                continue;
            }


            Optional<GetPolicyValueDataDefinition> getPolicyCandidate =
                    getPolicyValues.stream().filter(getPolicy -> getPolicy.getPolicyId().equals(policyId)).findAny();

            if(getPolicyCandidate.isPresent()) {
                propertyDefinition.setValue(getPolicyCandidate.get().getOrigPropertyValue());
                return Optional.of(propertyDefinition);
            }
        }

        return Optional.empty();
    }

}