Reset all version failure
[sdc.git] / openecomp-be / tools / zusammen-tools / src / main / java / org / openecomp / core / tools / store / CassandraElementRepository.java
1 /*
2  * Copyright © 2016-2017 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.openecomp.core.tools.store;
18
19 import com.amdocs.zusammen.datatypes.Id;
20 import com.amdocs.zusammen.datatypes.Namespace;
21 import com.amdocs.zusammen.datatypes.SessionContext;
22 import com.amdocs.zusammen.datatypes.item.Info;
23 import com.amdocs.zusammen.datatypes.item.Relation;
24 import com.amdocs.zusammen.plugin.statestore.cassandra.dao.types.ElementEntityContext;
25 import com.amdocs.zusammen.utils.fileutils.json.JsonUtil;
26 import com.datastax.driver.core.ResultSet;
27 import com.datastax.driver.core.Row;
28 import com.datastax.driver.mapping.annotations.Accessor;
29 import com.datastax.driver.mapping.annotations.Param;
30 import com.datastax.driver.mapping.annotations.Query;
31 import com.google.gson.reflect.TypeToken;
32 import org.openecomp.core.nosqldb.factory.NoSqlDbFactory;
33 import org.openecomp.core.zusammen.plugin.dao.types.ElementEntity;
34
35 import java.lang.reflect.Type;
36 import java.nio.ByteBuffer;
37 import java.util.*;
38 import java.util.stream.Collectors;
39
40 public class CassandraElementRepository {
41
42
43   public Collection<ElementEntity> list(SessionContext context,
44                                         ElementEntityContext elementContext) {
45     Set<String> elementIds = getVersionElementIds(context, elementContext);
46
47     return elementIds.stream()
48         .map(elementId -> get(context, elementContext, new ElementEntity(new Id(elementId))).get())
49         .filter(Objects::nonNull)
50         .collect(Collectors.toList());
51   }
52
53
54   public void update(SessionContext context, ElementEntityContext elementContext,
55                      ElementEntity element) {
56     updateElement(context, elementContext, element);
57   }
58
59
60   public Optional<ElementEntity> get(SessionContext context, ElementEntityContext elementContext,
61                                      ElementEntity element) {
62     Row row = getElementAccessor(context).get(
63         elementContext.getSpace(),
64         elementContext.getItemId().toString(),
65         getVersionId(elementContext),
66         element.getId().toString()).one();
67
68     return row == null ? Optional.empty() : Optional.of(getElementEntity(element, row));
69   }
70
71
72   private String getVersionId(ElementEntityContext elementContext) {
73     return elementContext.getChangeRef() == null
74         ? elementContext.getVersionId().toString()
75         : elementContext.getChangeRef();
76   }
77
78
79   private ElementAccessor getElementAccessor(SessionContext context) {
80     return NoSqlDbFactory.getInstance().createInterface().getMappingManager().createAccessor
81         (ElementAccessor.class);
82
83   }
84
85   private VersionElementsAccessor getVersionElementsAccessor() {
86     return NoSqlDbFactory.getInstance().createInterface().getMappingManager().createAccessor
87         (VersionElementsAccessor.class);
88
89   }
90
91
92   private void updateElement(SessionContext context, ElementEntityContext elementContext,
93                              ElementEntity element) {
94
95     if (elementContext.getChangeRef() == null) {
96
97       getElementAccessor(context).update(
98           JsonUtil.object2Json(element.getInfo()),
99           JsonUtil.object2Json(element.getRelations()),
100           element.getData(),
101           element.getSearchableData(),
102           element.getVisualization(),
103           elementContext.getSpace(),
104           elementContext.getItemId().toString(),
105           elementContext.getVersionId().toString(),
106           element.getId().toString());
107     } else {
108       getElementAccessor(context).update(
109           JsonUtil.object2Json(element.getInfo()),
110           JsonUtil.object2Json(element.getRelations()),
111           element.getData(),
112           element.getSearchableData(),
113           element.getVisualization(),
114           elementContext.getSpace(),
115           elementContext.getItemId().toString(),
116           elementContext.getChangeRef(),
117           element.getId().toString());
118     }
119   }
120
121
122   private ElementEntity getElementEntity(ElementEntity element, Row row) {
123     element.setNamespace(getNamespace(row.getString(ElementField.NAMESPACE)));
124     element.setParentId(new Id(row.getString(ElementField.PARENT_ID)));
125     element.setInfo(json2Object(row.getString(ElementField.INFO), Info.class));
126     element.setRelations(
127         json2Object(row.getString(ElementField.RELATIONS), new TypeToken<ArrayList<Relation>>() {
128         }.getType()));
129     element.setData(row.getBytes(ElementField.DATA));
130     element.setSearchableData(row.getBytes(ElementField.SEARCHABLE_DATA));
131     element.setVisualization(row.getBytes(ElementField.VISUALIZATION));
132     element.setSubElementIds(row.getSet(ElementField.SUB_ELEMENT_IDS, String.class)
133         .stream().map(Id::new).collect(Collectors.toSet()));
134     return element;
135   }
136
137   private Namespace getNamespace(String namespaceStr) {
138     Namespace namespace = new Namespace();
139     if (namespaceStr != null) {
140       namespace.setValue(namespaceStr);
141     }
142     return namespace;
143   }
144
145   private static <T> T json2Object(String json, Type typeOfT) {
146     return json == null ? null : JsonUtil.json2Object(json, typeOfT);
147   }
148
149   private Set<String> getVersionElementIds(SessionContext context,
150                                            ElementEntityContext elementContext) {
151     Row row = getVersionElementsAccessor().get(
152         elementContext.getSpace(),
153         elementContext.getItemId().toString(),
154         getVersionId(elementContext)).one();
155     return row == null
156         ? new HashSet<>()
157         : row.getSet(CassandraElementRepository.VersionElementsField.ELEMENT_IDS, String.class);
158   }
159
160   /*
161 CREATE TABLE IF NOT EXISTS element_namespace (
162         space text,
163         item_id text,
164         element_id text,
165         namespace text,
166         PRIMARY KEY (( space, item_id, element_id ))
167 );
168    */
169   @Accessor
170   interface ElementNamespaceAccessor {
171     @Query(
172         "UPDATE element_namespace SET namespace=:ns " +
173             "WHERE space=:space AND item_id=:item AND element_id=:id ")
174     void create(@Param("space") String space,
175                 @Param("item") String itemId,
176                 @Param("id") String elementId,
177                 @Param("ns") String namespace);
178   }
179
180   /*
181 CREATE TABLE IF NOT EXISTS element (
182         space text,
183         item_id text,
184         version_id text,
185         element_id text,
186         parent_id text,
187         namespace text,
188         info text,
189         relations text,
190         data blob,
191         searchable_data blob,
192         visualization blob,
193         sub_element_ids set<text>,
194         PRIMARY KEY (( space, item_id, version_id, element_id ))
195 );
196    */
197   @Accessor
198   interface ElementAccessor {
199     @Query(
200         "UPDATE zusammen_dox.element SET parent_id=:parentId, namespace=:ns, info=:info, " +
201             "relations=:rels, " +
202             "data=:data, searchable_data=:searchableData, visualization=:visualization, " +
203             "sub_element_ids=sub_element_ids+:subs " +
204             "WHERE space=:space AND item_id=:item AND version_id=:ver AND element_id=:id ")
205     void create(@Param("space") String space,
206                 @Param("item") String itemId,
207                 @Param("ver") String versionId,
208                 @Param("id") String elementId,
209                 @Param("parentId") String parentElementId,
210                 @Param("ns") String namespace,
211                 @Param("info") String info,
212                 @Param("rels") String relations,
213                 @Param("data") ByteBuffer data,
214                 @Param("searchableData") ByteBuffer searchableData,
215                 @Param("visualization") ByteBuffer visualization,
216                 @Param("subs") Set<String> subElementIds);
217
218     @Query("UPDATE zusammen_dox.element SET info=?, relations=?, data=?, searchable_data=?, " +
219         "visualization=?" +
220         " WHERE space=? AND item_id=? AND version_id=? AND element_id=?  ")
221     void update(String info, String relations, ByteBuffer data, ByteBuffer searchableData,
222                 ByteBuffer visualization, String space, String itemId, String versionId,
223                 String elementId);
224
225
226     @Query("SELECT parent_id, namespace, info, relations, data, searchable_data, visualization, " +
227         "sub_element_ids FROM zusammen_dox.element " +
228         "WHERE space=? AND item_id=? AND version_id=? AND element_id=? ")
229     ResultSet get(String space, String itemId, String versionId, String elementId);
230
231
232   }
233
234   private static final class ElementField {
235     private static final String NAMESPACE = "namespace";
236     private static final String PARENT_ID = "parent_id";
237     private static final String INFO = "info";
238     private static final String RELATIONS = "relations";
239     private static final String DATA = "data";
240     private static final String SEARCHABLE_DATA = "searchable_data";
241     private static final String VISUALIZATION = "visualization";
242     private static final String SUB_ELEMENT_IDS = "sub_element_ids";
243   }
244
245   /*
246   CREATE TABLE IF NOT EXISTS version_elements (
247     space text,
248     item_id text,
249     version_id text,
250     element_ids set<text>,
251     PRIMARY KEY (( space, item_id, version_id ))
252   );
253    */
254   @Accessor
255   interface VersionElementsAccessor {
256
257
258     @Query("SELECT element_ids FROM zusammen_dox.version_elements WHERE space=? AND item_id=? AND version_id=?")
259     ResultSet get(String space, String itemId, String versionId);
260
261
262   }
263
264   private static final class VersionElementsField {
265     private static final String ELEMENT_IDS = "element_ids";
266   }
267 }