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