+
+ private final class RpcServiceFacade implements DOMRpcService {
+ @Override
+ public CheckedFuture<DOMRpcResult, DOMRpcException> invokeRpc(final SchemaPath type,
+ final NormalizedNode<?, ?> input) {
+ final AbstractDOMRpcRoutingTableEntry entry = routingTable.getEntry(type);
+ if (entry == null) {
+ return Futures.immediateFailedCheckedFuture(
+ new DOMRpcImplementationNotAvailableException("No implementation of RPC %s available", type));
+ }
+
+ return entry.invokeRpc(input);
+ }
+
+ @Override
+ public <T extends DOMRpcAvailabilityListener> ListenerRegistration<T> registerRpcListener(final T listener) {
+ synchronized (DOMRpcRouter.this) {
+ final Registration<T> ret = new Registration<>(DOMRpcRouter.this, listener,
+ routingTable.getRpcs(listener));
+ final Builder<Registration<?>> b = ImmutableList.builder();
+ b.addAll(listeners);
+ b.add(ret);
+ listeners = b.build();
+
+ listenerNotifier.execute(() -> ret.initialTable());
+ return ret;
+ }
+ }
+ }
+
+ private final class RpcProviderServiceFacade implements DOMRpcProviderService {
+ @Override
+ public <T extends DOMRpcImplementation> DOMRpcImplementationRegistration<T> registerRpcImplementation(
+ final T implementation, final DOMRpcIdentifier... rpcs) {
+ return registerRpcImplementation(implementation, ImmutableSet.copyOf(rpcs));
+ }
+
+ @Override
+ public <T extends DOMRpcImplementation> DOMRpcImplementationRegistration<T> registerRpcImplementation(
+ final T implementation, final Set<DOMRpcIdentifier> rpcs) {
+
+ synchronized (DOMRpcRouter.this) {
+ final DOMRpcRoutingTable oldTable = routingTable;
+ final DOMRpcRoutingTable newTable = oldTable.add(implementation, rpcs);
+ routingTable = newTable;
+
+ listenerNotifier.execute(() -> notifyAdded(newTable, implementation));
+ }
+
+ return new AbstractDOMRpcImplementationRegistration<T>(implementation) {
+ @Override
+ protected void removeRegistration() {
+ removeRpcImplementation(getInstance(), rpcs);
+ }
+ };
+ }
+ }