Added oparent to sdc main
[sdc.git] / openecomp-be / backend / openecomp-sdc-conflict-manager / src / main / java / org / openecomp / sdc / conflicts / impl / ConflictsManagerImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.conflicts.impl;
22
23 import org.openecomp.conflicts.ItemMergeHandler;
24 import org.openecomp.conflicts.ItemMergeHandlerFactory;
25 import org.openecomp.conflicts.dao.ConflictsDao;
26 import org.openecomp.conflicts.types.Conflict;
27 import org.openecomp.conflicts.types.ConflictResolution;
28 import org.openecomp.conflicts.types.ItemVersionConflict;
29 import org.openecomp.conflicts.types.Resolution;
30 import org.openecomp.sdc.common.errors.CoreException;
31 import org.openecomp.sdc.common.errors.ErrorCategory;
32 import org.openecomp.sdc.common.errors.ErrorCode;
33 import org.openecomp.sdc.conflicts.ConflictsManager;
34 import org.openecomp.sdc.versioning.dao.types.Version;
35
36 import java.util.Optional;
37
38 public class ConflictsManagerImpl implements ConflictsManager {
39
40   private static final String ELEMENT_CONFLICT_NOT_EXIST_ERR_ID = "ELEMENT_CONFLICT_NOT_EXIST";
41   private static final String ELEMENT_CONFLICT_NOT_EXISTS_MSG =
42       "Item Id %s, version Id %s, element conflict with Id %s does not exists.";
43
44   private final ConflictsDao conflictsDao;
45
46   public ConflictsManagerImpl(ConflictsDao conflictsDao) {
47     this.conflictsDao = conflictsDao;
48   }
49
50   @Override
51   public boolean isConflicted(String itemId, Version version) {
52     Optional<ItemMergeHandler> itemMergeHandler =
53         ItemMergeHandlerFactory.getInstance().createInterface(itemId);
54
55     return conflictsDao.isConflicted(itemId, version) ||
56         (itemMergeHandler.isPresent() &&
57             itemMergeHandler.get().isConflicted(itemId, version));
58   }
59
60   @Override
61   public ItemVersionConflict getConflict(String itemId, Version version) {
62     ItemVersionConflict conflicts = conflictsDao.getConflict(itemId, version);
63
64     ItemMergeHandlerFactory.getInstance().createInterface(itemId)
65         .ifPresent(itemMergeHandler -> itemMergeHandler
66             .postListConflicts(itemId, version, conflicts));
67
68     return conflicts;
69   }
70
71   @Override
72   public void finalizeMerge(String itemId, Version version) {
73     ItemMergeHandlerFactory.getInstance().createInterface(itemId)
74         .ifPresent(mergeHandler -> mergeHandler.finalizeMerge(itemId, version));
75   }
76
77   @Override
78   public Conflict getConflict(String itemId, Version version, String conflictId) {
79     Optional<ItemMergeHandler> itemMergeHandler =
80         ItemMergeHandlerFactory.getInstance().createInterface(itemId);
81     if (itemMergeHandler.isPresent()) {
82       Optional<Conflict> conflict =
83           itemMergeHandler.get().getConflict(itemId, version, conflictId);
84       if (conflict.isPresent()) {
85         return conflict.get();
86       }
87     }
88
89     Conflict conflict = conflictsDao.getConflict(itemId, version, conflictId);
90
91     itemMergeHandler.ifPresent(mergeHandler ->
92         mergeHandler.postGetConflict(itemId, version, conflict));
93
94     if (conflict == null) {
95       throw getConflictNotExistException(itemId, version, conflictId);
96     }
97     return conflict;
98   }
99
100   @Override
101   public void resolveConflict(String itemId, Version version, String conflictId,
102                               ConflictResolution resolution) {
103     if (Resolution.OTHER.equals(resolution.getResolution())) {
104       throw new UnsupportedOperationException(
105           "Resolution other than 'THEIRS' or 'YOURS' is not supported.");
106     }
107
108     Optional<ItemMergeHandler> itemMergeHandler =
109         ItemMergeHandlerFactory.getInstance().createInterface(itemId);
110     if (!itemMergeHandler.isPresent() ||
111         !itemMergeHandler.get()
112             .resolveConflict(itemId, version, conflictId, resolution)) {
113
114       getConflict(itemId, version, conflictId); // validate that the conflict exist
115       itemMergeHandler.ifPresent(mergeHandler ->
116           mergeHandler.preResolveConflict(itemId, version, conflictId, resolution));
117
118       conflictsDao.resolveConflict(itemId, version, conflictId, resolution);
119     }
120   }
121
122   private CoreException getConflictNotExistException(String itemId, Version version,
123                                                      String conflictId) {
124     return new CoreException(new ErrorCode.ErrorCodeBuilder()
125         .withCategory(ErrorCategory.APPLICATION)
126         .withId(ELEMENT_CONFLICT_NOT_EXIST_ERR_ID)
127         .withMessage(
128             String.format(ELEMENT_CONFLICT_NOT_EXISTS_MSG, itemId, version.getId(), conflictId))
129         .build());
130   }
131
132 }