Move DOMRpcRouter implementation methods 09/74209/8
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 18 Jul 2018 16:13:09 +0000 (18:13 +0200)
committerJie Han <han.jie@zte.com.cn>
Fri, 20 Jul 2018 01:04:33 +0000 (01:04 +0000)
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 <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java
binding2/mdsal-binding2-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/test/BindingTestContext.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.java
dom/mdsal-dom-broker/src/main/resources/org/opendaylight/blueprint/dom-broker.xml
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouterTest.java

index 62cbdeeb211b3ea0289c0bfdb938e7bcc5ae2eb7..78f52c72f3d376227bf74a8fa65a88828c5e0b2b 100644 (file)
@@ -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
index 863b7a4e849d86c733ce2c8a5740d9ded077cb00..6a0ea2b6ae25fc9160e9a798a983a8f7deaec552 100644 (file)
@@ -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
index 42de6fe0e40674d8958fc5e9ff05120e8dd91db0..48c8525ba056e7e64e272277d1e6a8df2df38a20 100644 (file)
@@ -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<Registration<?>> listeners = Collections.emptyList();
@@ -72,27 +73,12 @@ public final class DOMRpcRouter extends AbstractRegistration implements DOMRpcSe
         return rpcRouter;
     }
 
-    @Override
-    public <T extends DOMRpcImplementation> DOMRpcImplementationRegistration<T> registerRpcImplementation(
-            final T implementation, final DOMRpcIdentifier... rpcs) {
-        return registerRpcImplementation(implementation, ImmutableSet.copyOf(rpcs));
+    public DOMRpcService getRpcService() {
+        return rpcService;
     }
 
-    @Override
-    public synchronized <T extends DOMRpcImplementation> DOMRpcImplementationRegistration<T>
-            registerRpcImplementation(final T implementation, final Set<DOMRpcIdentifier> rpcs) {
-        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);
-            }
-        };
+    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<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);
-    }
-
     private synchronized void removeListener(final ListenerRegistration<? extends DOMRpcAvailabilityListener> 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 <T extends DOMRpcAvailabilityListener> ListenerRegistration<T> registerRpcListener(
-            final T listener) {
-        final Registration<T> ret = new Registration<>(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;
-    }
-
     @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<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);
+                }
+            };
+        }
+    }
 }
index 13bbd0b4969e99dbe4a473df5f3f566f6dd3895e..9a2ed88159d603ba76f98784d8f0884497fd0e31 100644 (file)
     <argument ref="schemaService"/>
   </bean>
 
-  <service ref="domRpcRouter" odl:type="default">
+  <bean id="domRpcService" factory-ref="domRpcRouter" factory-method="getRpcService"/>
+  <service ref="domRpcService" odl:type="default">
     <interfaces>
       <value>org.opendaylight.mdsal.dom.api.DOMRpcService</value>
+    </interfaces>
+  </service>
+
+  <bean id="domRpcProviderService" factory-ref="domRpcRouter" factory-method="getRpcProviderService"/>
+  <service ref="domRpcProviderService" odl:type="default">
+    <interfaces>
       <value>org.opendaylight.mdsal.dom.api.DOMRpcProviderService</value>
     </interfaces>
   </service>
index 24b2353e00edfae6fa4dcabc53977ebff7831f64..9c62d0daad69f2d23706954336d46394a842cf47 100644 (file)
@@ -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));
     }
 }