1 package org.openecomp.sdc.vendorsoftwareproduct.dao.impl;
3 import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo;
4 import com.amdocs.zusammen.datatypes.Id;
5 import com.amdocs.zusammen.datatypes.SessionContext;
6 import com.amdocs.zusammen.datatypes.item.Action;
7 import com.amdocs.zusammen.datatypes.item.ElementContext;
8 import com.amdocs.zusammen.datatypes.item.Resolution;
9 import com.datastax.driver.core.ResultSet;
10 import com.datastax.driver.core.Row;
11 import com.datastax.driver.extras.codecs.enums.EnumNameCodec;
12 import com.datastax.driver.mapping.MappingManager;
13 import com.datastax.driver.mapping.annotations.Accessor;
14 import com.datastax.driver.mapping.annotations.Query;
15 import org.openecomp.core.nosqldb.factory.NoSqlDbFactory;
16 import org.openecomp.core.zusammen.api.ZusammenAdaptor;
17 import org.openecomp.sdc.common.session.SessionContextProviderFactory;
18 import org.openecomp.sdc.datatypes.model.ElementType;
19 import org.openecomp.sdc.vendorsoftwareproduct.dao.VspMergeDao;
20 import org.openecomp.sdc.versioning.dao.types.Version;
22 import java.util.List;
23 import java.util.stream.Collectors;
25 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildElement;
26 import static org.openecomp.core.zusammen.api.ZusammenUtil.createSessionContext;
28 public class VspMergeDaoImpl implements VspMergeDao {
29 private static final String VSP_MODEL_NOT_EXIST =
30 "Vsp model does not exist for Vsp %s, version %s.";
32 private static final VspMergeHintAccessor accessor;
35 MappingManager mappingManager = NoSqlDbFactory.getInstance().createInterface().getMappingManager();
36 mappingManager.getSession().getCluster().getConfiguration().getCodecRegistry()
37 .register(new EnumNameCodec<>(Resolution.class));
38 accessor = mappingManager.createAccessor(VspMergeHintAccessor.class);
41 private ZusammenAdaptor zusammenAdaptor;
43 public VspMergeDaoImpl(ZusammenAdaptor zusammenAdaptor) {
44 this.zusammenAdaptor = zusammenAdaptor;
48 public boolean isConflicted(String vspId, Version version) {
49 SessionContext context = createSessionContext();
50 ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
52 return listVspModels(context, elementContext).size() > 1;
56 public void updateHint(String vspId, Version version) {
57 SessionContext context = createSessionContext();
58 ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
60 String vspModelId = zusammenAdaptor
61 .getElementInfoByName(context, elementContext, null, ElementType.VspModel.name())
62 .orElseThrow(() -> new IllegalStateException(
63 String.format(VSP_MODEL_NOT_EXIST, vspId, version.getId())))
66 updateVspModelId(vspId, version, vspModelId);
70 public void deleteHint(String vspId, Version version) {
71 accessor.delete(getUser(),vspId,version.getId());
75 public void updateConflictResolution(String vspId, Version version,
76 Resolution resolution) {
77 accessor.updateModelResolution(resolution, getUser(), vspId, version.getId());
81 public void applyConflictResolution(String vspId, Version version) {
82 //called only when no conflicts
84 SessionContext context = createSessionContext();
85 ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
87 List<ElementInfo> vspModels = listVspModels(context, elementContext);
88 if (vspModels.size() == 1) {
89 updateVspModelId(vspId, version, vspModels.iterator().next().getId().getValue());
93 if (vspModels.size() != 2) {
97 String user = getUser();
98 Row row = accessor.get(user, vspId, version.getId()).one();
100 throw new IllegalStateException(
101 "Vsp model id must exists if its conflict is being resolved");
103 String resolutionValue = row.getString("model_resolution");
104 if (resolutionValue == null) {
105 return; // model conflict is not resolved yet
108 Resolution resolution = Resolution.valueOf(resolutionValue);
109 String localModelId = row.getString("model_id");
111 String chosenModelId =
112 keepOnlyChosenVspModel(context, elementContext, vspModels, resolution, localModelId);
114 accessor.update(chosenModelId, null, user, vspId, version.getId());
117 private String keepOnlyChosenVspModel(SessionContext context, ElementContext elementContext,
118 List<ElementInfo> vspModels, Resolution resolution,
119 String localModelId) {
120 String newLocalModelId = null;
121 for (ElementInfo vspModel : vspModels) {
122 if (isRedundantModel(vspModel.getId().getValue(), localModelId, resolution)) {
124 .saveElement(context, elementContext, buildElement(vspModel.getId(), Action.DELETE),
125 "Delete Redundant Vsp Model");
127 newLocalModelId = vspModel.getId().getValue();
130 return newLocalModelId;
133 private boolean isRedundantModel(String modelId, String localModelId, Resolution resolution) {
134 return resolution == Resolution.THEIRS && modelId.equals(localModelId) ||
135 resolution == Resolution.YOURS && !modelId.equals(localModelId);
138 private List<ElementInfo> listVspModels(SessionContext context, ElementContext elementContext) {
139 return zusammenAdaptor.listElements(context, elementContext, null).stream()
140 .filter(elementInfo -> ElementType.VspModel.name().equals(elementInfo.getInfo().getName()))
141 .collect(Collectors.toList());
144 private void updateVspModelId(String vspId, Version version, String vspModelId) {
145 accessor.update(vspModelId, null, getUser(), vspId, version.getId());
148 private String getUser() {
149 return SessionContextProviderFactory.getInstance().createInterface()
150 .get().getUser().getUserId();
154 interface VspMergeHintAccessor {
156 @Query("SELECT model_id, model_resolution FROM vsp_merge_hint " +
157 "WHERE space=? AND item_id=? AND version_id=?")
158 ResultSet get(String space, String itemId, String versionId);
160 @Query("UPDATE vsp_merge_hint SET model_id=?, model_resolution=? " +
161 "WHERE space=? AND item_id=? AND version_id=?")
162 void update(String vspModelId, Resolution modelResolution, String space,
163 String itemId, String versionId);
166 "UPDATE vsp_merge_hint SET model_resolution=? WHERE space=? AND item_id=? AND version_id=?")
167 void updateModelResolution(Resolution modelResolution, String space, String itemId,
170 @Query("DELETE from vsp_merge_hint WHERE space=? AND item_id=? AND version_id=?")
171 void delete(String space, String itemId, String versionId);