786a2c4ba8141641a3a89888495904117193b297
[sdc.git] /
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.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;
21
22 import java.util.List;
23 import java.util.stream.Collectors;
24
25 import static org.openecomp.core.zusammen.api.ZusammenUtil.buildElement;
26 import static org.openecomp.core.zusammen.api.ZusammenUtil.createSessionContext;
27
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.";
31
32   private static final VspMergeHintAccessor accessor;
33
34   static {
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);
39   }
40
41   private ZusammenAdaptor zusammenAdaptor;
42
43   public VspMergeDaoImpl(ZusammenAdaptor zusammenAdaptor) {
44     this.zusammenAdaptor = zusammenAdaptor;
45   }
46
47   @Override
48   public boolean isConflicted(String vspId, Version version) {
49     SessionContext context = createSessionContext();
50     ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
51
52     return listVspModels(context, elementContext).size() > 1;
53   }
54
55   @Override
56   public void updateHint(String vspId, Version version) {
57     SessionContext context = createSessionContext();
58     ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
59
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())))
64         .getId().getValue();
65
66     updateVspModelId(vspId, version, vspModelId);
67   }
68
69   @Override
70   public void deleteHint(String vspId, Version version) {
71     accessor.delete(getUser(),vspId,version.getId());
72   }
73
74   @Override
75   public void updateConflictResolution(String vspId, Version version,
76                                        Resolution resolution) {
77     accessor.updateModelResolution(resolution, getUser(), vspId, version.getId());
78   }
79
80   @Override
81   public void applyConflictResolution(String vspId, Version version) {
82     //called only when no conflicts
83
84     SessionContext context = createSessionContext();
85     ElementContext elementContext = new ElementContext(new Id(vspId), new Id(version.getId()));
86
87     List<ElementInfo> vspModels = listVspModels(context, elementContext);
88     if (vspModels.size() == 1) {
89       updateVspModelId(vspId, version, vspModels.iterator().next().getId().getValue());
90       return;
91     }
92
93     if (vspModels.size() != 2) {
94       return;
95     }
96
97     String user = getUser();
98     Row row = accessor.get(user, vspId, version.getId()).one();
99     if (row == null) {
100       throw new IllegalStateException(
101           "Vsp model id must exists if its conflict is being resolved");
102     }
103     String resolutionValue = row.getString("model_resolution");
104     if (resolutionValue == null) {
105       return; // model conflict is not resolved yet
106     }
107
108     Resolution resolution = Resolution.valueOf(resolutionValue);
109     String localModelId = row.getString("model_id");
110
111     String chosenModelId =
112         keepOnlyChosenVspModel(context, elementContext, vspModels, resolution, localModelId);
113
114     accessor.update(chosenModelId, null, user, vspId, version.getId());
115   }
116
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)) {
123         zusammenAdaptor
124             .saveElement(context, elementContext, buildElement(vspModel.getId(), Action.DELETE),
125                 "Delete Redundant Vsp Model");
126       } else {
127         newLocalModelId = vspModel.getId().getValue();
128       }
129     }
130     return newLocalModelId;
131   }
132
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);
136   }
137
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());
142   }
143
144   private void updateVspModelId(String vspId, Version version, String vspModelId) {
145     accessor.update(vspModelId, null, getUser(), vspId, version.getId());
146   }
147
148   private String getUser() {
149     return SessionContextProviderFactory.getInstance().createInterface()
150         .get().getUser().getUserId();
151   }
152
153   @Accessor
154   interface VspMergeHintAccessor {
155
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);
159
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);
164
165     @Query(
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,
168                                String versionId);
169
170     @Query("DELETE from vsp_merge_hint WHERE space=? AND item_id=? AND version_id=?")
171     void delete(String space, String itemId, String versionId);
172   }
173 }