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.BindingDOMNotificationPublishServiceAdapter;
+import org.opendaylight.controller.md.sal.binding.impl.BindingDOMNotificationServiceAdapter;
import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
+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.controller.sal.binding.api.NotificationListener;
+import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.util.ListenerRegistry;
import org.opendaylight.yangtools.yang.binding.Notification;
+import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
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 static final Logger LOG = LoggerFactory.getLogger(
+ HeliumNotificationProviderServiceWithInterestListeners.class);
private final ListenerRegistry<NotificationInterestListener> interestListeners = ListenerRegistry.create();
private final ListenerRegistration<Listener> domListener;
+ private final DOMNotificationService domService;
private final BindingToNormalizedNodeCodec codec;
public HeliumNotificationProviderServiceWithInterestListeners(
- final NotificationPublishService publishService, final NotificationService listenService, final BindingToNormalizedNodeCodec codec, final DOMNotificationSubscriptionListenerRegistry registry) {
+ final BindingDOMNotificationPublishServiceAdapter publishService,
+ final BindingDOMNotificationServiceAdapter listenService,
+ final DOMNotificationSubscriptionListenerRegistry registry) {
super(publishService, listenService);
- this.codec = codec;
+ this.codec = publishService.getCodecRegistry();
this.domListener = registry.registerSubscriptionListener(new Listener());
+ this.domService = listenService.getDomService();
}
@Override
return codec.getNotificationClasses(added);
}
+ @SuppressWarnings("checkstyle:IllegalCatch")
private void notifyAllListeners(final Set<SchemaPath> added) {
final Iterator<ListenerRegistration<NotificationInterestListener>> listeners = interestListeners.iterator();
- if(listeners.hasNext()) {
+ if (listeners.hasNext()) {
final Set<Class<? extends Notification>> baEvent = translate(added);
- while(listeners.hasNext()) {
+ 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);
+ notifyListener(listenerRef, baEvent);
+ } catch (RuntimeException e) {
+ LOG.warn("Unhandled exception during invoking listener {}", e, listenerRef);
}
}
}
}
- private void notifyListener(final NotificationInterestListener listener, final Set<Class<? extends Notification>> baEvent) {
- for(final Class<? extends Notification> event: baEvent) {
+ @Override
+ public <T extends Notification> ListenerRegistration<NotificationListener<T>> registerNotificationListener(
+ final Class<T> type, final NotificationListener<T> listener) {
+
+ final FunctionalNotificationListenerAdapter<T> adapter =
+ new FunctionalNotificationListenerAdapter<>(codec, type, listener);
+ final SchemaPath domType = SchemaPath.create(true, BindingReflections.findQName(type));
+ final ListenerRegistration<?> domReg = domService.registerNotificationListener(adapter, domType);
+ return new AbstractListenerRegistration<NotificationListener<T>>(listener) {
+ @Override
+ protected void removeRegistration() {
+ domReg.close();
+ }
+ };
+ }
+
+ private void notifyListener(final NotificationInterestListener listener,
+ final Set<Class<? extends Notification>> baEvent) {
+ for (final Class<? extends Notification> event: baEvent) {
listener.onNotificationSubscribtion(event);
}
}