Merge "update helpserver"
[ccsdk/features.git] / sdnr / wt / devicemanager / provider / src / main / java / org / onap / ccsdk / features / sdnr / wt / devicemanager / impl / database / HtDataBaseReaderAndWriter.java
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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
15  * the License.
16  * ============LICENSE_END==========================================================================
17  ******************************************************************************/
18 package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database;
19
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;
30
31 /**
32  * Generic class to write lists of model classes to the database.
33  *
34  */
35 public class HtDataBaseReaderAndWriter<T extends IsEsObject> {
36
37     private static final Logger log = LoggerFactory.getLogger(HtDataBaseReaderAndWriter.class);
38
39
40     private final DatabaseClient db;
41     private final String dataTypeName;
42     private final HtMapper<T> mapper;
43
44     /**
45      * Class specific access to database
46      * @param db ES database descriptor
47      * @param dataTypeName datatype name
48      * @param clazz class of datatype
49      */
50     public HtDataBaseReaderAndWriter(DatabaseClient db, String dataTypeName, Class<? extends T> clazz) {
51
52         this.db = db;
53         this.dataTypeName = dataTypeName;
54         this.mapper = new HtMapper<>( clazz );
55
56     }
57     public boolean isExistsIndex() {
58         return this.db.isExistsIndex(this.dataTypeName);
59     }
60     /**
61      * @return dataTypeName
62      */
63     public String getDataTypeName() {
64         return this.dataTypeName;
65     }
66     /**
67      * Remove Object from database
68      * @param object Object with content
69      * @return true if remove is done
70      */
71     public boolean doRemove( T object) {
72
73         return db.doRemove(dataTypeName, object );
74
75     }
76
77     /**
78      * Remove all data that match the filter
79      * @param query to specify data to be deleted
80      * @return number of removed objects
81      */
82     public int doRemoveByQuery(QueryBuilder query) {
83
84         int idx = 0;                //Idx for getAll
85         int iterateLength = 100;    //Step width for iterate
86
87         List<SearchHit> hits;
88         do {
89             hits = db.doReadByQueryJsonData( dataTypeName, query).getHits();
90             log.debug("Found: {} elements: {}  Failures: {}",dataTypeName,hits.size(), mapper.getMappingFailures());
91
92             T object;
93             idx += hits.size();
94             for (SearchHit hit : hits) {
95
96                 object = mapper.getObjectFromJson( hit.getSourceAsString() );
97
98                 log.debug("Mapp Object: {}\nSource: '{}'\nResult: '{}'\n Failures: {}", hit.getId(), hit.getSourceAsString(), object, mapper.getMappingFailures());
99                 if (object != null) {
100                     object.setEsId( hit.getId() );
101                     doRemove(object);
102                 } else {
103                     log.warn("Mapp result null Object: {}\n Source: '{}'\n : '", hit.getId(), hit.getSourceAsString());
104                 }
105             }
106         } while (hits.size() == iterateLength); //Do it until end indicated, because less hits than iterateLength allows.
107
108         return idx;
109     }
110
111     /**
112      * Do the mapping for test purpose
113      * @param object object for test purpose
114      * @return json String
115      */
116     public String getJson( T object ) {
117         String json = mapper.objectToJson(object);
118         return json;
119     }
120
121     /**
122      * Write one object into Database
123      * @param object Object with content
124      * @return This object for chained call pattern.
125      */
126     public T doWrite( T object) {
127
128         String json = mapper.objectToJson(object);
129         return doWrite(object, json);
130
131     }
132
133     /**
134      * Write one object into Database
135      * @param object Object with content
136      * @param json string
137      * @return This object for chained call pattern.
138      */
139     public T doWrite( T object, String json) {
140
141         log.debug("doWrite {} {}",object.getClass().getSimpleName(), object.getEsId());
142
143         if (json != null) {
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;
148         } else {
149             log.warn("Can not map object and write to database. {} {}",object.getClass().getSimpleName(), object);
150             return null;
151         }
152
153     }
154
155
156     /**
157      * Write a list of Objects to the database.
158      * @param list Object list with content
159      * @return This object for chained call pattern.
160      */
161     public HtDataBaseReaderAndWriter<T> doWrite( Collection<T> list) {
162
163         int writeError = 0;
164         log.debug("Write to ES database {} Class: {}  {} elements",dataTypeName, mapper.getClazz().getSimpleName(), list.size());
165
166         if (list != null && !list.isEmpty()) {
167             for( T s : list ) {
168                 if ( doWrite(s) == null )  {
169                     if ( ++writeError > 5 ) {
170                         log.warn("Leave because of to >5 write errors");
171                         break;
172                     }
173                 }
174             }
175         }
176
177         return this;
178     }
179
180     /**
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
184      */
185     public @Nullable T doRead( IsEsObject object ) {
186         T res = mapper.getObjectFromJson( db.doReadJsonData( dataTypeName, object) );
187         if (res != null) {
188             res.setEsId(object.getEsId());
189         }
190         return res;
191     }
192
193     /**
194      * Read one object via the object class specific ID
195      * @param objectEsId Object refrence
196      * @return The Object if found or null
197      */
198     public @Nullable T doRead( String objectEsId ) {
199         T res = mapper.getObjectFromJson( db.doReadJsonData( dataTypeName, objectEsId ) );
200         if (res != null) {
201             res.setEsId(objectEsId);
202         }
203         return res;
204     }
205     /**
206      * Get all elements of related type
207      * @return all Elements
208      */
209     public SearchResult<T> doReadAll() {
210         return doReadAll(null);
211     }
212
213     /**
214      * Read all existing objects of a type
215      * @param query for the elements
216      * @return the list of all objects
217      */
218
219     public SearchResult<T> doReadAll(QueryBuilder query) {
220
221         SearchResult<T> res = new SearchResult<>();
222         int idx = 0;                //Idx for getAll
223         int iterateLength = 100;    //Step width for iterate
224
225         SearchResult<SearchHit> result;
226         List<SearchHit> hits;
227         do {
228             if(query!=null) {
229                 log.debug("read data in {} with query {}",dataTypeName,query.toJSON());
230                 result=db.doReadByQueryJsonData( dataTypeName, query);
231             }
232             else {
233                 result = db.doReadAllJsonData( dataTypeName);
234             }
235             hits=result.getHits();
236             log.debug("Read: {} elements: {}  Failures: {}",dataTypeName,hits.size(), mapper.getMappingFailures());
237
238             T object;
239             idx += result.getHits().size();
240             for (SearchHit hit : hits) {
241
242 //                object = mapper.getObjectFromJson( hit.getSourceRef() );
243                 object = mapper.getObjectFromJson( hit.getSourceAsString() );
244
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() );
248                     res.add( object );
249                 } else {
250                     log.warn("Mapp result null Object: {}\n Source: '{}'\n : '", hit.getId(), hit.getSourceAsString());
251                 }
252             }
253         } while (hits.size() == iterateLength); //Do it until end indicated, because less hits than iterateLength allows.
254         res.setTotal(idx);
255         return res;
256     }
257
258 }