56402bdfc038b3c6ec62b3161a181c787871142c
[ccsdk/features.git] / sdnr / wt / common / src / main / java / org / onap / ccsdk / features / sdnr / wt / common / database / HtDatabaseClient.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.common.database;
19
20 import java.io.IOException;
21 import java.util.List;
22 import javax.annotation.Nonnull;
23 import javax.annotation.Nullable;
24
25 import org.json.JSONObject;
26 import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
27 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
28 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
29 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest;
30 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteRequest;
31 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetIndexRequest;
32 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetRequest;
33 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.IndexRequest;
34 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.RefreshIndexRequest;
35 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
36 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateByQueryRequest;
37 import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateRequest;
38 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteByQueryResponse;
39 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteResponse;
40 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.GetResponse;
41 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.IndexResponse;
42 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.RefreshIndexResponse;
43 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
44 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateByQueryResponse;
45 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateResponse;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48
49 /**
50  * @author Herbert, Micha
51  *
52  * Hint: Elasticsearch index/alias and doctype will be the same value
53  *       server side restricted since ES 5.0
54  *
55  */
56 public class HtDatabaseClient extends ExtRestClient implements DatabaseClient, AutoCloseable {
57
58         private static final boolean REFRESH_AFTER_REWRITE_DEFAULT = true;
59
60         private final Logger LOG = LoggerFactory.getLogger(HtDatabaseClient.class);
61
62         private boolean doRefreshAfterWrite;
63     public HtDatabaseClient(HostInfo[] hosts) {
64                 this(hosts,REFRESH_AFTER_REWRITE_DEFAULT);
65         }
66     public HtDatabaseClient(HostInfo[] hosts, boolean refreshAfterWrite) {
67                 super(hosts);
68                 this.doRefreshAfterWrite = refreshAfterWrite;
69         }
70
71     public HtDatabaseClient(HostInfo[] hosts, boolean refreshAfterWrite,String username,String password) {
72                 super(hosts,username,password);
73                 this.doRefreshAfterWrite = refreshAfterWrite;
74         }
75     public HtDatabaseClient(HostInfo[] hosts,String username,String password) {
76                 this(hosts,REFRESH_AFTER_REWRITE_DEFAULT,username,password);
77         }
78
79
80
81     /*----------------------------------
82      * Functions
83      */
84
85    /**
86     * Close function
87     */
88    @Override
89    public void close() {
90        try {
91                         super.close();
92                 } catch (IOException e) {
93                         LOG.warn("Problem closing db client: {}",e);
94                 }
95    }
96
97     @Override
98     public boolean isExistsIndex(String esIndexAlias) {
99
100         LOG.debug("Check status of ES index: {}", esIndexAlias);
101
102         GetIndexRequest request = new GetIndexRequest(esIndexAlias);
103
104                 boolean indexStatus = false;
105                 try {
106                         indexStatus = this.indicesExists(request);
107                 } catch (IOException e) {
108                         LOG.warn("Problem checking index for {}: {}",esIndexAlias,e);
109                 }
110
111         return indexStatus;
112
113     }
114
115     @Override
116     public @Nullable String doWriteJsonString(String dataTypeName, @Nonnull IsEsObject esId, String json) {
117         return doWriteRaw(dataTypeName, esId.getEsId(), json);
118     }
119
120     @Override
121     public @Nullable String doWriteRaw(String dataTypeName, @Nullable String esId, String json) {
122                  return this.doWriteRaw(dataTypeName, dataTypeName, esId, json);
123     }
124     @Override
125     public @Nullable String doWriteRaw(String indexName,String dataTypeName, @Nullable String esId, String json) {
126                    
127         IndexResponse response = null;
128         IndexRequest indexRequest = new IndexRequest(indexName,dataTypeName,esId);
129         indexRequest.source(json);
130         try {
131             response = this.index(indexRequest );
132         } catch (IOException e) {
133             LOG.warn("ES Exception {} Json: {}", e.getMessage(), json);
134         }
135
136         if (response == null) {
137             LOG.warn("Response null during write: {} {}", esId, json);
138             return null;
139         }
140                 if(this.doRefreshAfterWrite) {
141                         this.doRefresh(dataTypeName);
142                 }
143                 return response.getId();
144     }
145
146     private void doRefresh(String dataTypeName) {
147                 try {
148                         RefreshIndexResponse response = this.refreshIndex(new RefreshIndexRequest(dataTypeName));
149                         if(!response.succeeded()) {
150                                 LOG.warn("seems that index {} was not refreshed",dataTypeName);
151                         }
152                 } catch (IOException e) {
153                         LOG.warn("problem with refreshing index: {}",e);
154                 }
155                 
156         }
157         @Override
158     public boolean doRemove(String dataTypeName, IsEsObject esId) {
159         return doRemove(dataTypeName, esId.getEsId());
160     }
161
162
163     @Override
164     public boolean doRemove(String dataTypeName, String esId) {
165         DeleteRequest deleteRequest = new DeleteRequest(dataTypeName,dataTypeName,esId);
166                 DeleteResponse response = null;
167                 try {
168                         response = this.delete(deleteRequest);
169                 } catch (IOException e) {
170                         LOG.warn("Problem deleting from db: {}",e.getMessage());
171                 }
172                 if(this.doRefreshAfterWrite) {
173                         this.doRefresh(dataTypeName);
174                 }
175         return response!=null?response.isDeleted():false;
176     }
177
178     @Override
179     public @Nullable String doReadJsonData(String dataTypeName, @Nonnull IsEsObject esId) {
180
181         if (esId.getEsId() == null) {
182             throw new IllegalArgumentException("Read access to object without database Id");
183         }
184
185         return doReadJsonData(dataTypeName, esId.getEsId());
186     }
187
188     @Override
189     public @Nullable String doReadJsonData(String dataTypeName, @Nonnull String esId) {
190
191         LOG.debug("NetworkIndex read: {}", dataTypeName);
192         GetRequest getRequest = new GetRequest(dataTypeName,dataTypeName,esId);
193                 GetResponse response = null;
194                 try {
195                         response = this.get(getRequest);
196                 } catch (IOException e) {
197                         LOG.warn("problem reading data {} with id {}: {}",dataTypeName,esId,e);
198                 }
199         return response!=null && response.isExists() ? response.getSourceAsBytesRef() : null;
200     }
201
202         @Override
203         public @Nonnull SearchResult<SearchHit> doReadByQueryJsonData(String dataTypeName, QueryBuilder queryBuilder) {
204
205                 return this.doReadByQueryJsonData(dataTypeName, queryBuilder, false);
206         }
207
208         @Override
209         public @Nonnull SearchResult<SearchHit> doReadByQueryJsonData(String dataTypeName,QueryBuilder queryBuilder, boolean ignoreException) {
210
211                 long total = 0;
212                 LOG.debug("NetworkIndex query and read: {}", dataTypeName);
213
214                 SearchRequest searchRequest = new SearchRequest(dataTypeName, dataTypeName);
215                 searchRequest.setQuery(queryBuilder);
216                 SearchResponse response = null;
217                 try {
218                         response = this.search(searchRequest,ignoreException);
219                         total = response.getTotal();
220
221                 } catch (IOException e) {
222                         LOG.warn("error do search {}: {}", queryBuilder, e);
223                 }
224                 return new SearchResult<SearchHit>(response != null ? response.getHits() : new SearchHit[] {}, total);
225         }
226         @Override
227         public @Nonnull SearchResult<SearchHit> doReadAllJsonData(String dataTypeName) {
228                 return this.doReadAllJsonData( dataTypeName,false);
229         }
230     @Override
231         public @Nonnull SearchResult<SearchHit> doReadAllJsonData( String dataTypeName, boolean ignoreException) {
232         // Use query
233         return doReadByQueryJsonData( dataTypeName, QueryBuilders.matchAllQuery(),ignoreException);
234         }
235
236    
237         @Override
238         public String doUpdateOrCreate(String dataTypeName, String esId, String json) {
239                         return this.doUpdateOrCreate(dataTypeName, esId, json,null);
240         }
241
242
243
244         @Override
245         public String doUpdateOrCreate(String dataTypeName, String esId, String json, List<String> onlyForInsert) {
246                 if(esId==null) {
247                         LOG.warn("try to update or insert {} with id null is not allowed.",dataTypeName);
248                         return null;
249                 }
250                 boolean success = false;
251                 UpdateRequest request = new UpdateRequest(dataTypeName, dataTypeName, esId);
252                 request.source(new JSONObject(json),onlyForInsert);
253                 try {
254                         UpdateResponse response = this.update(request);
255                         success = response.succeeded();
256                 } catch (IOException e) {
257                         LOG.warn("Problem updating {} with id {} and data {}: {}", dataTypeName, esId, json, e);
258                 }
259                 if(this.doRefreshAfterWrite) {
260                         this.doRefresh(dataTypeName);
261                 }
262                 return success ? esId : null;
263         }
264         @Override
265         public String doUpdate(String dataTypeName, String json, QueryBuilder query) {
266                 boolean success = false;
267                 UpdateByQueryRequest request = new UpdateByQueryRequest(dataTypeName, dataTypeName );
268                 request.source(new JSONObject(json),query);
269                 try {
270                         UpdateByQueryResponse response = this.update(request);
271                         success = !response.hasFailures();
272                 } catch (IOException e) {
273                         LOG.warn("Problem updating items in {} with query {} and data {}: {}", dataTypeName, query, json, e);
274                 }
275                 if(this.doRefreshAfterWrite) {
276                         this.doRefresh(dataTypeName);
277                 }
278                 return success?"":null;
279         }
280
281
282
283         @Override
284         public int doRemove(String dataTypeName, QueryBuilder query) {
285                 int del=0;
286                 DeleteByQueryRequest request = new DeleteByQueryRequest(dataTypeName);
287                 request.source(query);
288                 try {
289                         DeleteByQueryResponse response = this.deleteByQuery(request);
290                         del = response.getDeleted();
291                 } catch (IOException e) {
292                         LOG.warn("Problem delete in {} with query {}:{} ", dataTypeName, query.toJSON(), e);
293                 }
294                 if(this.doRefreshAfterWrite) {
295                         this.doRefresh(dataTypeName);
296                 }
297                 return del;
298         }
299
300 }