From 4b652dbcfd5878cb0aace36780bbc7a1ee8dd025 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 18 Jul 2018 18:13:09 +0200 Subject: [PATCH] Move DOMRpcRouter implementation methods This moves actual implementations of DOMRpc*Service into facades, which allows us to properly support multiple interface, without leaking them through DOMRpcRouter itself. JIRA: MDSAL-283 Change-Id: Ie7d2515c35e160ff4827cd999d962bd961b5ad9a Signed-off-by: Robert Varga --- .../adapter/test/util/BindingTestContext.java | 4 +- .../dom/adapter/test/BindingTestContext.java | 4 +- .../mdsal/dom/broker/DOMRpcRouter.java | 111 ++++++++++-------- .../org/opendaylight/blueprint/dom-broker.xml | 9 +- .../mdsal/dom/broker/DOMRpcRouterTest.java | 11 +- 5 files changed, 82 insertions(+), 57 deletions(-) diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java index 62cbdeeb21..78f52c72f3 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java @@ -210,11 +210,11 @@ public class BindingTestContext implements AutoCloseable { } public DOMRpcProviderService getDomRpcRegistry() { - return domRouter; + return domRouter.getRpcProviderService(); } public DOMRpcService getDomRpcInvoker() { - return domRouter; + return domRouter.getRpcService(); } @Override diff --git a/binding2/mdsal-binding2-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/test/BindingTestContext.java b/binding2/mdsal-binding2-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/test/BindingTestContext.java index 863b7a4e84..6a0ea2b6ae 100644 --- a/binding2/mdsal-binding2-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/test/BindingTestContext.java +++ b/binding2/mdsal-binding2-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/test/BindingTestContext.java @@ -195,11 +195,11 @@ public class BindingTestContext implements AutoCloseable { } public DOMRpcProviderService getDomRpcRegistry() { - return domRouter; + return domRouter.getRpcProviderService(); } public DOMRpcService getDomRpcInvoker() { - return domRouter; + return domRouter.getRpcService(); } @Override diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.java index 42de6fe0e4..48c8525ba0 100644 --- a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.java +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.java @@ -52,12 +52,13 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; import org.opendaylight.yangtools.yang.model.api.SchemaPath; -public final class DOMRpcRouter extends AbstractRegistration implements DOMRpcService, DOMRpcProviderService, - SchemaContextListener { +public final class DOMRpcRouter extends AbstractRegistration implements SchemaContextListener { private static final ThreadFactory THREAD_FACTORY = new ThreadFactoryBuilder().setNameFormat( "DOMRpcRouter-listener-%s").setDaemon(true).build(); private final ExecutorService listenerNotifier = Executors.newSingleThreadExecutor(THREAD_FACTORY); + private final DOMRpcProviderService rpcProviderService = new RpcProviderServiceFacade(); + private final DOMRpcService rpcService = new RpcServiceFacade(); @GuardedBy("this") private Collection> listeners = Collections.emptyList(); @@ -72,27 +73,12 @@ public final class DOMRpcRouter extends AbstractRegistration implements DOMRpcSe return rpcRouter; } - @Override - public DOMRpcImplementationRegistration registerRpcImplementation( - final T implementation, final DOMRpcIdentifier... rpcs) { - return registerRpcImplementation(implementation, ImmutableSet.copyOf(rpcs)); + public DOMRpcService getRpcService() { + return rpcService; } - @Override - public synchronized DOMRpcImplementationRegistration - registerRpcImplementation(final T implementation, final Set rpcs) { - final DOMRpcRoutingTable oldTable = routingTable; - final DOMRpcRoutingTable newTable = oldTable.add(implementation, rpcs); - routingTable = newTable; - - listenerNotifier.execute(() -> notifyAdded(newTable, implementation)); - - return new AbstractDOMRpcImplementationRegistration(implementation) { - @Override - protected void removeRegistration() { - removeRpcImplementation(getInstance(), rpcs); - } - }; + public DOMRpcProviderService getRpcProviderService() { + return rpcProviderService; } private synchronized void removeRpcImplementation(final DOMRpcImplementation implementation, @@ -104,18 +90,6 @@ public final class DOMRpcRouter extends AbstractRegistration implements DOMRpcSe listenerNotifier.execute(() -> notifyRemoved(newTable, implementation)); } - @Override - public CheckedFuture 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); - } - private synchronized void removeListener(final ListenerRegistration reg) { listeners = ImmutableList.copyOf(Collections2.filter(listeners, input -> !reg.equals(input))); } @@ -132,19 +106,6 @@ public final class DOMRpcRouter extends AbstractRegistration implements DOMRpcSe } } - @Override - public synchronized ListenerRegistration registerRpcListener( - final T listener) { - final Registration ret = new Registration<>(this, listener, routingTable.getRpcs(listener)); - final Builder> b = ImmutableList.builder(); - b.addAll(listeners); - b.add(ret); - listeners = b.build(); - - listenerNotifier.execute(() -> ret.initialTable()); - return ret; - } - @Override public synchronized void onGlobalContextUpdated(final SchemaContext context) { final DOMRpcRoutingTable oldTable = routingTable; @@ -152,7 +113,6 @@ public final class DOMRpcRouter extends AbstractRegistration implements DOMRpcSe routingTable = newTable; } - @Override protected void removeRegistration() { if (listenerRegistration != null) { @@ -253,4 +213,61 @@ public final class DOMRpcRouter extends AbstractRegistration implements DOMRpcSe } } } + + private final class RpcServiceFacade implements DOMRpcService { + @Override + public CheckedFuture 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 ListenerRegistration registerRpcListener(final T listener) { + synchronized (DOMRpcRouter.this) { + final Registration ret = new Registration<>(DOMRpcRouter.this, listener, + routingTable.getRpcs(listener)); + final Builder> 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 DOMRpcImplementationRegistration registerRpcImplementation( + final T implementation, final DOMRpcIdentifier... rpcs) { + return registerRpcImplementation(implementation, ImmutableSet.copyOf(rpcs)); + } + + @Override + public DOMRpcImplementationRegistration registerRpcImplementation( + final T implementation, final Set 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(implementation) { + @Override + protected void removeRegistration() { + removeRpcImplementation(getInstance(), rpcs); + } + }; + } + } } diff --git a/dom/mdsal-dom-broker/src/main/resources/org/opendaylight/blueprint/dom-broker.xml b/dom/mdsal-dom-broker/src/main/resources/org/opendaylight/blueprint/dom-broker.xml index 13bbd0b496..9a2ed88159 100644 --- a/dom/mdsal-dom-broker/src/main/resources/org/opendaylight/blueprint/dom-broker.xml +++ b/dom/mdsal-dom-broker/src/main/resources/org/opendaylight/blueprint/dom-broker.xml @@ -41,9 +41,16 @@ - + + org.opendaylight.mdsal.dom.api.DOMRpcService + + + + + + org.opendaylight.mdsal.dom.api.DOMRpcProviderService diff --git a/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouterTest.java b/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouterTest.java index 24b2353e00..9c62d0daad 100644 --- a/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouterTest.java +++ b/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouterTest.java @@ -29,12 +29,12 @@ public class DOMRpcRouterTest extends TestUtils { DOMRpcRoutingTable routingTable = rpcRouter.routingTable(); assertFalse(routingTable.getRpcs().containsKey(SchemaPath.ROOT)); - rpcRouter.registerRpcImplementation(getTestRpcImplementation(), + rpcRouter.getRpcProviderService().registerRpcImplementation(getTestRpcImplementation(), DOMRpcIdentifier.create(SchemaPath.ROOT, null)); routingTable = rpcRouter.routingTable(); assertTrue(routingTable.getRpcs().containsKey(SchemaPath.ROOT)); - rpcRouter.registerRpcImplementation(getTestRpcImplementation(), + rpcRouter.getRpcProviderService().registerRpcImplementation(getTestRpcImplementation(), DOMRpcIdentifier.create(SchemaPath.SAME, null)); routingTable = rpcRouter.routingTable(); assertTrue(routingTable.getRpcs().containsKey(SchemaPath.SAME)); @@ -44,7 +44,7 @@ public class DOMRpcRouterTest extends TestUtils { @Test public void invokeRpc() { try (DOMRpcRouter rpcRouter = new DOMRpcRouter()) { - assertNotNull(rpcRouter.invokeRpc(SchemaPath.create(false, TestModel.TEST_QNAME), null)); + assertNotNull(rpcRouter.getRpcService().invokeRpc(SchemaPath.create(false, TestModel.TEST_QNAME), null)); } } @@ -55,7 +55,7 @@ public class DOMRpcRouterTest extends TestUtils { final Collection listenersOriginal = rpcRouter.listeners(); - assertNotNull(rpcRouter.registerRpcListener(listener)); + assertNotNull(rpcRouter.getRpcService().registerRpcListener(listener)); final Collection listenersChanged = rpcRouter.listeners(); assertNotEquals(listenersOriginal, listenersChanged); @@ -81,6 +81,7 @@ public class DOMRpcRouterTest extends TestUtils { public void close() { final DOMRpcRouter rpcRouter = new DOMRpcRouter(); rpcRouter.close(); - rpcRouter.registerRpcImplementation(getTestRpcImplementation(), DOMRpcIdentifier.create(SchemaPath.ROOT, null)); + rpcRouter.getRpcProviderService().registerRpcImplementation(getTestRpcImplementation(), + DOMRpcIdentifier.create(SchemaPath.ROOT, null)); } } -- 2.36.6