From 9f6f0ac9246e8161a7d35275042a255398c68eca Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Fri, 25 Oct 2013 20:21:47 +0200 Subject: [PATCH] Added listener for rpc registrations. Change-Id: I17d4fbcee58b15b2bc34c83f8dce4495f995292d Signed-off-by: Tony Tkacik --- .../controller/sal/core/api/Broker.java | 6 ++ .../sal/core/api/RpcRegistrationListener.java | 12 +++ opendaylight/md-sal/sal-dom-broker/pom.xml | 5 ++ .../sal/dom/broker/BrokerImpl.xtend | 78 +++++++++++++------ .../sal/dom/broker/ProviderContextImpl.xtend | 17 +++- 5 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcRegistrationListener.java diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/Broker.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/Broker.java index 632a8742a0..f7c46086e3 100644 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/Broker.java +++ b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/Broker.java @@ -7,6 +7,7 @@ */ 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; @@ -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.yangtools.concepts.ListenerRegistration; 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(); + + Set getSupportedRpcs(); + + ListenerRegistration addRpcRegistrationListener(RpcRegistrationListener listener); } public interface RpcRegistration extends Registration { 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 index 0000000000..49b2f450a4 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcRegistrationListener.java @@ -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); +} diff --git a/opendaylight/md-sal/sal-dom-broker/pom.xml b/opendaylight/md-sal/sal-dom-broker/pom.xml index 47b46817bc..678728ab3b 100644 --- a/opendaylight/md-sal/sal-dom-broker/pom.xml +++ b/opendaylight/md-sal/sal-dom-broker/pom.xml @@ -25,6 +25,11 @@ sal-common-util 1.0-SNAPSHOT + + org.opendaylight.controller + sal-common-impl + 1.0-SNAPSHOT + org.opendaylight.controller sal-core-spi diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend index bdd4491d01..83dda5902d 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend @@ -7,26 +7,29 @@ */ 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); @@ -39,6 +42,8 @@ public class BrokerImpl implements Broker { private val Map, BrokerModule> serviceProviders = Collections. synchronizedMap(new HashMap, BrokerModule>()); + + private val rpcRegistrationListeners = new ListenerRegistry(); // RPC Context private val Map rpcImpls = Collections.synchronizedMap( new HashMap()); @@ -96,12 +101,31 @@ public class BrokerImpl implements Broker { throw new IllegalStateException("Implementation for rpc " + rpcType + " is already registered."); } - //TODO: Add notification for availability of Rpc 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> invokeRpc(QName rpc, CompositeNode input) { @@ -147,4 +171,12 @@ public class BrokerImpl implements Broker { sessions.remove(consumerContextImpl); providerSessions.remove(consumerContextImpl); } + + protected def getSupportedRpcs() { + rpcImpls.keySet; + } + + def ListenerRegistration addRpcRegistrationListener(RpcRegistrationListener listener) { + rpcRegistrationListeners.register(listener); + } } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/ProviderContextImpl.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/ProviderContextImpl.xtend index 27e559cb9b..3fdd706577 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/ProviderContextImpl.xtend +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/ProviderContextImpl.xtend @@ -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 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 { @@ -41,7 +45,7 @@ class ProviderContextImpl extends ConsumerContextImpl implements ProviderSession throw new IllegalStateException( "Implementation was not registered in this session"); } - broker.removeRpcImplementation(implToRemove.type); + broker.removeRpcImplementation(implToRemove.type,localImpl); rpcImpls.remove(implToRemove.type); } @@ -53,7 +57,7 @@ class ProviderContextImpl extends ConsumerContextImpl implements ProviderSession private def removeAllRpcImlementations() { if (!rpcImpls.empty) { for (entry : rpcImpls.entrySet) { - broker.removeRpcImplementation(entry.key); + broker.removeRpcImplementation(entry.key,entry.value); } rpcImpls.clear } @@ -67,6 +71,13 @@ class ProviderContextImpl extends ConsumerContextImpl implements ProviderSession throw new UnsupportedOperationException("TODO: auto-generated method stub") } + override getSupportedRpcs() { + broker.getSupportedRpcs(); + } + + override addRpcRegistrationListener(RpcRegistrationListener listener) { + broker.addRpcRegistrationListener(listener); + } } class RpcRegistrationImpl extends AbstractObjectRegistration implements RpcRegistration { @@ -87,4 +98,4 @@ class RpcRegistrationImpl extends AbstractObjectRegistration context = null } -} \ No newline at end of file +} -- 2.36.6