9e7fc18bce15d0999cc3f405addd97911d134850
[ccsdk/features.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk features
4  * ================================================================================
5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
6  * All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  *
21  */
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl;
23
24 import com.google.common.util.concurrent.ListenableFuture;
25 import java.io.IOException;
26 import java.io.PrintWriter;
27 import java.io.StringWriter;
28 import java.util.concurrent.TimeUnit;
29 import org.eclipse.jdt.annotation.NonNull;
30 import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
31 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
32 import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
33 import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl;
34 import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.MediatorServerDataProvider;
35 import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet;
36 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
37 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance;
38 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager;
39 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig;
40 import org.opendaylight.mdsal.binding.api.RpcProviderService;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerOutput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateNetworkElementConnectionInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateNetworkElementConnectionOutput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DataProviderService;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMaintenanceInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMaintenanceOutput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerOutput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteNetworkElementConnectionInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteNetworkElementConnectionOutput;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadConnectionlogListInput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadConnectionlogListOutput;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadEventlogListInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadEventlogListOutput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultcurrentListInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultcurrentListOutput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultlogListInput;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultlogListOutput;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadGuiCutThroughEntryInput;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadGuiCutThroughEntryOutput;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadInventoryListInput;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadInventoryListOutput;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMaintenanceListInput;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMaintenanceListOutput;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMediatorServerListInput;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMediatorServerListOutput;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadNetworkElementConnectionListInput;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadNetworkElementConnectionListOutput;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mDeviceListInput;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mDeviceListOutput;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mListInput;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mListOutput;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mLtpListInput;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mLtpListOutput;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hDeviceListInput;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hDeviceListOutput;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hListInput;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hListOutput;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hLtpListInput;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hLtpListOutput;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadStatusInput;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadStatusOutput;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMaintenanceInput;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMaintenanceOutput;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMediatorServerInput;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMediatorServerOutput;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionInput;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionOutput;
92 import org.opendaylight.yangtools.concepts.Builder;
93 import org.opendaylight.yangtools.concepts.ObjectRegistration;
94 import org.opendaylight.yangtools.yang.binding.DataObject;
95 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
96 import org.opendaylight.yangtools.yang.common.RpcResult;
97 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
98 import org.slf4j.Logger;
99 import org.slf4j.LoggerFactory;
100
101 public class DataProviderServiceImpl implements DataProviderService, AutoCloseable {
102
103     private static final Logger LOG = LoggerFactory.getLogger(DataProviderServiceImpl.class);
104     public static final String CONFIGURATIONFILE = "etc/dataprovider.properties";
105     private static final long DATABASE_TIMEOUT_MS = 120 * 1000L;
106
107     private final ObjectRegistration<@NonNull DataProviderServiceImpl> rpcReg;
108     private final ElasticSearchDataProvider dataProvider;
109     private final ConfigurationFileRepresentation configuration;
110     private final EsConfig esConfig;
111     private final MediatorServerDataProvider mediatorServerDataProvider;
112     private final HtUserdataManager dbUserManager;
113
114     DataProviderServiceImpl(final RpcProviderService rpcProviderService, MsServlet mediatorServerServlet)
115             throws Exception {
116         this.configuration = new ConfigurationFileRepresentation(CONFIGURATIONFILE);
117         this.esConfig = new EsConfig(configuration);
118         this.dataProvider = new ElasticSearchDataProvider(esConfig.getHosts(), esConfig.getBasicAuthUsername(),
119                 esConfig.getBasicAuthPassword(), esConfig.trustAllCerts());
120         this.dataProvider.waitForYellowDatabaseStatus(DATABASE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
121         this.mediatorServerDataProvider = new MediatorServerDataProvider(esConfig.getHosts(),
122                 esConfig.getBasicAuthUsername(), esConfig.getBasicAuthPassword(),esConfig.trustAllCerts());
123         mediatorServerServlet.setDataProvider(this.mediatorServerDataProvider);
124         this.dbUserManager = new HtUserdataManagerImpl(this.dataProvider.getRawClient());
125         // Register ourselves as the REST API RPC implementation
126         LOG.info("Register RPC Service " + DataProviderServiceImpl.class.getSimpleName());
127         this.rpcReg = rpcProviderService.registerRpcImplementation(DataProviderService.class, this);
128     }
129
130     private void sendResyncCallbackToApiGateway() {
131         mediatorServerDataProvider.triggerReloadSync();
132     }
133
134     /**
135      * @return dataProvider
136      */
137     public DataProvider getDataProvider() {
138         return dataProvider.getDataProvider();
139     }
140
141     public HtDatabaseClient getRawClient() {
142         return this.dataProvider.getRawClient();
143     }
144
145     /**
146      * @return data provider for Maintenance()
147      */
148     public HtDatabaseMaintenance getHtDatabaseMaintenance() {
149         return dataProvider.getHtDatabaseMaintenance();
150     }
151
152     /**
153      * @return configuration object
154      */
155     public IEsConfig getEsConfig() {
156         return esConfig;
157     }
158
159
160     @Override
161     public void close() throws Exception {
162         LOG.info("Close RPC Service");
163         if (rpcReg != null) {
164             rpcReg.close();
165         }
166     }
167
168     @Override
169     public ListenableFuture<RpcResult<ReadFaultcurrentListOutput>> readFaultcurrentList(
170             ReadFaultcurrentListInput input) {
171         LOG.debug("RPC Request: readFaultCurrentList with input {}", input);
172         RpcResultBuilder<ReadFaultcurrentListOutput> result =
173                 read(() -> DataProviderServiceImpl.this.dataProvider.readFaultCurrentList(input));
174         return result.buildFuture();
175     }
176
177     @Override
178     public ListenableFuture<RpcResult<ReadFaultlogListOutput>> readFaultlogList(ReadFaultlogListInput input) {
179         LOG.debug("RPC Request: readFaultlogList with input {}", input);
180         RpcResultBuilder<ReadFaultlogListOutput> result =
181                 read(() -> DataProviderServiceImpl.this.dataProvider.readFaultLogList(input));
182         return result.buildFuture();
183     }
184
185     @Override
186     public ListenableFuture<RpcResult<ReadMaintenanceListOutput>> readMaintenanceList(ReadMaintenanceListInput input) {
187         LOG.debug("RPC Request: readMaintenanceList with input {}", input);
188         RpcResultBuilder<ReadMaintenanceListOutput> result =
189                 read(() -> DataProviderServiceImpl.this.dataProvider.readMaintenanceList(input));
190         return result.buildFuture();
191     }
192
193     @Override
194     public ListenableFuture<RpcResult<ReadMediatorServerListOutput>> readMediatorServerList(
195             ReadMediatorServerListInput input) {
196         LOG.debug("RPC Request: readMediatorServerList with input {}", input);
197         RpcResultBuilder<ReadMediatorServerListOutput> result =
198                 read(() -> DataProviderServiceImpl.this.dataProvider.readMediatorServerList(input));
199         return result.buildFuture();
200     }
201
202     @Override
203     public ListenableFuture<RpcResult<ReadNetworkElementConnectionListOutput>> readNetworkElementConnectionList(
204             ReadNetworkElementConnectionListInput input) {
205         LOG.debug("RPC Request: readNetworkElementConnectionList with input {}", input);
206         RpcResultBuilder<ReadNetworkElementConnectionListOutput> result =
207                 read(() -> DataProviderServiceImpl.this.dataProvider.readNetworkElementConnectionList(input));
208         return result.buildFuture();
209
210     }
211
212     @Override
213     public ListenableFuture<RpcResult<ReadPmdata15mListOutput>> readPmdata15mList(ReadPmdata15mListInput input) {
214         LOG.debug("RPC Request: readPmdata15mList with input {}", input);
215         RpcResultBuilder<ReadPmdata15mListOutput> result =
216                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mList(input));
217         return result.buildFuture();
218
219     }
220
221     @Override
222     public ListenableFuture<RpcResult<ReadPmdata24hListOutput>> readPmdata24hList(ReadPmdata24hListInput input) {
223         LOG.debug("RPC Request: readPmdata24hList with input {}", input);
224         RpcResultBuilder<ReadPmdata24hListOutput> result =
225                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hList(input));
226         return result.buildFuture();
227
228     }
229
230     @Override
231     public ListenableFuture<RpcResult<ReadStatusOutput>> readStatus(ReadStatusInput input) {
232         LOG.debug("RPC Request: readStatusEntityList with input {}", input);
233         RpcResultBuilder<ReadStatusOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.readStatus());
234         return result.buildFuture();
235
236     }
237
238     @Override
239     public ListenableFuture<RpcResult<ReadInventoryListOutput>> readInventoryList(ReadInventoryListInput input) {
240         LOG.debug("RPC Request: readInventoryList with input {}", input);
241         RpcResultBuilder<ReadInventoryListOutput> result =
242                 read(() -> DataProviderServiceImpl.this.dataProvider.readInventoryList(input));
243         return result.buildFuture();
244     }
245
246     @Override
247     public ListenableFuture<RpcResult<ReadPmdata15mLtpListOutput>> readPmdata15mLtpList(
248             ReadPmdata15mLtpListInput input) {
249         LOG.debug("RPC Request: readPmdata15mLtpList with input {}", input);
250         RpcResultBuilder<ReadPmdata15mLtpListOutput> result =
251                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mLtpList(input));
252         return result.buildFuture();
253     }
254
255     @Override
256     public ListenableFuture<RpcResult<ReadPmdata15mDeviceListOutput>> readPmdata15mDeviceList(
257             ReadPmdata15mDeviceListInput input) {
258         LOG.debug("RPC Request: readPmdata15mDeviceList with input {}", input);
259         RpcResultBuilder<ReadPmdata15mDeviceListOutput> result =
260                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mDeviceList(input));
261         return result.buildFuture();
262     }
263
264     @Override
265     public ListenableFuture<RpcResult<ReadPmdata24hLtpListOutput>> readPmdata24hLtpList(
266             ReadPmdata24hLtpListInput input) {
267         LOG.debug("RPC Request: readPmdata24hLtpList with input {}", input);
268         RpcResultBuilder<ReadPmdata24hLtpListOutput> result =
269                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hLtpList(input));
270         return result.buildFuture();
271     }
272
273     @Override
274     public ListenableFuture<RpcResult<ReadPmdata24hDeviceListOutput>> readPmdata24hDeviceList(
275             ReadPmdata24hDeviceListInput input) {
276         LOG.debug("RPC Request: readPmdata24hDeviceList with input {}", input);
277         RpcResultBuilder<ReadPmdata24hDeviceListOutput> result =
278                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hDeviceList(input));
279         return result.buildFuture();
280     }
281
282     @Override
283     public ListenableFuture<RpcResult<ReadConnectionlogListOutput>> readConnectionlogList(
284             ReadConnectionlogListInput input) {
285         LOG.debug("RPC Request: readConnectionlogList with input {}", input);
286         RpcResultBuilder<ReadConnectionlogListOutput> result =
287                 read(() -> DataProviderServiceImpl.this.dataProvider.readConnectionlogList(input));
288         return result.buildFuture();
289     }
290
291     @Override
292     public ListenableFuture<RpcResult<CreateNetworkElementConnectionOutput>> createNetworkElementConnection(
293             CreateNetworkElementConnectionInput input) {
294         LOG.debug("RPC Request: createNetworkElementConnection with input {}", input);
295         RpcResultBuilder<CreateNetworkElementConnectionOutput> result =
296                 read(() -> DataProviderServiceImpl.this.dataProvider.createNetworkElementConnection(input));
297         return result.buildFuture();
298     }
299
300     @Override
301     public ListenableFuture<RpcResult<UpdateNetworkElementConnectionOutput>> updateNetworkElementConnection(
302             UpdateNetworkElementConnectionInput input) {
303         LOG.debug("RPC Request: updateNetworkElementConnection with input {}", input);
304         RpcResultBuilder<UpdateNetworkElementConnectionOutput> result =
305                 read(() -> DataProviderServiceImpl.this.dataProvider.updateNetworkElementConnection(input));
306         return result.buildFuture();
307     }
308
309     @Override
310     public ListenableFuture<RpcResult<DeleteNetworkElementConnectionOutput>> deleteNetworkElementConnection(
311             DeleteNetworkElementConnectionInput input) {
312         LOG.debug("RPC Request: deleteNetworkElementConnection with input {}", input);
313         RpcResultBuilder<DeleteNetworkElementConnectionOutput> result =
314                 read(() -> DataProviderServiceImpl.this.dataProvider.deleteNetworkElementConnection(input));
315         return result.buildFuture();
316     }
317
318     @Override
319     public ListenableFuture<RpcResult<DeleteMediatorServerOutput>> deleteMediatorServer(
320             DeleteMediatorServerInput input) {
321         LOG.debug("RPC Request: deleteMediatorServer with input {}", input);
322         RpcResultBuilder<DeleteMediatorServerOutput> result =
323                 read(() -> DataProviderServiceImpl.this.dataProvider.deleteMediatorServer(input));
324         this.sendResyncCallbackToApiGateway();
325         return result.buildFuture();
326     }
327
328     @Override
329     public ListenableFuture<RpcResult<CreateMediatorServerOutput>> createMediatorServer(
330             CreateMediatorServerInput input) {
331         LOG.debug("RPC Request: createMediatorServer with input {}", input);
332         RpcResultBuilder<CreateMediatorServerOutput> result =
333                 read(() -> DataProviderServiceImpl.this.dataProvider.createMediatorServer(input));
334         this.sendResyncCallbackToApiGateway();
335         return result.buildFuture();
336     }
337
338     @Override
339     public ListenableFuture<RpcResult<CreateMaintenanceOutput>> createMaintenance(CreateMaintenanceInput input) {
340         LOG.debug("RPC Request: createMaintenance with input {}", input);
341         RpcResultBuilder<CreateMaintenanceOutput> result =
342                 read(() -> DataProviderServiceImpl.this.dataProvider.createMaintenance(input));
343         return result.buildFuture();
344     }
345
346     @Override
347     public ListenableFuture<RpcResult<DeleteMaintenanceOutput>> deleteMaintenance(DeleteMaintenanceInput input) {
348         LOG.debug("RPC Request: deleteMaintenance with input {}", input);
349         RpcResultBuilder<DeleteMaintenanceOutput> result =
350                 read(() -> DataProviderServiceImpl.this.dataProvider.deleteMaintenance(input));
351         return result.buildFuture();
352     }
353
354     @Override
355     public ListenableFuture<RpcResult<UpdateMediatorServerOutput>> updateMediatorServer(
356             UpdateMediatorServerInput input) {
357         LOG.debug("RPC Request: updateMediatorServer with input {}", input);
358         RpcResultBuilder<UpdateMediatorServerOutput> result =
359                 read(() -> DataProviderServiceImpl.this.dataProvider.updateMediatorServer(input));
360         this.sendResyncCallbackToApiGateway();
361         return result.buildFuture();
362     }
363
364     @Override
365     public ListenableFuture<RpcResult<UpdateMaintenanceOutput>> updateMaintenance(UpdateMaintenanceInput input) {
366         LOG.debug("RPC Request: updateMaintenance with input {}", input);
367         RpcResultBuilder<UpdateMaintenanceOutput> result =
368                 read(() -> DataProviderServiceImpl.this.dataProvider.updateMaintenance(input));
369         return result.buildFuture();
370     }
371
372     @Override
373     public ListenableFuture<RpcResult<ReadEventlogListOutput>> readEventlogList(ReadEventlogListInput input) {
374         LOG.debug("RPC Request: readEventlogList with input {}", input);
375         RpcResultBuilder<ReadEventlogListOutput> result =
376                 read(() -> DataProviderServiceImpl.this.dataProvider.readEventlogList(input));
377         return result.buildFuture();
378     }
379
380     @Override
381     public ListenableFuture<RpcResult<ReadGuiCutThroughEntryOutput>> readGuiCutThroughEntry(
382             ReadGuiCutThroughEntryInput input) {
383         LOG.debug("RPC Request: getGuiCutThroughEntry with input {}", input);
384         RpcResultBuilder<ReadGuiCutThroughEntryOutput> result =
385                 read(() -> DataProviderServiceImpl.this.dataProvider.readGuiCutThroughEntry(input));
386         return result.buildFuture();
387     }
388     // -- private classes and functions
389
390     private static String assembleExceptionMessage(Exception e) {
391         StringWriter sw = new StringWriter();
392         PrintWriter pw = new PrintWriter(sw);
393         e.printStackTrace(pw);
394
395         StringBuffer buf = new StringBuffer();
396         buf.append("Exception: ");
397         buf.append(sw.toString());
398         return buf.toString();
399     }
400
401     private interface GetEntityInput<O extends DataObject> {
402         Builder<O> get() throws IOException;
403     }
404
405     private static <O extends DataObject, I extends DataObject> RpcResultBuilder<O> read(
406             GetEntityInput<O> inputgetter) {
407         RpcResultBuilder<O> result;
408         try {
409             Builder<O> outputBuilder = inputgetter.get();
410             result = RpcResultBuilder.success(outputBuilder);
411         } catch (Exception e) {
412             LOG.info("Exception", e);
413             result = RpcResultBuilder.failed();
414             result.withError(ErrorType.APPLICATION, assembleExceptionMessage(e));
415         }
416         return result;
417     }
418
419     public HtUserdataManager getHtDatabaseUserManager() {
420         return this.dbUserManager;
421     }
422
423 }