Modify config Module impls to co-exist with blueprint
[controller.git] / opendaylight / md-sal / sal-dom-broker / src / main / java / org / opendaylight / controller / md / sal / dom / broker / impl / DOMRpcRouter.java
index d72f714a5f83d8b061697ce599c5c0d9748db7ad..60e4db5ca6b6610eb196f13436b1e48bc7c01a3f 100644 (file)
@@ -33,6 +33,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMRpcProviderService;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
 import org.opendaylight.controller.md.sal.dom.spi.AbstractDOMRpcImplementationRegistration;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
 import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -48,6 +49,12 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP
     private Collection<ListenerRegistration<? extends DOMRpcAvailabilityListener>> listeners = Collections.emptyList();
     private volatile DOMRpcRoutingTable routingTable = DOMRpcRoutingTable.EMPTY;
 
+    public static DOMRpcRouter newInstance(SchemaService schemaService) {
+        final DOMRpcRouter rpcRouter = new DOMRpcRouter();
+        schemaService.registerSchemaContextListener(rpcRouter);
+        return rpcRouter;
+    }
+
     @Override
     public <T extends DOMRpcImplementation> DOMRpcImplementationRegistration<T> registerRpcImplementation(final T implementation, final DOMRpcIdentifier... rpcs) {
         return registerRpcImplementation(implementation, ImmutableSet.copyOf(rpcs));
@@ -67,22 +74,23 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP
         final DOMRpcRoutingTable newTable = oldTable.remove(implementation, rpcs);
 
         final Collection<DOMRpcIdentifier> removedRpcs = notPresentRpcs(newTable, rpcs);
-        final Collection<ListenerRegistration<? extends DOMRpcAvailabilityListener>> capturedListeners = listeners;
         routingTable = newTable;
-
-        listenerNotifier.execute(new Runnable() {
-            @Override
-            public void run() {
-                for (ListenerRegistration<? extends DOMRpcAvailabilityListener> l : capturedListeners) {
-                    // Need to ensure removed listeners do not get notified
-                    synchronized (DOMRpcRouter.this) {
-                        if (listeners.contains(l)) {
-                            l.getInstance().onRpcUnavailable(removedRpcs);
+        if(!removedRpcs.isEmpty()) {
+            final Collection<ListenerRegistration<? extends DOMRpcAvailabilityListener>> capturedListeners = listeners;
+            listenerNotifier.execute(new Runnable() {
+                @Override
+                public void run() {
+                    for (final ListenerRegistration<? extends DOMRpcAvailabilityListener> l : capturedListeners) {
+                        // Need to ensure removed listeners do not get notified
+                        synchronized (DOMRpcRouter.this) {
+                            if (listeners.contains(l)) {
+                                l.getInstance().onRpcUnavailable(removedRpcs);
+                            }
                         }
                     }
                 }
-            }
-        });
+            });
+        }
     }
 
     @Override
@@ -91,22 +99,24 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP
         final DOMRpcRoutingTable newTable = oldTable.add(implementation, rpcs);
 
         final Collection<DOMRpcIdentifier> addedRpcs = notPresentRpcs(oldTable, rpcs);
-        final Collection<ListenerRegistration<? extends DOMRpcAvailabilityListener>> capturedListeners = listeners;
         routingTable = newTable;
 
-        listenerNotifier.execute(new Runnable() {
-            @Override
-            public void run() {
-                for (ListenerRegistration<? extends DOMRpcAvailabilityListener> l : capturedListeners) {
-                    // Need to ensure removed listeners do not get notified
-                    synchronized (DOMRpcRouter.this) {
-                        if (listeners.contains(l)) {
-                            l.getInstance().onRpcAvailable(addedRpcs);
+        if(!addedRpcs.isEmpty()) {
+            final Collection<ListenerRegistration<? extends DOMRpcAvailabilityListener>> capturedListeners = listeners;
+            listenerNotifier.execute(new Runnable() {
+                @Override
+                public void run() {
+                    for (final ListenerRegistration<? extends DOMRpcAvailabilityListener> l : capturedListeners) {
+                        // Need to ensure removed listeners do not get notified
+                        synchronized (DOMRpcRouter.this) {
+                            if (listeners.contains(l)) {
+                                l.getInstance().onRpcAvailable(addedRpcs);
+                            }
                         }
                     }
                 }
-            }
-        });
+            });
+        }
 
         return new AbstractDOMRpcImplementationRegistration<T>(implementation) {
             @Override