Refactoring Consolidation Service
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / version / GroupMembersUpdateOperation.java
1 package org.openecomp.sdc.be.components.impl.version;
2
3 import static org.apache.commons.collections.CollectionUtils.isEmpty;
4
5 import java.util.List;
6 import java.util.Map;
7
8 import org.apache.commons.collections.MapUtils;
9 import org.openecomp.sdc.be.dao.api.ActionStatus;
10 import org.openecomp.sdc.be.impl.ComponentsUtils;
11 import org.openecomp.sdc.be.model.Component;
12 import org.openecomp.sdc.be.model.ComponentInstance;
13 import org.openecomp.sdc.be.model.GroupDefinition;
14 import org.openecomp.sdc.be.model.jsontitan.operations.GroupsOperation;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17 @org.springframework.stereotype.Component
18 public class GroupMembersUpdateOperation implements PostChangeVersionOperation {
19
20     private static final Logger log = LoggerFactory.getLogger(GroupMembersUpdateOperation.class);
21     private final GroupsOperation groupsOperation;
22     private final ComponentsUtils componentsUtils;
23
24     public GroupMembersUpdateOperation(GroupsOperation groupsOperation, ComponentsUtils componentsUtils) {
25         this.groupsOperation = groupsOperation;
26         this.componentsUtils = componentsUtils;
27     }
28
29     @Override
30     public ActionStatus onChangeVersion(Component container, ComponentInstance prevVersion, ComponentInstance newVersion) {
31         return updateGroupMembersOnChangeVersion(container, prevVersion, newVersion);
32     }
33
34     private ActionStatus updateGroupMembersOnChangeVersion(Component container, ComponentInstance prevVersion, ComponentInstance newVersion) {
35         log.debug("#updateGroupMembersOnChangeVersion - replacing all group members for component instance {} with new component instance.", prevVersion.getUniqueId(), newVersion.getUniqueId());
36         if (isEmpty(container.getGroups())) {
37             log.debug("#updateGroupMembersOnChangeVersion - container {} has no groups.", container.getUniqueId());
38             return ActionStatus.OK;
39         }
40         List<GroupDefinition> groupsWithPrevInstAsMember = container.resolveGroupsByMember(prevVersion.getUniqueId());
41         if (isEmpty(groupsWithPrevInstAsMember)) {
42             log.debug("#updateGroupMembersOnChangeVersion - container {} has no groups with component instance {} as member.", container.getUniqueId(), prevVersion.getUniqueId());
43             return ActionStatus.OK;
44         }
45         replacePrevInstanceMemberWithNewInstance(prevVersion, newVersion, groupsWithPrevInstAsMember);
46         return updateGroups(container, groupsWithPrevInstAsMember);
47     }
48
49     private ActionStatus updateGroups(Component container, List<GroupDefinition> groupsToUpdate) {
50         log.debug("#updateGroups - updating {} groups for container {}", groupsToUpdate.size(), container.getUniqueId());
51         return groupsOperation.updateGroups(container, groupsToUpdate)
52                 .either(groupsUpdated -> ActionStatus.OK,
53                         err -> componentsUtils.convertFromStorageResponse(err, container.getComponentType()));
54     }
55
56     private void replacePrevInstanceMemberWithNewInstance(ComponentInstance prevVersion, ComponentInstance newVersion, List<GroupDefinition> groupsWithPrevInstAsMember) {
57         groupsWithPrevInstAsMember.forEach(grp -> replacePrevInstanceMemberWithNewInstance(grp, prevVersion.getUniqueId(), newVersion.getUniqueId()));
58     }
59
60     private void replacePrevInstanceMemberWithNewInstance(GroupDefinition groupDefinition, String prevInstanceId, String newInstanceId) {
61         Map<String, String> membersNameToId = groupDefinition.getMembers();
62         String prevInstanceMemberName = MapUtils.invertMap(membersNameToId).get(prevInstanceId).toString();
63         membersNameToId.replace(prevInstanceMemberName, newInstanceId);
64     }
65
66 }