import org.opendaylight.yangtools.concepts.ListenerRegistration\r
import org.opendaylight.yangtools.concepts.Registration\r
import org.opendaylight.yangtools.yang.binding.Notification\r
-import org.slf4j.LoggerFactory\rimport org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder
-
-class NotificationBrokerImpl implements NotificationProviderService, AutoCloseable {\r
+import org.slf4j.LoggerFactory\r
+import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder\rimport com.google.common.collect.Multimaps\r
+import org.opendaylight.yangtools.concepts.util.ListenerRegistry\r
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService.NotificationInterestListener\r
\r
+class NotificationBrokerImpl implements NotificationProviderService, AutoCloseable {\r
+ \r
+ val ListenerRegistry<NotificationInterestListener> interestListeners = ListenerRegistry.create;\r
+ \r
val Multimap<Class<? extends Notification>, NotificationListener<?>> listeners;\r
\r
@Property\r
var ExecutorService executor;\r
+ \r
+ val logger = LoggerFactory.getLogger(NotificationBrokerImpl)\r
\r
new() {\r
- listeners = HashMultimap.create()\r
+ listeners = Multimaps.synchronizedSetMultimap(HashMultimap.create())\r
}\r
\r
@Deprecated\r
new(ExecutorService executor) {\r
- listeners = HashMultimap.create()\r
+ listeners = Multimaps.synchronizedSetMultimap(HashMultimap.create())\r
this.executor = executor;\r
}\r
\r
NotificationListener<T> listener) {\r
val reg = new GenericNotificationRegistration<T>(notificationType, listener, this);\r
listeners.put(notificationType, listener);\r
+ announceNotificationSubscription(notificationType);\r
return reg;\r
}\r
+ \r
+ def announceNotificationSubscription(Class<? extends Notification> notification) {\r
+ for (listener : interestListeners) {\r
+ try {\r
+ listener.instance.onNotificationSubscribtion(notification);\r
+ } catch (Exception e) {\r
+ logger.error("", e.message)\r
+ }\r
+ }\r
+ }\r
\r
override registerNotificationListener(\r
org.opendaylight.yangtools.yang.binding.NotificationListener listener) {\r
val invoker = SingletonHolder.INVOKER_FACTORY.invokerFor(listener);\r
for (notifyType : invoker.supportedNotifications) {\r
listeners.put(notifyType, invoker.invocationProxy)\r
+ announceNotificationSubscription(notifyType)\r
}\r
val registration = new GeneratedListenerRegistration(listener, invoker,this);\r
return registration as Registration<org.opendaylight.yangtools.yang.binding.NotificationListener>;\r
//FIXME: implement properly.\r
}\r
\r
+ override registerInterestListener(NotificationInterestListener interestListener) {\r
+ val registration = interestListeners.register(interestListener);\r
+ \r
+ for(notification : listeners.keySet) {\r
+ interestListener.onNotificationSubscribtion(notification);\r
+ }\r
+ return registration\r
+ }\r
}\r
\r
class GenericNotificationRegistration<T extends Notification> extends AbstractObjectRegistration<NotificationListener<T>> implements ListenerRegistration<NotificationListener<T>> {\r
\r
private static val log = LoggerFactory.getLogger(NotifyTask);\r
\r
+ @SuppressWarnings("rawtypes")\r
val NotificationListener listener;\r
val Notification notification;\r
\r
override call() {\r
+ //Only logging the complete notification in debug mode\r
try {\r
- log.info("Delivering notification {} to {}",notification,listener);\r
+ if(log.isDebugEnabled){\r
+ log.debug("Delivering notification {} to {}",notification,listener);\r
+ } else {\r
+ log.trace("Delivering notification {} to {}",notification.class.name,listener);\r
+ }\r
listener.onNotification(notification);\r
- log.info("Notification delivered {} to {}",notification,listener);\r
+ if(log.isDebugEnabled){\r
+ log.debug("Notification delivered {} to {}",notification,listener);\r
+ } else {\r
+ log.trace("Notification delivered {} to {}",notification.class.name,listener);\r
+ }\r
} catch (Exception e) {\r
log.error("Unhandled exception thrown by listener: {}", listener, e);\r
}\r