Add collaboration feature
[sdc.git] / openecomp-be / lib / openecomp-core-lib / openecomp-zusammen-lib / openecomp-zusammen-plugin / src / main / java / org / openecomp / core / zusammen / plugin / dao / impl / cassandra / ElementSynchronizationStateRepositoryImpl.java
1 package org.openecomp.core.zusammen.plugin.dao.impl.cassandra;
2
3 import com.amdocs.zusammen.datatypes.Id;
4 import com.amdocs.zusammen.datatypes.SessionContext;
5 import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
6 import com.datastax.driver.core.ResultSet;
7 import com.datastax.driver.core.Row;
8 import com.datastax.driver.mapping.annotations.Accessor;
9 import com.datastax.driver.mapping.annotations.Query;
10 import org.openecomp.core.zusammen.plugin.dao.ElementSynchronizationStateRepository;
11 import org.openecomp.core.zusammen.plugin.dao.types.SynchronizationStateEntity;
12
13 import java.util.Collection;
14 import java.util.Collections;
15 import java.util.Date;
16 import java.util.HashSet;
17 import java.util.List;
18 import java.util.Optional;
19 import java.util.Set;
20 import java.util.stream.Collectors;
21
22 public class ElementSynchronizationStateRepositoryImpl
23     implements ElementSynchronizationStateRepository {
24
25   @Override
26   public Collection<SynchronizationStateEntity> list(SessionContext context,
27                                                      ElementEntityContext elementContext) {
28     List<Row> rows = getAccessor(context)
29         .list(elementContext.getSpace(),
30             elementContext.getItemId().toString(),
31             elementContext.getVersionId().toString()).all();
32     return rows == null ? new HashSet<>()
33         : rows.stream().map(this::getSynchronizationStateEntity).collect(Collectors.toSet());
34
35   }
36
37   @Override
38   public void create(SessionContext context, ElementEntityContext elementContext,
39                      SynchronizationStateEntity elementSyncState) {
40     update(context, elementContext.getSpace(),
41         elementContext.getItemId(),
42         elementContext.getVersionId(),
43         elementContext.getRevisionId(),
44         elementSyncState.getRevisionId(),
45         elementSyncState.getId(),
46         elementSyncState.getPublishTime(),
47         elementSyncState.isDirty()
48
49     );
50   }
51
52   @Override
53   public void update(SessionContext context, ElementEntityContext elementContext,
54                      SynchronizationStateEntity elementSyncState) {
55     update(context, elementContext.getSpace(),
56         elementContext.getItemId(),
57         elementContext.getVersionId(),
58         elementContext.getRevisionId(),
59         elementSyncState.getRevisionId(),
60         elementSyncState.getId(),
61         elementSyncState.getPublishTime(),
62         elementSyncState.isDirty()
63
64     );
65   }
66
67   @Override
68   public void markAsDirty(SessionContext context, ElementEntityContext elementContext,
69                           SynchronizationStateEntity elementSyncState) {
70
71
72       getAccessor(context).updateDirty(true,
73           elementContext.getSpace(),
74           elementContext.getItemId().toString(),
75           elementContext.getVersionId().toString(),
76           elementSyncState.getId().toString(),
77           elementContext.getRevisionId().getValue());
78
79       getVersionElementsAccessor(context).addDirtyElements(
80           Collections.singleton(elementSyncState.getId().toString()), elementContext.getSpace(),
81           elementContext.getItemId().toString(),
82           elementContext.getVersionId().toString(),
83           elementContext.getRevisionId().getValue());
84   }
85
86   @Override
87   public void delete(SessionContext context, ElementEntityContext elementContext,
88                      SynchronizationStateEntity elementSyncState) {
89     getAccessor(context).delete(elementContext.getSpace(),
90         elementContext.getItemId().toString(),
91         elementContext.getVersionId().toString(),
92         elementSyncState.getId().toString(),
93         elementContext.getRevisionId().getValue());
94
95     getVersionElementsAccessor(context).removeDirtyElements(
96         Collections.singleton(elementSyncState.getId().toString()), elementContext.getSpace(),
97         elementContext.getItemId().toString(),
98         elementContext.getVersionId().toString(),
99         elementContext.getRevisionId().getValue());
100   }
101
102   @Override
103   public Optional<SynchronizationStateEntity> get(SessionContext context,
104                                                   ElementEntityContext elementContext,
105                                                   SynchronizationStateEntity elementSyncState) {
106
107     Row row = getAccessor(context)
108         .get(elementContext.getSpace(),
109             elementContext.getItemId().toString(),
110             elementContext.getVersionId().toString(),
111             elementSyncState.getId().toString(),
112             elementSyncState.getRevisionId().getValue()).one();
113
114     return row == null ? Optional.empty() : Optional.of(getSynchronizationStateEntity(row));
115   }
116
117   private void update(SessionContext context, String space, Id itemId, Id versionId, Id
118       versionRevisionId,Id elementRevisionId,Id elementId, Date publishTime, boolean isDirty) {
119     getAccessor(context).update(publishTime,
120         isDirty,
121         space,
122         itemId.toString(),
123         versionId.toString(),
124         elementId.toString(),
125         elementRevisionId.getValue());
126
127     if (isDirty) {
128       getVersionElementsAccessor(context).addDirtyElements(
129           Collections.singleton(elementId.toString()), space,
130           itemId.toString(),
131           versionId.toString(),
132           versionRevisionId.getValue());
133     } else {
134       getVersionElementsAccessor(context).removeDirtyElements(
135           Collections.singleton(elementId.toString()), space,
136           itemId.toString(),
137           versionId.toString(),
138           versionRevisionId.getValue());
139     }
140   }
141
142
143   private SynchronizationStateEntity getSynchronizationStateEntity(Row row) {
144     SynchronizationStateEntity entity =
145         new SynchronizationStateEntity(new Id(row.getString(SynchronizationStateField.ID)),
146             new Id(row.getString(SynchronizationStateField.REVISION_ID)),
147             row.getDate(SynchronizationStateField.PUBLISH_TIME),
148             row.getBool(SynchronizationStateField.DIRTY));
149     entity.setRevisionId(new Id(row.getString(SynchronizationStateField.REVISION_ID)));
150
151     return entity;
152
153   }
154
155   private ElementSynchronizationStateAccessor getAccessor(SessionContext context) {
156     return CassandraDaoUtils.getAccessor(context, ElementSynchronizationStateAccessor.class);
157   }
158
159   private VersionElementsAccessor getVersionElementsAccessor(SessionContext context) {
160     return CassandraDaoUtils.getAccessor(context, VersionElementsAccessor.class);
161   }
162
163   @Accessor
164   interface ElementSynchronizationStateAccessor {
165     @Query("UPDATE element_synchronization_state SET publish_time=?, dirty=? " +
166         "WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id = ? ")
167     void update(Date publishTime, boolean dirty, String space, String itemId, String versionId,
168                 String elementId, String revisionId);
169
170     @Query("UPDATE element_synchronization_state SET dirty=? " +
171         "WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id = ? ")
172     void updateDirty(boolean dirty, String space, String itemId, String versionId,
173                      String elementId, String revisionId);
174
175     @Query("DELETE FROM element_synchronization_state " +
176         "WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id = ? ")
177     void delete(String space, String itemId, String versionId, String elementId, String revisionId);
178
179     @Query("SELECT element_id,revision_id, publish_time, dirty FROM element_synchronization_state" +
180         " WHERE space=? AND item_id=? AND version_id=?")
181     ResultSet list(String space, String itemId, String versionId);
182
183     @Query("SELECT element_id,revision_id, publish_time, dirty FROM element_synchronization_state" +
184         " WHERE space=? AND item_id=? AND version_id=? AND element_id=? AND revision_id = ?  ")
185     ResultSet get(String space, String itemId, String versionId, String elementId, String
186         revisionId);
187   }
188
189   private static final class SynchronizationStateField {
190     private static final String ID = "element_id";
191     private static final String PUBLISH_TIME = "publish_time";
192     private static final String DIRTY = "dirty";
193     private static final String REVISION_ID = "revision_id";
194   }
195
196   @Accessor
197   interface VersionElementsAccessor {
198
199     @Query("UPDATE version_elements SET dirty_element_ids=dirty_element_ids+? " +
200         "WHERE space=? AND item_id=? AND version_id=? AND revision_id=?")
201     void addDirtyElements(Set<String> elementIds, String space, String itemId, String versionId,
202                           String revisionId);
203
204     @Query("UPDATE version_elements SET dirty_element_ids=dirty_element_ids-? " +
205         "WHERE space=? AND item_id=? AND version_id=? AND revision_id=? ")
206     void removeDirtyElements(Set<String> elementIds, String space, String itemId, String
207         versionId, String revisionId);
208   }
209 }