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