re base code
[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.openecomp.sdc.common.log.wrappers.Logger;
13
14 import java.util.ArrayList;
15 import java.util.List;
16 import java.util.Map;
17
18 @org.springframework.stereotype.Component
19 public class PolicyOperation {
20
21     private static final Logger log = Logger.getLogger(PolicyOperation.class.getName());
22     private TopologyTemplateOperation topologyTemplateOperation;
23     private TitanDao titanDao;
24
25     public PolicyOperation(TopologyTemplateOperation topologyTemplateOperation, TitanDao titanDao) {
26         this.topologyTemplateOperation = topologyTemplateOperation;
27         this.titanDao = titanDao;
28     }
29
30     /**
31      * updates a list of policy properties by overriding the existing ones with the same name
32      * @param containerComponent the container of the policy of which its properties are to be updated
33      * @param policyId the id of the policy of which its properties are to be updated
34      * @param propertiesToUpdate the policy properties to update
35      * @return the update operation status
36      */
37     public StorageOperationStatus updatePolicyProperties(Component containerComponent, String policyId, List<PropertyDataDefinition> propertiesToUpdate) {
38         log.debug("#updatePolicyProperties - updating the properties of policy {} in component {}", policyId, containerComponent.getUniqueId());
39         PolicyDefinition policy = containerComponent.getPolicyById(policyId);
40         return titanDao.getVertexById(containerComponent.getUniqueId(), JsonParseFlagEnum.NoParse)
41                 .either(containerVertex -> updatePolicyProperties(containerVertex, policy, propertiesToUpdate),
42                         DaoStatusConverter::convertTitanStatusToStorageStatus);
43     }
44
45     private StorageOperationStatus updatePolicyProperties(GraphVertex container, PolicyDefinition policy, List<PropertyDataDefinition> propertiesToUpdate) {
46         List<PropertyDataDefinition> policyProperties = policy.getProperties();
47         List<PropertyDataDefinition> updatedPolicyProperties = updatePolicyProperties(policyProperties, propertiesToUpdate);
48         policy.setProperties(updatedPolicyProperties);
49         return topologyTemplateOperation.updatePolicyOfToscaElement(container, policy);
50     }
51
52     private List<PropertyDataDefinition> updatePolicyProperties(List<PropertyDataDefinition> currentPolicyProperties, List<PropertyDataDefinition> toBeUpdatedProperties) {
53         Map<String, PropertyDataDefinition> currPropsByName = MapUtil.toMap(currentPolicyProperties, PropertyDataDefinition::getName);
54         overrideCurrentPropertiesWithUpdatedProperties(currPropsByName, toBeUpdatedProperties);
55         return new ArrayList<>(currPropsByName.values());
56     }
57
58     private void overrideCurrentPropertiesWithUpdatedProperties(Map<String, PropertyDataDefinition> currPropsByName, List<PropertyDataDefinition> toBeUpdatedProperties) {
59         toBeUpdatedProperties.forEach(prop -> currPropsByName.put(prop.getName(), prop));
60     }
61
62 }