1 package org.openecomp.conflicts.impl;
3 import org.openecomp.conflicts.ItemMergeHandler;
4 import org.openecomp.conflicts.dao.ConflictsDao;
5 import org.openecomp.conflicts.types.Conflict;
6 import org.openecomp.conflicts.types.ConflictInfo;
7 import org.openecomp.conflicts.types.ConflictResolution;
8 import org.openecomp.conflicts.types.ItemVersionConflict;
9 import org.openecomp.conflicts.types.Resolution;
10 import org.openecomp.sdc.common.errors.CoreException;
11 import org.openecomp.sdc.common.errors.ErrorCategory;
12 import org.openecomp.sdc.common.errors.ErrorCode;
13 import org.openecomp.sdc.datatypes.model.ElementType;
14 import org.openecomp.sdc.vendorsoftwareproduct.dao.VspMergeDao;
15 import org.openecomp.sdc.versioning.dao.types.Version;
18 import java.util.stream.Collectors;
19 import java.util.stream.Stream;
21 import static org.openecomp.sdc.datatypes.model.ElementType.NetworkPackage;
22 import static org.openecomp.sdc.datatypes.model.ElementType.OrchestrationTemplate;
23 import static org.openecomp.sdc.datatypes.model.ElementType.OrchestrationTemplateCandidate;
24 import static org.openecomp.sdc.datatypes.model.ElementType.OrchestrationTemplateCandidateContent;
25 import static org.openecomp.sdc.datatypes.model.ElementType.OrchestrationTemplateValidationData;
26 import static org.openecomp.sdc.datatypes.model.ElementType.VspModel;
28 public class VspMergeHandler implements ItemMergeHandler {
30 private static final String VSP_MODEL_CONFLICT_ID = "vspModelConflictId";
31 private static final String ELEMENT_CONFLICT_NOT_EXIST_ERR_ID = "ELEMENT_CONFLICT_NOT_EXIST";
32 private static final String ELEMENT_CONFLICT_NOT_EXISTS_MSG =
33 "Item Id %s, version Id %s, element conflict with Id %s does not exists.";
34 private static final Set<ElementType> FILTERED_OUT_TYPES = Stream
35 .of(OrchestrationTemplateCandidateContent, OrchestrationTemplateValidationData)
36 .collect(Collectors.toSet());
37 private static final Map<ElementType, Set<ElementType>> ELEMENT_TYPE_TO_CONFLICT_DEPENDANT_TYPES =
38 new EnumMap<>(ElementType.class);
41 ELEMENT_TYPE_TO_CONFLICT_DEPENDANT_TYPES.put(OrchestrationTemplateCandidate,
42 Collections.singleton(OrchestrationTemplateCandidateContent));
43 ELEMENT_TYPE_TO_CONFLICT_DEPENDANT_TYPES.put(OrchestrationTemplate,
44 Collections.singleton(OrchestrationTemplateValidationData));
47 private ConflictsDao conflictsDao;
48 private VspMergeDao vspMergeDao;
50 public VspMergeHandler(ConflictsDao conflictsDao, VspMergeDao vspMergeDao) {
51 this.conflictsDao = conflictsDao;
52 this.vspMergeDao = vspMergeDao;
56 public boolean isConflicted(String itemId, Version version) {
57 return vspMergeDao.isConflicted(itemId, version);
61 public void finalizeMerge(String itemId, Version version) {
62 if (!conflictsDao.isConflicted(itemId, version)) {
63 vspMergeDao.applyConflictResolution(itemId, version);
68 public void postListConflicts(String itemId, Version version, ItemVersionConflict conflicts) {
69 List<ConflictInfo> elementConflicts = new ArrayList<>();
71 boolean vspModelConflicted = false;
72 for (ConflictInfo elementConflict : conflicts.getElementConflicts()) {
73 if (elementConflict.getType() == VspModel) {
75 new ConflictInfo(elementConflict.getId(), NetworkPackage, NetworkPackage.name()));
76 vspModelConflicted = true;
79 if (!FILTERED_OUT_TYPES.contains(elementConflict.getType())) {
80 elementConflicts.add(elementConflict);
84 if (!vspModelConflicted && vspMergeDao.isConflicted(itemId, version)) {
86 .add(new ConflictInfo(VSP_MODEL_CONFLICT_ID, NetworkPackage, NetworkPackage.name()));
89 conflicts.setElementConflicts(elementConflicts);
93 public Optional<Conflict> getConflict(String itemId, Version version, String conflictId) {
94 return VSP_MODEL_CONFLICT_ID.equals(conflictId)
95 ? Optional.of(buildVspModelConflict(conflictId))
100 public void postGetConflict(String itemId, Version version, Conflict conflict) {
101 if (conflict.getType() == VspModel) {
102 Conflict vspModelConflict = buildVspModelConflict(null);
103 conflict.setType(vspModelConflict.getType());
104 conflict.setName(vspModelConflict.getName());
105 conflict.setYours(vspModelConflict.getYours());
106 conflict.setTheirs(vspModelConflict.getTheirs());
111 public void preResolveConflict(String itemId, Version version, String conflictId,
112 ConflictResolution resolution) {
113 if (VSP_MODEL_CONFLICT_ID.equals(conflictId)) {
116 resolveDependantConflicts(itemId, version, conflictId, resolution);
120 public boolean resolveConflict(String itemId, Version version, String conflictId,
121 ConflictResolution resolution) {
122 if (VSP_MODEL_CONFLICT_ID.equals(conflictId)) {
123 vspMergeDao.updateConflictResolution(itemId, version,
124 com.amdocs.zusammen.datatypes.item.Resolution.valueOf(resolution.getResolution().name()));
127 Conflict conflict = conflictsDao.getConflict(itemId, version, conflictId);
128 if (conflict == null) {
129 throw getConflictNotExistException(itemId, version, conflictId);
131 if (conflict.getType() == VspModel) {
132 vspMergeDao.updateConflictResolution(itemId, version,
133 com.amdocs.zusammen.datatypes.item.Resolution.valueOf(resolution.getResolution().name()));
135 conflictsDao.resolveConflict(itemId, version, conflictId, new ConflictResolution(
136 conflict.getTheirs() == null ? Resolution.YOURS : Resolution.THEIRS));
142 private void resolveDependantConflicts(String itemId, Version version, String conflictId,
143 ConflictResolution resolution) {
144 ItemVersionConflict conflicts = conflictsDao.getConflict(itemId, version);
146 Set<ElementType> conflictDependantTypes =
147 ELEMENT_TYPE_TO_CONFLICT_DEPENDANT_TYPES
148 .get(findConflictById(conflicts, conflictId).getType());
150 if (conflictDependantTypes == null) {
154 findConflictsByTypes(conflicts, conflictDependantTypes)
155 .forEach(dependantConflict ->
156 conflictsDao.resolveConflict(itemId, version, dependantConflict.getId(), resolution));
159 private ConflictInfo findConflictById(ItemVersionConflict versionConflicts,
161 return versionConflicts.getElementConflicts().stream()
162 .filter(elementConflict -> conflictId.equals(elementConflict.getId()))
164 .orElseThrow(() -> new IllegalStateException(
165 String.format("Conflict Id %s does not exist on conflicts list", conflictId)));
168 private Collection<ConflictInfo> findConflictsByTypes(ItemVersionConflict versionConflicts,
169 Set<ElementType> elementTypes) {
170 return versionConflicts.getElementConflicts().stream()
171 .filter(elementConflict -> elementTypes.contains(elementConflict.getType()))
172 .collect(Collectors.toList());
175 private Conflict buildVspModelConflict(String conflictId) {
176 Conflict conflict = new Conflict(conflictId, NetworkPackage, NetworkPackage.name());
178 Map<String, String> yours = new HashMap<>();
179 yours.put("File", "Local (Me)");
180 conflict.setYours(yours);
182 Map<String, String> theirs = new HashMap<>();
183 theirs.put("File", "Last Committed");
184 conflict.setTheirs(theirs);
188 private CoreException getConflictNotExistException(String itemId, Version version,
190 return new CoreException(new ErrorCode.ErrorCodeBuilder()
191 .withCategory(ErrorCategory.APPLICATION)
192 .withId(ELEMENT_CONFLICT_NOT_EXIST_ERR_ID)
194 String.format(ELEMENT_CONFLICT_NOT_EXISTS_MSG, itemId, version.getId(), conflictId))