Added listener for rpc registrations. 73/2173/6
authorTony Tkacik <ttkacik@cisco.com>
Fri, 25 Oct 2013 18:21:47 +0000 (20:21 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 6 Nov 2013 17:05:57 +0000 (17:05 +0000)
Change-Id: I17d4fbcee58b15b2bc34c83f8dce4495f995292d
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/Broker.java
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcRegistrationListener.java [new file with mode: 0644]
opendaylight/md-sal/sal-dom-broker/pom.xml
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/ProviderContextImpl.xtend

index 632a8742a05477ee59c997119413ff9408f56564..f7c46086e301ac9309bb435921388b97a39cd4a2 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.controller.sal.core.api;
 
  */
 package org.opendaylight.controller.sal.core.api;
 
+import java.util.Set;
 import java.util.concurrent.Future;
 
 import org.opendaylight.controller.md.sal.common.api.routing.RoutedRegistration;
 import java.util.concurrent.Future;
 
 import org.opendaylight.controller.md.sal.common.api.routing.RoutedRegistration;
@@ -14,6 +15,7 @@ import org.opendaylight.controller.sal.core.api.data.DataBrokerService;
 import org.opendaylight.controller.sal.core.api.data.DataProviderService;
 import org.opendaylight.controller.sal.core.api.notify.NotificationPublishService;
 import org.opendaylight.controller.sal.core.api.notify.NotificationService;
 import org.opendaylight.controller.sal.core.api.data.DataProviderService;
 import org.opendaylight.controller.sal.core.api.notify.NotificationPublishService;
 import org.opendaylight.controller.sal.core.api.notify.NotificationService;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -229,6 +231,10 @@ public interface Broker {
 
         @Override
         boolean isClosed();
 
         @Override
         boolean isClosed();
+
+        Set<QName> getSupportedRpcs();
+        
+        ListenerRegistration<RpcRegistrationListener> addRpcRegistrationListener(RpcRegistrationListener listener);
     }
 
     public interface RpcRegistration extends Registration<RpcImplementation> {
     }
 
     public interface RpcRegistration extends Registration<RpcImplementation> {
diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcRegistrationListener.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcRegistrationListener.java
new file mode 100644 (file)
index 0000000..49b2f45
--- /dev/null
@@ -0,0 +1,12 @@
+package org.opendaylight.controller.sal.core.api;
+
+import java.util.EventListener;
+
+import org.opendaylight.yangtools.yang.common.QName;
+
+public interface RpcRegistrationListener extends EventListener {
+    
+    public void onRpcImplementationAdded(QName name);
+    
+    public void onRpcImplementationRemoved(QName name);
+}
index 47b46817bc38b495963613abcb9083c806529615..678728ab3b86b8d0883dce0f613f2cd42b6e5129 100644 (file)
             <artifactId>sal-common-util</artifactId>\r
             <version>1.0-SNAPSHOT</version>\r
         </dependency>\r
             <artifactId>sal-common-util</artifactId>\r
             <version>1.0-SNAPSHOT</version>\r
         </dependency>\r
+        <dependency>\r
+            <groupId>org.opendaylight.controller</groupId>\r
+            <artifactId>sal-common-impl</artifactId>\r
+            <version>1.0-SNAPSHOT</version>\r
+        </dependency>\r
         <dependency>\r
             <groupId>org.opendaylight.controller</groupId>\r
             <artifactId>sal-core-spi</artifactId>\r
         <dependency>\r
             <groupId>org.opendaylight.controller</groupId>\r
             <artifactId>sal-core-spi</artifactId>\r
index bdd4491d016ac747bc17d8a7b10860e7f17c4eed..83dda5902dee4e6fd819debabcaecd12ca0413e8 100644 (file)
@@ -7,26 +7,29 @@
  */
 package org.opendaylight.controller.sal.dom.broker;
 
  */
 package org.opendaylight.controller.sal.dom.broker;
 
-import java.util.Collections
-import java.util.HashMap
-import java.util.HashSet
-import java.util.Map
-import java.util.Set
-import java.util.concurrent.Callable
-import java.util.concurrent.ExecutorService
-import java.util.concurrent.Executors
-import java.util.concurrent.Future
-import org.opendaylight.controller.sal.core.api.Broker
-import org.opendaylight.controller.sal.core.api.BrokerService
-import org.opendaylight.controller.sal.core.api.Consumer
-import org.opendaylight.controller.sal.core.api.Provider
-import org.opendaylight.controller.sal.core.api.RpcImplementation
-import org.opendaylight.controller.sal.core.spi.BrokerModule
-import org.opendaylight.yangtools.yang.common.QName
-import org.opendaylight.yangtools.yang.common.RpcResult
-import org.opendaylight.yangtools.yang.data.api.CompositeNode
-import org.osgi.framework.BundleContext
-import org.slf4j.LoggerFactory
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import org.opendaylight.controller.sal.core.api.Broker;
+import org.opendaylight.controller.sal.core.api.BrokerService;
+import org.opendaylight.controller.sal.core.api.Consumer;
+import org.opendaylight.controller.sal.core.api.Provider;
+import org.opendaylight.controller.sal.core.api.RpcImplementation;
+import org.opendaylight.controller.sal.core.spi.BrokerModule;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.osgi.framework.BundleContext;
+import org.slf4j.LoggerFactory;
+import org.opendaylight.yangtools.concepts.ListenerRegistration
+import org.opendaylight.controller.sal.core.api.RpcRegistrationListener
+import org.opendaylight.controller.md.sal.common.impl.ListenerRegistry
 
 public class BrokerImpl implements Broker {
     private static val log = LoggerFactory.getLogger(BrokerImpl);
 
 public class BrokerImpl implements Broker {
     private static val log = LoggerFactory.getLogger(BrokerImpl);
@@ -39,6 +42,8 @@ public class BrokerImpl implements Broker {
     private val Map<Class<? extends BrokerService>, BrokerModule> serviceProviders = Collections.
         synchronizedMap(new HashMap<Class<? extends BrokerService>, BrokerModule>());
 
     private val Map<Class<? extends BrokerService>, BrokerModule> serviceProviders = Collections.
         synchronizedMap(new HashMap<Class<? extends BrokerService>, BrokerModule>());
 
+
+    private val rpcRegistrationListeners = new ListenerRegistry<RpcRegistrationListener>();
     // RPC Context
     private val Map<QName, RpcImplementation> rpcImpls = Collections.synchronizedMap(
         new HashMap<QName, RpcImplementation>());
     // RPC Context
     private val Map<QName, RpcImplementation> rpcImpls = Collections.synchronizedMap(
         new HashMap<QName, RpcImplementation>());
@@ -96,12 +101,31 @@ public class BrokerImpl implements Broker {
             throw new IllegalStateException("Implementation for rpc " + rpcType + " is already registered.");
         }
 
             throw new IllegalStateException("Implementation for rpc " + rpcType + " is already registered.");
         }
 
-        //TODO: Add notification for availability of Rpc Implementation
+        
         rpcImpls.put(rpcType, implementation);
         rpcImpls.put(rpcType, implementation);
+
+        
+        for(listener : rpcRegistrationListeners.listeners)  {
+            try {
+                listener.instance.onRpcImplementationAdded(rpcType);
+            } catch (Exception e){
+                log.error("Unhandled exception during invoking listener",e);
+            }
+        }
     }
 
     }
 
-    protected def void removeRpcImplementation(QName rpcType) {
-        rpcImpls.remove(rpcType);
+    protected def void removeRpcImplementation(QName rpcType, RpcImplementation implToRemove) {
+        if(implToRemove == rpcImpls.get(rpcType)) {
+            rpcImpls.remove(rpcType);
+        }
+        
+        for(listener : rpcRegistrationListeners.listeners)  {
+            try {
+                listener.instance.onRpcImplementationRemoved(rpcType);
+            } catch (Exception e){
+                log.error("Unhandled exception during invoking listener",e);
+            }
+        }
     }
 
     protected def Future<RpcResult<CompositeNode>> invokeRpc(QName rpc, CompositeNode input) {
     }
 
     protected def Future<RpcResult<CompositeNode>> invokeRpc(QName rpc, CompositeNode input) {
@@ -147,4 +171,12 @@ public class BrokerImpl implements Broker {
         sessions.remove(consumerContextImpl);
         providerSessions.remove(consumerContextImpl);
     }
         sessions.remove(consumerContextImpl);
         providerSessions.remove(consumerContextImpl);
     }
+    
+    protected def getSupportedRpcs() {
+        rpcImpls.keySet;
+    }
+    
+    def ListenerRegistration<RpcRegistrationListener> addRpcRegistrationListener(RpcRegistrationListener listener) {
+        rpcRegistrationListeners.register(listener);
+    }
 }
 }
index 27e559cb9b5011161a25050287555d8ee0c6165c..3fdd7065770dac618a2fa5cc15ebeb1c37cb110a 100644 (file)
@@ -9,6 +9,10 @@ import org.opendaylight.yangtools.yang.common.QName
 import org.osgi.framework.BundleContext
 import org.opendaylight.yangtools.concepts.AbstractObjectRegistration
 import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration
 import org.osgi.framework.BundleContext
 import org.opendaylight.yangtools.concepts.AbstractObjectRegistration
 import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration
+import static java.util.Collections.*
+import java.util.Collections
+import java.util.HashMap
+import org.opendaylight.controller.sal.core.api.RpcRegistrationListener
 
 class ProviderContextImpl extends ConsumerContextImpl implements ProviderSession {
 
 
 class ProviderContextImpl extends ConsumerContextImpl implements ProviderSession {
 
@@ -41,7 +45,7 @@ class ProviderContextImpl extends ConsumerContextImpl implements ProviderSession
             throw new IllegalStateException(
                 "Implementation was not registered in this session");
         }
             throw new IllegalStateException(
                 "Implementation was not registered in this session");
         }
-        broker.removeRpcImplementation(implToRemove.type);
+        broker.removeRpcImplementation(implToRemove.type,localImpl);
         rpcImpls.remove(implToRemove.type);
     }
     
         rpcImpls.remove(implToRemove.type);
     }
     
@@ -53,7 +57,7 @@ class ProviderContextImpl extends ConsumerContextImpl implements ProviderSession
     private def removeAllRpcImlementations() {
        if (!rpcImpls.empty) {
                for (entry : rpcImpls.entrySet) {
     private def removeAllRpcImlementations() {
        if (!rpcImpls.empty) {
                for (entry : rpcImpls.entrySet) {
-                       broker.removeRpcImplementation(entry.key);
+                       broker.removeRpcImplementation(entry.key,entry.value);
                }
                rpcImpls.clear
        }
                }
                rpcImpls.clear
        }
@@ -67,6 +71,13 @@ class ProviderContextImpl extends ConsumerContextImpl implements ProviderSession
         throw new UnsupportedOperationException("TODO: auto-generated method stub")
     }
     
         throw new UnsupportedOperationException("TODO: auto-generated method stub")
     }
     
+    override getSupportedRpcs() {
+        broker.getSupportedRpcs();
+    }
+    
+    override addRpcRegistrationListener(RpcRegistrationListener listener) {
+        broker.addRpcRegistrationListener(listener);
+    }
 }
 
 class RpcRegistrationImpl extends AbstractObjectRegistration<RpcImplementation> implements RpcRegistration {
 }
 
 class RpcRegistrationImpl extends AbstractObjectRegistration<RpcImplementation> implements RpcRegistration {
@@ -87,4 +98,4 @@ class RpcRegistrationImpl extends AbstractObjectRegistration<RpcImplementation>
                context = null  
        }
 
                context = null  
        }
 
-}
\ No newline at end of file
+}