Sync Integ to Master
[sdc.git] / catalog-model / src / main / java / org / openecomp / sdc / be / model / jsontitan / operations / PolicyOperation.java
1 package org.openecomp.sdc.be.model.jsontitan.operations;
2
3 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
4 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
5 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
6 import org.openecomp.sdc.be.dao.utils.MapUtil;
7 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
8 import org.openecomp.sdc.be.model.Component;
9 import org.openecomp.sdc.be.model.PolicyDefinition;
10 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
11 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
14
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.Map;
18
19 @org.springframework.stereotype.Component
20 public class PolicyOperation {
21
22     private static final Logger log = LoggerFactory.getLogger(PolicyOperation.class);
23     private TopologyTemplateOperation topologyTemplateOperation;
24     private TitanDao titanDao;
25
26     public PolicyOperation(TopologyTemplateOperation topologyTemplateOperation, TitanDao titanDao) {
27         this.topologyTemplateOperation = topologyTemplateOperation;
28         this.titanDao = titanDao;
29     }
30
31     /**
32      * updates a list of policy properties by overriding the existing ones with the same name
33      * @param containerComponent the container of the policy of which its properties are to be updated
34      * @param policyId the id of the policy of which its properties are to be updated
35      * @param propertiesToUpdate the policy properties to update
36      * @return the update operation status
37      */
38     public StorageOperationStatus updatePolicyProperties(Component containerComponent, String policyId, List<PropertyDataDefinition> propertiesToUpdate) {
39         log.debug("#updatePolicyProperties - updating the properties of policy {} in component {}", policyId, containerComponent.getUniqueId());
40         PolicyDefinition policy = containerComponent.getPolicyById(policyId);
41         return titanDao.getVertexById(containerComponent.getUniqueId(), JsonParseFlagEnum.NoParse)
42                 .either(containerVertex -> updatePolicyProperties(containerVertex, policy, propertiesToUpdate),
43                         DaoStatusConverter::convertTitanStatusToStorageStatus);
44     }
45
46     private StorageOperationStatus updatePolicyProperties(GraphVertex container, PolicyDefinition policy, List<PropertyDataDefinition> propertiesToUpdate) {
47         List<PropertyDataDefinition> policyProperties = policy.getProperties();
48         List<PropertyDataDefinition> updatedPolicyProperties = updatePolicyProperties(policyProperties, propertiesToUpdate);
49         policy.setProperties(updatedPolicyProperties);
50         return topologyTemplateOperation.updatePolicyOfToscaElement(container, policy);
51     }
52
53     private List<PropertyDataDefinition> updatePolicyProperties(List<PropertyDataDefinition> currentPolicyProperties, List<PropertyDataDefinition> toBeUpdatedProperties) {
54         Map<String, PropertyDataDefinition> currPropsByName = MapUtil.toMap(currentPolicyProperties, PropertyDataDefinition::getName);
55         overrideCurrentPropertiesWithUpdatedProperties(currPropsByName, toBeUpdatedProperties);
56         return new ArrayList<>(currPropsByName.values());
57     }
58
59     private void overrideCurrentPropertiesWithUpdatedProperties(Map<String, PropertyDataDefinition> currPropsByName, List<PropertyDataDefinition> toBeUpdatedProperties) {
60         toBeUpdatedProperties.forEach(prop -> currPropsByName.put(prop.getName(), prop));
61     }
62
63 }