2 * Copyright © 2017 Orange, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.transportpce.servicehandler;
11 import com.google.common.util.concurrent.ListenableFuture;
12 import com.google.common.util.concurrent.ListeningExecutorService;
13 import com.google.common.util.concurrent.MoreExecutors;
14 import java.util.concurrent.Callable;
15 import java.util.concurrent.CancellationException;
16 import java.util.concurrent.ExecutionException;
17 import java.util.concurrent.Executors;
18 import java.util.concurrent.Future;
20 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubpce.rev170426.PathComputationRequestOutput;
22 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceDeleteInput;
23 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceDeleteInputBuilder;
24 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceDeleteOutput;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceImplementationRequestInput;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceImplementationRequestInputBuilder;
27 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceImplementationRequestOutput;
28 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.StubrendererService;
29 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.service.implementation.request.input.PathDescriptionBuilder;
30 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.service.implementation.request.input.ServiceAEnd;
31 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.service.implementation.request.input.ServiceAEndBuilder;
32 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.service.implementation.request.input.ServiceZEnd;
33 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.service.implementation.request.input.ServiceZEndBuilder;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.ServiceFormat;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.ServiceCreateInput;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.ServiceReconfigureInput;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.service.list.Services;
38 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.endpoint.sp.RxDirection;
39 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.endpoint.sp.RxDirectionBuilder;
40 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.endpoint.sp.TxDirection;
41 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.endpoint.sp.TxDirectionBuilder;
42 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.handler.header.ServiceHandlerHeaderBuilder;
43 import org.opendaylight.yangtools.yang.common.RpcResult;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
50 * Class for Mapping and Sending
51 * Service Implemention requests :
52 * - service implementation
54 * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
57 public class MappingAndSendingSIRequest {
59 private static final Logger LOG = LoggerFactory.getLogger(MappingAndSendingSIRequest.class);
60 /** Permit to call Renderer RPCs. */
61 private StubrendererService service;
62 /** define procedure success (or not ). */
63 private Boolean success = false;
64 /** permit to call bundle service (PCE, Renderer, Servicehandler. */
65 private RpcProviderRegistry rpcRegistry;
66 /** store all error messages. */
68 ServiceImplementationRequestInput serviceImplementationRequestInput = null;
69 ServiceDeleteInput serviceDeleteInput = null;
71 private final ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));
75 * MappingAndSendingSIRequest class constructor
76 * for RPC serviceCreate.
78 * @param rpcRegistry rpcRegistry
79 * @param serviceCreateInput serviceCreateInput
80 * @param pathComputationOutput pathComputationOutput
82 public MappingAndSendingSIRequest(RpcProviderRegistry rpcRegistry,
83 ServiceCreateInput serviceCreateInput,PathComputationRequestOutput pathComputationOutput) {
84 this.setRpcRegistry(rpcRegistry);
85 if (rpcRegistry != null) {
86 service = rpcRegistry.getRpcService(StubrendererService.class);
91 /** Building ServiceImplementationRequestInput / ServiceDeleteInput serviceDeleteInput. */
92 ServiceHandlerHeaderBuilder serviceHandlerHeader = new ServiceHandlerHeaderBuilder();
93 if (serviceCreateInput.getSdncRequestHeader() != null) {
94 serviceHandlerHeader.setRequestId(serviceCreateInput.getSdncRequestHeader().getRequestId());
96 mappingSIRequest(pathComputationOutput, serviceHandlerHeader, serviceCreateInput.getServiceAEnd(),
97 serviceCreateInput.getServiceZEnd(), serviceCreateInput.getServiceName());
100 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev161014
101 .service.create.input.ServiceAEnd tempA = serviceCreateInput.getServiceAEnd();
103 org.opendaylight.yang.gen.v1.http.org.openroadm.common
104 .service.types.rev161014.service.port.Port tempAPortRx =
105 serviceCreateInput.getServiceAEnd().getRxDirection().getPort();
107 org.opendaylight.yang.gen.v1.http.org.openroadm.common
108 .service.types.rev161014.service.port.Port tempAPortTx =
109 serviceCreateInput.getServiceAEnd().getTxDirection().getPort();
111 RxDirection rxDirectionAEnd = getRxDirection(tempAPortRx);
113 TxDirection txDirectionAEnd = getTxDirection(tempAPortTx);
115 ServiceAEnd serviceAEnd = new ServiceAEndBuilder()
116 .setClli(tempA.getClli())
117 .setNodeId(tempA.getNodeId())
118 .setServiceFormat(ServiceFormat.valueOf(tempA.getServiceFormat().getName()))
119 .setServiceRate(tempA.getServiceRate())
120 .setRxDirection(rxDirectionAEnd)
121 .setTxDirection(txDirectionAEnd)
124 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev161014
125 .service.create.input.ServiceZEnd tempZ = serviceCreateInput.getServiceZEnd();
127 org.opendaylight.yang.gen.v1.http.org.openroadm.common
128 .service.types.rev161014.service.port.Port tempZPortRx =
129 serviceCreateInput.getServiceZEnd().getRxDirection().getPort();
131 org.opendaylight.yang.gen.v1.http.org.openroadm.common
132 .service.types.rev161014.service.port.Port tempZPortTx =
133 serviceCreateInput.getServiceZEnd().getTxDirection().getPort();
135 RxDirection rxDirectionZEnd = getRxDirection(tempZPortRx);
137 TxDirection txDirectionZEnd = getTxDirection(tempZPortTx);
139 ServiceZEnd serviceZEnd = new ServiceZEndBuilder()
140 .setClli(tempZ.getClli())
141 .setNodeId(tempZ.getNodeId())
142 .setServiceFormat(ServiceFormat.valueOf(tempZ.getServiceFormat().getName()))
143 .setServiceRate(tempZ.getServiceRate())
144 .setRxDirection(rxDirectionZEnd)
145 .setTxDirection(txDirectionZEnd)
148 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types
149 .rev170426.response.parameters.sp.response.parameters.PathDescription tmp = null;
151 tmp = pathComputationOutput.getResponseParameters().getPathDescription();
152 } catch (NullPointerException e) {
153 LOG.error("PathDescription is null : " + e.toString());
155 PathDescriptionBuilder pathDescription = new PathDescriptionBuilder();
157 pathDescription = new PathDescriptionBuilder(tmp);
159 serviceImplementationRequestInput = new ServiceImplementationRequestInputBuilder()
160 .setPathDescription(pathDescription.build())
161 .setServiceHandlerHeader(serviceHandlerHeader.build())
162 .setServiceName(serviceCreateInput.getServiceName())
163 .setServiceAEnd(serviceAEnd)
164 .setServiceZEnd(serviceZEnd)
167 mappingSIRequest(pathComputationOutput, serviceHandlerHeader, serviceCreateInput.getServiceAEnd(),
168 serviceCreateInput.getServiceZEnd(), serviceCreateInput.getServiceName());
172 * MappingAndSendingSIRequest class constructor
173 * for RPC serviceReconfigure.
175 * @param rpcRegistry rpcRegistry
176 * @param serviceReconfigureInput serviceReconfigureInput
177 * @param pathComputationOutput pathComputationOutput
180 public MappingAndSendingSIRequest(RpcProviderRegistry rpcRegistry,
181 ServiceReconfigureInput serviceReconfigureInput,PathComputationRequestOutput pathComputationOutput) {
182 this.setRpcRegistry(rpcRegistry);
183 if (rpcRegistry != null) {
184 service = rpcRegistry.getRpcService(StubrendererService.class);
189 /** Building ServiceImplementationRequestInput / ServiceDeleteInput serviceDeleteInput .*/
190 ServiceHandlerHeaderBuilder serviceHandlerHeader = new ServiceHandlerHeaderBuilder()
191 .setRequestId("reconfigure_" + serviceReconfigureInput.getNewServiceName());
192 mappingSIRequest(pathComputationOutput, serviceHandlerHeader, serviceReconfigureInput.getServiceAEnd(),
193 serviceReconfigureInput.getServiceZEnd(), serviceReconfigureInput.getNewServiceName());
196 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev161014
197 .service.reconfigure.input.ServiceAEnd tempA = serviceReconfigureInput.getServiceAEnd();
199 org.opendaylight.yang.gen.v1.http.org.openroadm.common
200 .service.types.rev161014.service.port.Port tempAPortRx =
201 serviceReconfigureInput.getServiceAEnd().getRxDirection().getPort();
203 org.opendaylight.yang.gen.v1.http.org.openroadm.common
204 .service.types.rev161014.service.port.Port tempAPortTx =
205 serviceReconfigureInput.getServiceAEnd().getTxDirection().getPort();
207 RxDirection rxDirectionAEnd = getRxDirection(tempAPortRx);
209 TxDirection txDirectionAEnd = getTxDirection(tempAPortTx);
211 ServiceAEnd serviceAEnd = new ServiceAEndBuilder()
212 .setClli(tempA.getClli())
213 .setNodeId(tempA.getNodeId())
214 .setServiceFormat(ServiceFormat.valueOf(tempA.getServiceFormat().getName()))
215 .setServiceRate(tempA.getServiceRate())
216 .setRxDirection(rxDirectionAEnd)
217 .setTxDirection(txDirectionAEnd)
220 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev161014
221 .service.reconfigure.input.ServiceZEnd tempZ = serviceReconfigureInput.getServiceZEnd();
223 org.opendaylight.yang.gen.v1.http.org.openroadm.common
224 .service.types.rev161014.service.port.Port tempZPortRx =
225 serviceReconfigureInput.getServiceZEnd().getRxDirection().getPort();
227 org.opendaylight.yang.gen.v1.http.org.openroadm.common
228 .service.types.rev161014.service.port.Port tempZPortTx =
229 serviceReconfigureInput.getServiceZEnd().getTxDirection().getPort();
232 RxDirection rxDirectionZEnd = getRxDirection(tempZPortRx);
233 TxDirection txDirectionZEnd = getTxDirection(tempZPortTx);
235 ServiceZEnd serviceZEnd = new ServiceZEndBuilder()
236 .setClli(tempZ.getClli())
237 .setNodeId(tempZ.getNodeId())
238 .setServiceFormat(ServiceFormat.valueOf(tempZ.getServiceFormat().getName()))
239 .setServiceRate(tempZ.getServiceRate())
240 .setRxDirection(rxDirectionZEnd)
241 .setTxDirection(txDirectionZEnd)
244 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types
245 .rev170426.response.parameters.sp.response.parameters.PathDescription tmp = null;
247 tmp = pathComputationOutput.getResponseParameters().getPathDescription();
248 } catch (NullPointerException e) {
249 LOG.error("PathDescription is null : " + e.toString());
251 PathDescriptionBuilder pathDescription = new PathDescriptionBuilder();
253 pathDescription = new PathDescriptionBuilder(tmp);
255 serviceImplementationRequestInput = new ServiceImplementationRequestInputBuilder()
256 .setPathDescription(pathDescription.build())
257 .setServiceHandlerHeader(serviceHandlerHeader.build())
258 .setServiceName(serviceReconfigureInput.getNewServiceName())
259 .setServiceAEnd(serviceAEnd)
260 .setServiceZEnd(serviceZEnd)
262 LOG.info("ServiceImplementationRequestInput : " + serviceImplementationRequestInput.toString());*/
267 * MappingAndSendingSIRequest class constructor
268 * for RPC serviceDelete.
270 * @param rpcRegistry RpcProviderRegistry
271 * @param requestId Request ID
272 * @param serviceName Service name
274 public MappingAndSendingSIRequest(RpcProviderRegistry rpcRegistry,String requestId, String serviceName) {
275 this.setRpcRegistry(rpcRegistry);
276 if (rpcRegistry != null) {
277 service = rpcRegistry.getRpcService(StubrendererService.class);
282 /** ServiceDeleteInput Build .*/
283 ServiceHandlerHeaderBuilder serviceHandlerHeader = new ServiceHandlerHeaderBuilder();
284 if (requestId != null) {
285 serviceHandlerHeader.setRequestId(requestId);
288 serviceDeleteInput = new ServiceDeleteInputBuilder()
289 .setServiceHandlerHeader(serviceHandlerHeader.build())
290 .setServiceName(serviceName)
295 * MappingAndSendingSIRequest Class constructor
296 * for modify Service in ODL Datastore.
298 * @param rpcRegistry RpcProviderRegistry
299 * @param services Services
300 * @param pathComputationOutput PathComputationRequestOutput
302 public MappingAndSendingSIRequest(RpcProviderRegistry rpcRegistry,Services services,
303 PathComputationRequestOutput pathComputationOutput) {
304 this.setRpcRegistry(rpcRegistry);
305 if (rpcRegistry != null) {
306 service = rpcRegistry.getRpcService(StubrendererService.class);
311 /** Building ServiceImplementationRequestInput / ServiceDeleteInput serviceDeleteInput .*/
312 ServiceHandlerHeaderBuilder serviceHandlerHeader = new ServiceHandlerHeaderBuilder();
313 mappingSIRequest(pathComputationOutput, serviceHandlerHeader, services.getServiceAEnd(),
314 services.getServiceZEnd(), services.getServiceName());
315 /*org.opendaylight.yang.gen.v1.http.org.openroadm.common.service
316 .types.rev161014.service.ServiceAEnd tempA = services.getServiceAEnd();
318 org.opendaylight.yang.gen.v1.http.org.openroadm.common
319 .service.types.rev161014.service.port.Port tempAPortRx = tempA.getRxDirection().getPort();
321 org.opendaylight.yang.gen.v1.http.org.openroadm.common
322 .service.types.rev161014.service.port.Port tempAPortTx = tempA.getTxDirection().getPort();
325 RxDirection rxDirectionAEnd = getRxDirection(tempAPortRx);
327 TxDirection txDirectionAEnd = getTxDirection(tempAPortTx);
329 ServiceAEnd serviceAEnd = new ServiceAEndBuilder()
330 .setClli(tempA.getClli())
331 .setNodeId(tempA.getNodeId())
332 .setServiceFormat(ServiceFormat.valueOf(tempA.getServiceFormat().getName()))
333 .setServiceRate(tempA.getServiceRate())
334 .setRxDirection(rxDirectionAEnd)
335 .setTxDirection(txDirectionAEnd)
337 org.opendaylight.yang.gen.v1.http.org.openroadm.common.service
338 .types.rev161014.service.ServiceZEnd tempZ = services.getServiceZEnd();
340 org.opendaylight.yang.gen.v1.http.org.openroadm.common
341 .service.types.rev161014.service.port.Port tempZPortRx = tempZ.getRxDirection().getPort();
343 org.opendaylight.yang.gen.v1.http.org.openroadm.common
344 .service.types.rev161014.service.port.Port tempZPortTx = tempZ.getTxDirection().getPort();
346 RxDirection rxDirectionZEnd = getRxDirection(tempZPortRx);
347 TxDirection txDirectionZEnd = getTxDirection(tempZPortTx);
349 ServiceZEnd serviceZEnd = new ServiceZEndBuilder()
350 .setClli(tempZ.getClli())
351 .setNodeId(tempZ.getNodeId())
352 .setServiceFormat(ServiceFormat.valueOf(tempZ.getServiceFormat().getName()))
353 .setServiceRate(tempZ.getServiceRate())
354 .setRxDirection(rxDirectionZEnd)
355 .setTxDirection(txDirectionZEnd)
357 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types
358 .rev170426.response.parameters.sp.response.parameters.PathDescription tmp = null;
360 tmp = pathComputationOutput.getResponseParameters().getPathDescription();
361 } catch (NullPointerException e) {
362 LOG.error("PathDescription is null : " + e.toString());
364 PathDescriptionBuilder pathDescription = new PathDescriptionBuilder();
366 pathDescription = new PathDescriptionBuilder(tmp);
369 serviceImplementationRequestInput = new ServiceImplementationRequestInputBuilder()
370 .setPathDescription(pathDescription.build())
371 .setServiceHandlerHeader(serviceHandlerHeader.build())
372 .setServiceName(services.getServiceName())
373 .setServiceAEnd(serviceAEnd)
374 .setServiceZEnd(serviceZEnd)
376 LOG.info("ServiceImplementationRequestInput : " + serviceImplementationRequestInput.toString());*/
380 *Build serviceImplementationRequestInput with
381 *input parameters from ServiceCreateInput or
382 *Services or serviceReconfigureInput.
384 * @param pathComputationOutput PathComputationRequestOutput
385 * @param serviceHandlerHeader ServiceHandlerHeaderBuilder
386 * @param aend Beginning ServiceEndpoint
387 * @param zend Ending ServiceEndpoint
388 * @param serviceName Service Name
390 private void mappingSIRequest(PathComputationRequestOutput pathComputationOutput,
391 ServiceHandlerHeaderBuilder serviceHandlerHeader, org.opendaylight.yang.gen .v1.http.org.openroadm.common
392 .service.types.rev161014.ServiceEndpoint aend , org.opendaylight.yang.gen.v1.http.org.openroadm.common
393 .service.types.rev161014.ServiceEndpoint zend, String serviceName) {
394 LOG.info("Mapping ServiceCreateInput or Services or serviceReconfigureInput to SIR requests");
395 /** ServiceAEnd Build. */
396 RxDirection rxDirectionAEnd = new RxDirectionBuilder()
397 .setPort(aend.getRxDirection().getPort())
399 TxDirection txDirectionAEnd = new TxDirectionBuilder()
400 .setPort(aend.getTxDirection().getPort())
403 ServiceAEnd serviceAEnd = new ServiceAEndBuilder()
404 .setClli(aend.getClli())
405 .setNodeId(aend.getNodeId())
406 .setServiceFormat(ServiceFormat.valueOf(aend.getServiceFormat().getName()))
407 .setServiceRate(aend.getServiceRate())
408 .setRxDirection(rxDirectionAEnd)
409 .setTxDirection(txDirectionAEnd)
412 /** ServiceZEnd Build. */
413 RxDirection rxDirectionZEnd = new RxDirectionBuilder()
414 .setPort(zend.getRxDirection().getPort())
417 TxDirection txDirectionZEnd = new TxDirectionBuilder()
418 .setPort(zend.getTxDirection().getPort())
421 ServiceZEnd serviceZEnd = new ServiceZEndBuilder()
422 .setClli(zend.getClli())
423 .setNodeId(zend.getNodeId())
424 .setServiceFormat(ServiceFormat.valueOf(zend.getServiceFormat().getName()))
425 .setServiceRate(zend.getServiceRate())
426 .setRxDirection(rxDirectionZEnd)
427 .setTxDirection(txDirectionZEnd)
431 /** ServiceImplementationRequestInput Build. */
432 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types
433 .rev170426.response.parameters.sp.response.parameters.PathDescription tmp = null;
435 tmp = pathComputationOutput.getResponseParameters().getPathDescription();
436 } catch (NullPointerException e) {
437 LOG.error("PathDescription is null : " + e.toString());
439 PathDescriptionBuilder pathDescription = new PathDescriptionBuilder();
441 pathDescription = new PathDescriptionBuilder(tmp);
443 serviceImplementationRequestInput = new ServiceImplementationRequestInputBuilder()
444 .setPathDescription(pathDescription.build())
445 .setServiceHandlerHeader(serviceHandlerHeader.build())
446 .setServiceName(serviceName)
447 .setServiceAEnd(serviceAEnd)
448 .setServiceZEnd(serviceZEnd)
454 * Send serviceImplementation request to Render.
456 * @return ServiceImplementationRequestOutput data response from Renderer
458 public ListenableFuture<Boolean> serviceImplementation() {
460 return executor.submit(new Callable<Boolean>() {
462 public Boolean call() throws Exception {
463 Boolean output = null;
464 if (serviceImplementationRequestInput != null) {
465 RpcResult<ServiceImplementationRequestOutput> rendererOutputResult = null;
466 Future<RpcResult<ServiceImplementationRequestOutput>> rendererOutputFuture =
467 service.serviceImplementationRequest(serviceImplementationRequestInput);
469 rendererOutputResult = rendererOutputFuture.get();//wait to get the result
470 } catch (InterruptedException | CancellationException | ExecutionException e) {
471 setError("Did not receive the expected response from renderer to pathComputationRequest RPC "
474 rendererOutputFuture.cancel(true);
477 if (rendererOutputResult != null && rendererOutputResult.isSuccessful()) {
478 LOG.info("Renderer replied to serviceImplementation Request !");
484 LOG.info("serviceImplementationRequestInput is not valid");
494 * Send serviceDelete request to Render.
496 * @return ServiceDeleteOutput data response from Renderer
498 public ListenableFuture<Boolean> serviceDelete() {
500 return executor.submit(new Callable<Boolean>() {
502 public Boolean call() throws Exception {
503 Boolean output = null;
504 if (serviceDeleteInput != null) {
505 RpcResult<ServiceDeleteOutput> rendererOutputResult = null;
506 Future<RpcResult<ServiceDeleteOutput>> rendererOutputFuture =
507 service.serviceDelete(serviceDeleteInput);
509 rendererOutputResult = rendererOutputFuture.get();//wait to get the result
510 } catch (InterruptedException | CancellationException | ExecutionException e) {
511 setError("Did not receive the expected response from renderer to pathComputationRequest RPC "
514 rendererOutputFuture.cancel(true);
517 if (rendererOutputResult != null && rendererOutputResult.isSuccessful()) {
518 LOG.info("Renderer replied to serviceDelete Request!");
530 public Boolean getSuccess() {
534 public void setSuccess(Boolean success) {
535 this.success = success;
538 public String getError() {
542 public void setError(String error) {
546 public RpcProviderRegistry getRpcRegistry() {
550 public void setRpcRegistry(RpcProviderRegistry rpcRegistry) {
551 this.rpcRegistry = rpcRegistry;