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.mapping.annotations.Accessor;
12 import com.datastax.driver.mapping.annotations.Query;
13 import org.openecomp.core.nosqldb.factory.NoSqlDbFactory;
14 import org.openecomp.core.zusammen.api.ZusammenAdaptor;
15 import org.openecomp.sdc.common.session.SessionContextProviderFactory;
16 import org.openecomp.sdc.datatypes.model.ElementType;
17 import org.openecomp.sdc.vendorsoftwareproduct.dao.VspMergeDao;
18 import org.openecomp.sdc.versioning.dao.types.Version;
20 import java.util.List;
21 import java.util.stream.Collectors;
23 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildElement;
24 import static org.openecomp.core.zusammen.api.ZusammenUtil.createSessionContext;
26 public class VspMergeDaoImpl implements VspMergeDao {
27 private static final String VSP_MODEL_NOT_EXIST =
28 "Vsp model does not exist for Vsp %s, version %s.";
30 private static VspMergeHintAccessor accessor =
31 NoSqlDbFactory.getInstance().createInterface()
32 .getMappingManager().createAccessor(VspMergeHintAccessor.class);
34 private ZusammenAdaptor zusammenAdaptor;
36 public VspMergeDaoImpl(ZusammenAdaptor zusammenAdaptor) {
37 this.zusammenAdaptor = zusammenAdaptor;
41 public boolean isVspModelConflicted(String vspId, Version version) {
42 SessionContext context = createSessionContext();
43 ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
45 return listVspModels(context, elementContext).size() > 1;
49 public void updateVspModelId(String vspId, Version version) {
50 SessionContext context = createSessionContext();
51 ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
53 String vspModelId = zusammenAdaptor
54 .getElementInfoByName(context, elementContext, null, ElementType.VspModel.name())
55 .orElseThrow(() -> new IllegalStateException(
56 String.format(VSP_MODEL_NOT_EXIST, vspId, version.getId())))
59 updateVspModelId(vspId, version, vspModelId);
63 public void updateVspModelConflictResolution(String vspId, Version version,
64 Resolution resolution) {
65 accessor.updateModelResolution(resolution, getUser(), vspId, version.getId());
69 public void applyVspModelConflictResolution(String vspId, Version version) {
70 //called only when no conflicts
72 SessionContext context = createSessionContext();
73 ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
75 List<ElementInfo> vspModels = listVspModels(context, elementContext);
76 if (vspModels.size() == 1) {
77 updateVspModelId(vspId, version, vspModels.iterator().next().getId().getValue());
81 if (vspModels.size() != 2) {
85 String user = getUser();
86 Row row = accessor.getModelMergeHint(user, vspId, version.getId()).one();
88 throw new IllegalStateException(
89 "Vsp model id must exists if its conflict is being resolved");
91 String resolutionValue = row.getString("model_resolution");
92 if (resolutionValue == null) {
93 return; // model conflict is not resolved yet
96 Resolution resolution = Resolution.valueOf(resolutionValue);
97 String localModelId = row.getString("model_id");
99 String chosenModelId =
100 keepOnlyChosenVspModel(context, elementContext, vspModels, resolution, localModelId);
102 accessor.updateModelMergeHint(chosenModelId, null, user, vspId, version.getId());
105 private String keepOnlyChosenVspModel(SessionContext context, ElementContext elementContext,
106 List<ElementInfo> vspModels, Resolution resolution,
107 String localModelId) {
108 String newLocalModelId = null;
109 for (ElementInfo vspModel : vspModels) {
110 if (isRedundantModel(vspModel.getId().getValue(), localModelId, resolution)) {
112 .saveElement(context, elementContext, buildElement(vspModel.getId(), Action.DELETE),
113 "Delete Redundant Vsp Model");
115 newLocalModelId = vspModel.getId().getValue();
118 return newLocalModelId;
121 private boolean isRedundantModel(String modelId, String localModelId, Resolution resolution) {
122 return resolution == Resolution.THEIRS && modelId.equals(localModelId) ||
123 resolution == Resolution.YOURS && !modelId.equals(localModelId);
126 private List<ElementInfo> listVspModels(SessionContext context, ElementContext elementContext) {
127 return zusammenAdaptor.listElements(context, elementContext, null).stream()
128 .filter(elementInfo -> ElementType.VspModel.name().equals(elementInfo.getInfo().getName()))
129 .collect(Collectors.toList());
132 private void updateVspModelId(String vspId, Version version, String vspModelId) {
133 accessor.updateModelMergeHint(vspModelId, null, getUser(), vspId, version.getId());
136 private String getUser() {
137 return SessionContextProviderFactory.getInstance().createInterface()
138 .get().getUser().getUserId();
142 interface VspMergeHintAccessor {
144 @Query("UPDATE vsp_merge_hint SET model_id=?, model_resolution=? " +
145 "WHERE space=? AND item_id=? AND version_id=?")
146 void updateModelMergeHint(String vspModelId, Resolution modelResolution, String space,
147 String itemId, String versionId);
150 "UPDATE vsp_merge_hint SET model_resolution=? WHERE space=? AND item_id=? AND version_id=?")
151 void updateModelResolution(Resolution modelResolution, String space, String itemId,
154 @Query("SELECT model_id, model_resolution FROM vsp_merge_hint " +
155 "WHERE space=? AND item_id=? AND version_id=?")
156 ResultSet getModelMergeHint(String space, String itemId, String versionId);