2 * Copyright © 2016-2017 European Support Limited
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.openecomp.core.tools.store;
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;
35 import java.lang.reflect.Type;
36 import java.nio.ByteBuffer;
38 import java.util.stream.Collectors;
40 public class CassandraElementRepository {
43 public Collection<ElementEntity> list(SessionContext context,
44 ElementEntityContext elementContext) {
45 Set<String> elementIds = getVersionElementIds(context, elementContext);
47 return elementIds.stream()
48 .map(elementId -> get(context, elementContext, new ElementEntity(new Id(elementId))).get())
49 .filter(Objects::nonNull)
50 .collect(Collectors.toList());
54 public void update(SessionContext context, ElementEntityContext elementContext,
55 ElementEntity element) {
56 updateElement(context, elementContext, element);
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();
68 return row == null ? Optional.empty() : Optional.of(getElementEntity(element, row));
72 private String getVersionId(ElementEntityContext elementContext) {
73 return elementContext.getChangeRef() == null
74 ? elementContext.getVersionId().toString()
75 : elementContext.getChangeRef();
79 private ElementAccessor getElementAccessor(SessionContext context) {
80 return NoSqlDbFactory.getInstance().createInterface().getMappingManager().createAccessor
81 (ElementAccessor.class);
85 private VersionElementsAccessor getVersionElementsAccessor() {
86 return NoSqlDbFactory.getInstance().createInterface().getMappingManager().createAccessor
87 (VersionElementsAccessor.class);
92 private void updateElement(SessionContext context, ElementEntityContext elementContext,
93 ElementEntity element) {
95 if (elementContext.getChangeRef() == null) {
97 getElementAccessor(context).update(
98 JsonUtil.object2Json(element.getInfo()),
99 JsonUtil.object2Json(element.getRelations()),
101 element.getSearchableData(),
102 element.getVisualization(),
103 elementContext.getSpace(),
104 elementContext.getItemId().toString(),
105 elementContext.getVersionId().toString(),
106 element.getId().toString());
108 getElementAccessor(context).update(
109 JsonUtil.object2Json(element.getInfo()),
110 JsonUtil.object2Json(element.getRelations()),
112 element.getSearchableData(),
113 element.getVisualization(),
114 elementContext.getSpace(),
115 elementContext.getItemId().toString(),
116 elementContext.getChangeRef(),
117 element.getId().toString());
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>>() {
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()));
137 private Namespace getNamespace(String namespaceStr) {
138 Namespace namespace = new Namespace();
139 if (namespaceStr != null) {
140 namespace.setValue(namespaceStr);
145 private static <T> T json2Object(String json, Type typeOfT) {
146 return json == null ? null : JsonUtil.json2Object(json, typeOfT);
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();
157 : row.getSet(CassandraElementRepository.VersionElementsField.ELEMENT_IDS, String.class);
161 CREATE TABLE IF NOT EXISTS element_namespace (
166 PRIMARY KEY (( space, item_id, element_id ))
170 interface ElementNamespaceAccessor {
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);
181 CREATE TABLE IF NOT EXISTS element (
191 searchable_data blob,
193 sub_element_ids set<text>,
194 PRIMARY KEY (( space, item_id, version_id, element_id ))
198 interface ElementAccessor {
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);
218 @Query("UPDATE zusammen_dox.element SET info=?, relations=?, data=?, searchable_data=?, " +
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,
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);
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";
246 CREATE TABLE IF NOT EXISTS version_elements (
250 element_ids set<text>,
251 PRIMARY KEY (( space, item_id, version_id ))
255 interface VersionElementsAccessor {
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);
264 private static final class VersionElementsField {
265 private static final String ELEMENT_IDS = "element_ids";