Add collaboration feature
[sdc.git] / openecomp-be / lib / openecomp-sdc-vendor-software-product-lib / openecomp-sdc-vendor-software-product-core / src / main / java / org / openecomp / sdc / vendorsoftwareproduct / dao / impl / VspMergeDaoImpl.java
1 package org.openecomp.sdc.vendorsoftwareproduct.dao.impl;
2
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;
19
20 import java.util.List;
21 import java.util.stream.Collectors;
22
23 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildElement;
24 import static org.openecomp.core.zusammen.api.ZusammenUtil.createSessionContext;
25
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.";
29
30   private static VspMergeHintAccessor accessor =
31       NoSqlDbFactory.getInstance().createInterface()
32           .getMappingManager().createAccessor(VspMergeHintAccessor.class);
33
34   private ZusammenAdaptor zusammenAdaptor;
35
36   public VspMergeDaoImpl(ZusammenAdaptor zusammenAdaptor) {
37     this.zusammenAdaptor = zusammenAdaptor;
38   }
39
40   @Override
41   public boolean isVspModelConflicted(String vspId, Version version) {
42     SessionContext context = createSessionContext();
43     ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
44
45     return listVspModels(context, elementContext).size() > 1;
46   }
47
48   @Override
49   public void updateVspModelId(String vspId, Version version) {
50     SessionContext context = createSessionContext();
51     ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
52
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())))
57         .getId().getValue();
58
59     updateVspModelId(vspId, version, vspModelId);
60   }
61
62   @Override
63   public void updateVspModelConflictResolution(String vspId, Version version,
64                                                Resolution resolution) {
65     accessor.updateModelResolution(resolution, getUser(), vspId, version.getId());
66   }
67
68   @Override
69   public void applyVspModelConflictResolution(String vspId, Version version) {
70     //called only when no conflicts
71
72     SessionContext context = createSessionContext();
73     ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
74
75     List<ElementInfo> vspModels = listVspModels(context, elementContext);
76     if (vspModels.size() == 1) {
77       updateVspModelId(vspId, version, vspModels.iterator().next().getId().getValue());
78       return;
79     }
80
81     if (vspModels.size() != 2) {
82       return;
83     }
84
85     String user = getUser();
86     Row row = accessor.getModelMergeHint(user, vspId, version.getId()).one();
87     if (row == null) {
88       throw new IllegalStateException(
89           "Vsp model id must exists if its conflict is being resolved");
90     }
91     String resolutionValue = row.getString("model_resolution");
92     if (resolutionValue == null) {
93       return; // model conflict is not resolved yet
94     }
95
96     Resolution resolution = Resolution.valueOf(resolutionValue);
97     String localModelId = row.getString("model_id");
98
99     String chosenModelId =
100         keepOnlyChosenVspModel(context, elementContext, vspModels, resolution, localModelId);
101
102     accessor.updateModelMergeHint(chosenModelId, null, user, vspId, version.getId());
103   }
104
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)) {
111         zusammenAdaptor
112             .saveElement(context, elementContext, buildElement(vspModel.getId(), Action.DELETE),
113                 "Delete Redundant Vsp Model");
114       } else {
115         newLocalModelId = vspModel.getId().getValue();
116       }
117     }
118     return newLocalModelId;
119   }
120
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);
124   }
125
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());
130   }
131
132   private void updateVspModelId(String vspId, Version version, String vspModelId) {
133     accessor.updateModelMergeHint(vspModelId, null, getUser(), vspId, version.getId());
134   }
135
136   private String getUser() {
137     return SessionContextProviderFactory.getInstance().createInterface()
138         .get().getUser().getUserId();
139   }
140
141   @Accessor
142   interface VspMergeHintAccessor {
143
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);
148
149     @Query(
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,
152                                String versionId);
153
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);
157   }
158 }