1 /*******************************************************************************
2 * ============LICENSE_START========================================================================
3 * ONAP : ccsdk feature sdnr wt
4 * =================================================================================================
5 * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6 * =================================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software distributed under the License
13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14 * or implied. See the License for the specific language governing permissions and limitations under
16 * ============LICENSE_END==========================================================================
17 ******************************************************************************/
18 package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database;
20 import java.util.Collection;
21 import java.util.List;
22 import org.eclipse.jdt.annotation.Nullable;
23 import org.onap.ccsdk.features.sdnr.wt.common.database.DatabaseClient;
24 import org.onap.ccsdk.features.sdnr.wt.common.database.IsEsObject;
25 import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit;
26 import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
27 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
32 * Generic class to write lists of model classes to the database.
35 public class HtDataBaseReaderAndWriter<T extends IsEsObject> {
37 private static final Logger log = LoggerFactory.getLogger(HtDataBaseReaderAndWriter.class);
40 private final DatabaseClient db;
41 private final String dataTypeName;
42 private final HtMapper<T> mapper;
45 * Class specific access to database
46 * @param db ES database descriptor
47 * @param dataTypeName datatype name
48 * @param clazz class of datatype
50 public HtDataBaseReaderAndWriter(DatabaseClient db, String dataTypeName, Class<? extends T> clazz) {
53 this.dataTypeName = dataTypeName;
54 this.mapper = new HtMapper<>( clazz );
57 public boolean isExistsIndex() {
58 return this.db.isExistsIndex(this.dataTypeName);
61 * @return dataTypeName
63 public String getDataTypeName() {
64 return this.dataTypeName;
67 * Remove Object from database
68 * @param object Object with content
69 * @return true if remove is done
71 public boolean doRemove( T object) {
73 return db.doRemove(dataTypeName, object );
78 * Remove all data that match the filter
79 * @param query to specify data to be deleted
80 * @return number of removed objects
82 public int doRemoveByQuery(QueryBuilder query) {
84 int idx = 0; //Idx for getAll
85 int iterateLength = 100; //Step width for iterate
89 hits = db.doReadByQueryJsonData( dataTypeName, query).getHits();
90 log.debug("Found: {} elements: {} Failures: {}",dataTypeName,hits.size(), mapper.getMappingFailures());
94 for (SearchHit hit : hits) {
96 object = mapper.getObjectFromJson( hit.getSourceAsString() );
98 log.debug("Mapp Object: {}\nSource: '{}'\nResult: '{}'\n Failures: {}", hit.getId(), hit.getSourceAsString(), object, mapper.getMappingFailures());
100 object.setEsId( hit.getId() );
103 log.warn("Mapp result null Object: {}\n Source: '{}'\n : '", hit.getId(), hit.getSourceAsString());
106 } while (hits.size() == iterateLength); //Do it until end indicated, because less hits than iterateLength allows.
112 * Do the mapping for test purpose
113 * @param object object for test purpose
114 * @return json String
116 public String getJson( T object ) {
117 String json = mapper.objectToJson(object);
122 * Write one object into Database
123 * @param object Object with content
124 * @return This object for chained call pattern.
126 public T doWrite( T object) {
128 String json = mapper.objectToJson(object);
129 return doWrite(object, json);
134 * Write one object into Database
135 * @param object Object with content
137 * @return This object for chained call pattern.
139 public T doWrite( T object, String json) {
141 log.debug("doWrite {} {}",object.getClass().getSimpleName(), object.getEsId());
144 String esId = db.doWriteJsonString(dataTypeName, object, json);
145 object.setEsId(esId);
146 log.debug("doWrite done for {} {}",object.getClass().getSimpleName(), object.getEsId());
147 return esId == null ? null : object;
149 log.warn("Can not map object and write to database. {} {}",object.getClass().getSimpleName(), object);
157 * Write a list of Objects to the database.
158 * @param list Object list with content
159 * @return This object for chained call pattern.
161 public HtDataBaseReaderAndWriter<T> doWrite( Collection<T> list) {
164 log.debug("Write to ES database {} Class: {} {} elements",dataTypeName, mapper.getClazz().getSimpleName(), list.size());
166 if (list != null && !list.isEmpty()) {
168 if ( doWrite(s) == null ) {
169 if ( ++writeError > 5 ) {
170 log.warn("Leave because of to >5 write errors");
181 * Read one object via the object class specific ID
182 * @param object Object refrenced by idString
183 * @return The Object if found or null
185 public @Nullable T doRead( IsEsObject object ) {
186 T res = mapper.getObjectFromJson( db.doReadJsonData( dataTypeName, object) );
188 res.setEsId(object.getEsId());
194 * Read one object via the object class specific ID
195 * @param objectEsId Object refrence
196 * @return The Object if found or null
198 public @Nullable T doRead( String objectEsId ) {
199 T res = mapper.getObjectFromJson( db.doReadJsonData( dataTypeName, objectEsId ) );
201 res.setEsId(objectEsId);
206 * Get all elements of related type
207 * @return all Elements
209 public SearchResult<T> doReadAll() {
210 return doReadAll(null);
214 * Read all existing objects of a type
215 * @param query for the elements
216 * @return the list of all objects
219 public SearchResult<T> doReadAll(QueryBuilder query) {
221 SearchResult<T> res = new SearchResult<>();
222 int idx = 0; //Idx for getAll
223 int iterateLength = 100; //Step width for iterate
225 SearchResult<SearchHit> result;
226 List<SearchHit> hits;
229 log.debug("read data in {} with query {}",dataTypeName,query.toJSON());
230 result=db.doReadByQueryJsonData( dataTypeName, query);
233 result = db.doReadAllJsonData( dataTypeName);
235 hits=result.getHits();
236 log.debug("Read: {} elements: {} Failures: {}",dataTypeName,hits.size(), mapper.getMappingFailures());
239 idx += result.getHits().size();
240 for (SearchHit hit : hits) {
242 // object = mapper.getObjectFromJson( hit.getSourceRef() );
243 object = mapper.getObjectFromJson( hit.getSourceAsString() );
245 log.debug("Mapp Object: {}\nSource: '{}'\nResult: '{}'\n Failures: {}", hit.getId(), hit.getSourceAsString(), object, mapper.getMappingFailures());
246 if (object != null) {
247 object.setEsId( hit.getId() );
250 log.warn("Mapp result null Object: {}\n Source: '{}'\n : '", hit.getId(), hit.getSourceAsString());
253 } while (hits.size() == iterateLength); //Do it until end indicated, because less hits than iterateLength allows.