From 8da5b805c9a27699677af56a8fd9926bd63909da Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Wed, 6 May 2015 12:42:28 +0200 Subject: [PATCH 1/1] Bug 3135 - Fixed support for InterestListener InterestListener was one of undocumented beta MD-SAL APIs which was not intented for public support, but accidentally was public since Hydrogen and as it turned out other Opendaylight projects started to using it. Added support to affected components in order to still support this API even when using new Notification Broker. Change-Id: I060474f68a6c37ed05b262a9b46923f668ca3c8b Signed-off-by: Tony Tkacik (cherry picked from commit 96246098ccbe56af4f688d93dfffc9fdf62713ab) --- ...ndingNotificationPublishAdapterModule.java | 8 +- .../impl/NotificationBrokerImplModule.java | 23 ++++- ...nProviderServiceWithInterestListeners.java | 94 +++++++++++++++++++ ...gDOMNotificationPublishServiceAdapter.java | 18 ++-- .../impl/BindingToNormalizedNodeCodec.java | 18 ++++ .../test/DataBrokerTestCustomizer.java | 2 +- .../broker/impl/DOMNotificationRouter.java | 66 +++++++++++-- .../DOMNotificationSubscriptionListener.java | 32 +++++++ ...ificationSubscriptionListenerRegistry.java | 23 +++++ 9 files changed, 263 insertions(+), 21 deletions(-) create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/compat/HeliumNotificationProviderServiceWithInterestListeners.java create mode 100644 opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/DOMNotificationSubscriptionListener.java create mode 100644 opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/DOMNotificationSubscriptionListenerRegistry.java diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingNotificationPublishAdapterModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingNotificationPublishAdapterModule.java index de4a905931..ebfd5c2219 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingNotificationPublishAdapterModule.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingNotificationPublishAdapterModule.java @@ -9,17 +9,17 @@ package org.opendaylight.controller.config.yang.md.sal.binding.impl; import org.opendaylight.controller.config.api.DependencyResolver; import org.opendaylight.controller.config.api.ModuleIdentifier; -import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec; import org.opendaylight.controller.md.sal.binding.impl.BindingDOMNotificationPublishServiceAdapter; +import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec; import org.opendaylight.controller.md.sal.dom.api.DOMNotificationPublishService; import org.opendaylight.controller.sal.core.api.Broker; public class BindingNotificationPublishAdapterModule extends AbstractBindingNotificationPublishAdapterModule { - public BindingNotificationPublishAdapterModule(ModuleIdentifier identifier, DependencyResolver dependencyResolver) { + public BindingNotificationPublishAdapterModule(final ModuleIdentifier identifier, final DependencyResolver dependencyResolver) { super(identifier, dependencyResolver); } - public BindingNotificationPublishAdapterModule(ModuleIdentifier identifier, DependencyResolver dependencyResolver, BindingNotificationPublishAdapterModule oldModule, java.lang.AutoCloseable oldInstance) { + public BindingNotificationPublishAdapterModule(final ModuleIdentifier identifier, final DependencyResolver dependencyResolver, final BindingNotificationPublishAdapterModule oldModule, final java.lang.AutoCloseable oldInstance) { super(identifier, dependencyResolver, oldModule, oldInstance); } @@ -33,7 +33,7 @@ public class BindingNotificationPublishAdapterModule extends AbstractBindingNoti final BindingToNormalizedNodeCodec codec = getBindingMappingServiceDependency(); final Broker.ProviderSession session = getDomAsyncBrokerDependency().registerProvider(new DummyDOMProvider()); final DOMNotificationPublishService publishService = session.getService(DOMNotificationPublishService.class); - return new BindingDOMNotificationPublishServiceAdapter(codec.getCodecRegistry(), publishService); + return new BindingDOMNotificationPublishServiceAdapter(codec, publishService); } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java index 58d5a85565..cabdd15513 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java @@ -7,11 +7,14 @@ */ package org.opendaylight.controller.config.yang.md.sal.binding.impl; -import org.opendaylight.controller.md.sal.binding.compat.HydrogenNotificationBrokerImpl; - import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; import org.opendaylight.controller.md.sal.binding.api.NotificationService; import org.opendaylight.controller.md.sal.binding.compat.HeliumNotificationProviderServiceAdapter; +import org.opendaylight.controller.md.sal.binding.compat.HeliumNotificationProviderServiceWithInterestListeners; +import org.opendaylight.controller.md.sal.binding.compat.HydrogenNotificationBrokerImpl; +import org.opendaylight.controller.md.sal.binding.impl.BindingDOMNotificationPublishServiceAdapter; +import org.opendaylight.controller.md.sal.dom.api.DOMNotificationPublishService; +import org.opendaylight.controller.md.sal.dom.spi.DOMNotificationSubscriptionListenerRegistry; import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder; /** @@ -44,7 +47,7 @@ public final class NotificationBrokerImplModule extends final NotificationService notificationService = getNotificationAdapterDependency(); if(notificationPublishService != null & notificationService != null) { - return new HeliumNotificationProviderServiceAdapter(notificationPublishService, notificationService); + return createHeliumAdapter(notificationPublishService,notificationService); } /* @@ -53,7 +56,19 @@ public final class NotificationBrokerImplModule extends * we will have adapter implementation which will honor Helium * threading model for notifications. */ - return new HydrogenNotificationBrokerImpl(SingletonHolder.getDefaultNotificationExecutor()); } + + private static AutoCloseable createHeliumAdapter(final NotificationPublishService publishService, + final NotificationService listenService) { + if(publishService instanceof BindingDOMNotificationPublishServiceAdapter) { + final BindingDOMNotificationPublishServiceAdapter casted = (BindingDOMNotificationPublishServiceAdapter) publishService; + final DOMNotificationPublishService domService = casted.getDomPublishService(); + if(domService instanceof DOMNotificationSubscriptionListenerRegistry) { + final DOMNotificationSubscriptionListenerRegistry subsRegistry = (DOMNotificationSubscriptionListenerRegistry) domService; + return new HeliumNotificationProviderServiceWithInterestListeners(publishService, listenService, casted.getCodecRegistry(), subsRegistry); + } + } + return new HeliumNotificationProviderServiceAdapter(publishService, listenService); + } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/compat/HeliumNotificationProviderServiceWithInterestListeners.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/compat/HeliumNotificationProviderServiceWithInterestListeners.java new file mode 100644 index 0000000000..2ccc4c13c4 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/compat/HeliumNotificationProviderServiceWithInterestListeners.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.md.sal.binding.compat; + +import com.google.common.collect.Sets; +import java.util.Collections; +import java.util.Iterator; +import java.util.Set; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.controller.md.sal.binding.api.NotificationService; +import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec; +import org.opendaylight.controller.md.sal.dom.spi.DOMNotificationSubscriptionListener; +import org.opendaylight.controller.md.sal.dom.spi.DOMNotificationSubscriptionListenerRegistry; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.util.ListenerRegistry; +import org.opendaylight.yangtools.yang.binding.Notification; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HeliumNotificationProviderServiceWithInterestListeners extends HeliumNotificationProviderServiceAdapter { + + private static final Logger LOG = LoggerFactory.getLogger(HeliumNotificationProviderServiceWithInterestListeners.class); + + private final ListenerRegistry interestListeners = ListenerRegistry.create(); + private final ListenerRegistration domListener; + private final BindingToNormalizedNodeCodec codec; + + public HeliumNotificationProviderServiceWithInterestListeners( + final NotificationPublishService publishService, final NotificationService listenService, final BindingToNormalizedNodeCodec codec, final DOMNotificationSubscriptionListenerRegistry registry) { + super(publishService, listenService); + this.codec = codec; + this.domListener = registry.registerSubscriptionListener(new Listener()); + } + + @Override + public ListenerRegistration registerInterestListener( + final NotificationInterestListener listener) { + notifyListener(listener, translate(domListener.getInstance().getAllObserved())); + return interestListeners.register(listener); + } + + private Set> translate(final Set added) { + return codec.getNotificationClasses(added); + } + + private void notifyAllListeners(final Set added) { + final Iterator> listeners = interestListeners.iterator(); + if(listeners.hasNext()) { + final Set> baEvent = translate(added); + while(listeners.hasNext()) { + final NotificationInterestListener listenerRef = listeners.next().getInstance(); + try { + notifyListener(listenerRef,baEvent); + } catch (final Exception e) { + LOG.warn("Unhandled exception during invoking listener {}",e, listenerRef); + } + } + } + } + + private void notifyListener(final NotificationInterestListener listener, final Set> baEvent) { + for(final Class event: baEvent) { + listener.onNotificationSubscribtion(event); + } + } + + private final class Listener implements DOMNotificationSubscriptionListener { + + private volatile Set allObserved = Collections.emptySet(); + + @Override + public void onSubscriptionChanged(final Set currentTypes) { + final Set added = Sets.difference(currentTypes, allObserved).immutableCopy(); + notifyAllListeners(added); + allObserved = Sets.union(allObserved, added).immutableCopy(); + } + + Set getAllObserved() { + return allObserved; + } + } + + @Override + public void close() throws Exception { + super.close(); + domListener.close(); + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMNotificationPublishServiceAdapter.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMNotificationPublishServiceAdapter.java index 6c54553e6f..084f423807 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMNotificationPublishServiceAdapter.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMNotificationPublishServiceAdapter.java @@ -17,7 +17,6 @@ import org.opendaylight.controller.md.sal.binding.impl.BindingDOMAdapterBuilder. import org.opendaylight.controller.md.sal.dom.api.DOMNotification; import org.opendaylight.controller.md.sal.dom.api.DOMNotificationPublishService; import org.opendaylight.controller.md.sal.dom.api.DOMService; -import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.yangtools.yang.binding.Notification; public class BindingDOMNotificationPublishServiceAdapter implements NotificationPublishService, AutoCloseable { @@ -31,14 +30,22 @@ public class BindingDOMNotificationPublishServiceAdapter implements Notification }; - private final BindingNormalizedNodeSerializer codecRegistry; + private final BindingToNormalizedNodeCodec codecRegistry; private final DOMNotificationPublishService domPublishService; - public BindingDOMNotificationPublishServiceAdapter(final BindingNormalizedNodeSerializer codecRegistry, final DOMNotificationPublishService domPublishService) { - this.codecRegistry = codecRegistry; + public BindingDOMNotificationPublishServiceAdapter(final BindingToNormalizedNodeCodec codec, final DOMNotificationPublishService domPublishService) { + this.codecRegistry = codec; this.domPublishService = domPublishService; } + public BindingToNormalizedNodeCodec getCodecRegistry() { + return codecRegistry; + } + + public DOMNotificationPublishService getDomPublishService() { + return domPublishService; + } + @Override public void putNotification(final Notification notification) throws InterruptedException { domPublishService.putNotification(toDomNotification(notification)); @@ -76,9 +83,8 @@ public class BindingDOMNotificationPublishServiceAdapter implements Notification @Override protected NotificationPublishService createInstance(final BindingToNormalizedNodeCodec codec, final ClassToInstanceMap delegates) { - final BindingNormalizedNodeSerializer codecReg = codec.getCodecRegistry(); final DOMNotificationPublishService domPublish = delegates.getInstance(DOMNotificationPublishService.class); - return new BindingDOMNotificationPublishServiceAdapter(codecReg, domPublish); + return new BindingDOMNotificationPublishServiceAdapter(codec, domPublish); } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java index b727e5317b..ab07f50941 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java @@ -13,9 +13,11 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableBiMap; import java.lang.reflect.Method; import java.util.AbstractMap.SimpleEntry; +import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationException; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationOperation; @@ -41,6 +43,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException; import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; @@ -252,4 +255,19 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, Bi return new SimpleEntry, BindingCodecTreeNode>(bindingPath, codecContext); } + public Set> getNotificationClasses(final Set interested) { + final Set> result = new HashSet<>(); + final Set knownNotifications = runtimeContext.getSchemaContext().getNotifications(); + for (final NotificationDefinition notification : knownNotifications) { + if (interested.contains(notification.getPath())) { + try { + result.add((Class) runtimeContext.getClassForSchema(notification)); + } catch (final IllegalStateException e) { + // Ignore + } + } + } + return result; + } + } diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/test/DataBrokerTestCustomizer.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/test/DataBrokerTestCustomizer.java index 2647477c0f..ab6d1444aa 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/test/DataBrokerTestCustomizer.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/test/DataBrokerTestCustomizer.java @@ -80,7 +80,7 @@ public class DataBrokerTestCustomizer { } public NotificationPublishService createNotificationPublishService() { - return new BindingDOMNotificationPublishServiceAdapter(bindingToNormalized.getCodecRegistry(), domNotificationRouter); + return new BindingDOMNotificationPublishServiceAdapter(bindingToNormalized, domNotificationRouter); } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMNotificationRouter.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMNotificationRouter.java index e814dd2541..d623c3ec96 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMNotificationRouter.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMNotificationRouter.java @@ -9,6 +9,7 @@ package org.opendaylight.controller.md.sal.dom.broker.impl; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableMultimap.Builder; import com.google.common.collect.Multimap; @@ -23,6 +24,8 @@ import com.lmax.disruptor.dsl.Disruptor; import com.lmax.disruptor.dsl.ProducerType; import java.util.Arrays; import java.util.Collection; +import java.util.List; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -30,9 +33,14 @@ import org.opendaylight.controller.md.sal.dom.api.DOMNotification; import org.opendaylight.controller.md.sal.dom.api.DOMNotificationListener; import org.opendaylight.controller.md.sal.dom.api.DOMNotificationPublishService; import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService; +import org.opendaylight.controller.md.sal.dom.spi.DOMNotificationSubscriptionListener; +import org.opendaylight.controller.md.sal.dom.spi.DOMNotificationSubscriptionListenerRegistry; import org.opendaylight.yangtools.concepts.AbstractListenerRegistration; import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.util.ListenerRegistry; import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Joint implementation of {@link DOMNotificationPublishService} and {@link DOMNotificationService}. Provides @@ -48,7 +56,10 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; * are realized using the Disruptor's native operations. The bounded-blocking {@link #offerNotification(DOMNotification, long, TimeUnit)} * is realized by arming a background wakeup interrupt. */ -public final class DOMNotificationRouter implements AutoCloseable, DOMNotificationPublishService, DOMNotificationService { +public final class DOMNotificationRouter implements AutoCloseable, DOMNotificationPublishService, + DOMNotificationService, DOMNotificationSubscriptionListenerRegistry { + + private static final Logger LOG = LoggerFactory.getLogger(DOMNotificationRouter.class); private static final ListenableFuture NO_LISTENERS = Futures.immediateFuture(null); private static final WaitStrategy DEFAULT_STRATEGY = PhasedBackoffWaitStrategy.withLock(1L, 30L, TimeUnit.MILLISECONDS); private static final EventHandler DISPATCH_NOTIFICATIONS = new EventHandler() { @@ -68,6 +79,7 @@ public final class DOMNotificationRouter implements AutoCloseable, DOMNotificati private final Disruptor disruptor; private final ExecutorService executor; private volatile Multimap> listeners = ImmutableMultimap.of(); + private final ListenerRegistry subscriptionListeners = ListenerRegistry.create(); private DOMNotificationRouter(final ExecutorService executor, final Disruptor disruptor) { this.executor = Preconditions.checkNotNull(executor); @@ -94,12 +106,12 @@ public final class DOMNotificationRouter implements AutoCloseable, DOMNotificati final ListenerRegistration me = this; synchronized (DOMNotificationRouter.this) { - listeners = ImmutableMultimap.copyOf(Multimaps.filterValues(listeners, new Predicate>() { + replaceListeners(ImmutableMultimap.copyOf(Multimaps.filterValues(listeners, new Predicate>() { @Override public boolean apply(final ListenerRegistration input) { return input != me; } - })); + }))); } } }; @@ -108,11 +120,11 @@ public final class DOMNotificationRouter implements AutoCloseable, DOMNotificati final Builder> b = ImmutableMultimap.builder(); b.putAll(listeners); - for (SchemaPath t : types) { + for (final SchemaPath t : types) { b.put(t, reg); } - listeners = b.build(); + replaceListeners(b.build()); } return reg; @@ -123,6 +135,48 @@ public final class DOMNotificationRouter implements AutoCloseable, DOMNotificati return registerNotificationListener(listener, Arrays.asList(types)); } + /** + * Swaps registered listeners and triggers notification update + * + * @param newListeners + */ + private void replaceListeners( + final Multimap> newListeners) { + listeners = newListeners; + notifyListenerTypesChanged(newListeners.keySet()); + } + + private void notifyListenerTypesChanged(final Set typesAfter) { + final List> listenersAfter =ImmutableList.copyOf(subscriptionListeners.getListeners()); + executor.submit(new Runnable() { + + @Override + public void run() { + for (final ListenerRegistration subListener : listenersAfter) { + try { + subListener.getInstance().onSubscriptionChanged(typesAfter); + } catch (final Exception e) { + LOG.warn("Uncaught exception during invoking listener {}", subListener.getInstance(), e); + } + } + } + }); + } + + @Override + public ListenerRegistration registerSubscriptionListener( + final L listener) { + final Set initialTypes = listeners.keySet(); + executor.submit(new Runnable() { + + @Override + public void run() { + listener.onSubscriptionChanged(initialTypes); + } + }); + return subscriptionListeners.registerWithType(listener); + } + private ListenableFuture publish(final long seq, final DOMNotification notification, final Collection> subscribers) { final DOMNotificationRouterEvent event = disruptor.get(seq); final ListenableFuture future = event.initialize(notification, subscribers); @@ -145,7 +199,7 @@ public final class DOMNotificationRouter implements AutoCloseable, DOMNotificati final long seq; try { seq = disruptor.getRingBuffer().tryNext(); - } catch (InsufficientCapacityException e) { + } catch (final InsufficientCapacityException e) { return DOMNotificationPublishService.REJECTED; } diff --git a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/DOMNotificationSubscriptionListener.java b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/DOMNotificationSubscriptionListener.java new file mode 100644 index 0000000000..85369da71a --- /dev/null +++ b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/DOMNotificationSubscriptionListener.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.md.sal.dom.spi; + +import com.google.common.annotations.Beta; +import java.util.EventListener; +import java.util.Set; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; + +/** + * Listener which is notified when subscriptions changes and + * provides set of notification types for which currently + * subscriptions are in place. + * + */ +@Beta +public interface DOMNotificationSubscriptionListener extends EventListener { + + /** + * Invoked when notification subscription changed + * + * @param currentTypes Set of notification types + * for which listeners are registered. + */ + void onSubscriptionChanged(Set currentTypes); + +} diff --git a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/DOMNotificationSubscriptionListenerRegistry.java b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/DOMNotificationSubscriptionListenerRegistry.java new file mode 100644 index 0000000000..77e0d35c44 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/md/sal/dom/spi/DOMNotificationSubscriptionListenerRegistry.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.md.sal.dom.spi; + +import com.google.common.annotations.Beta; +import org.opendaylight.yangtools.concepts.ListenerRegistration; + +/** + * Registry of {@link DOMNotificationSubscriptionListener} + * which listens for changes in notification types. + * + */ +@Beta +public interface DOMNotificationSubscriptionListenerRegistry { + + ListenerRegistration registerSubscriptionListener(L listener); + +} -- 2.36.6