Bump yangtools to 3.0.0
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / md / sal / binding / compat / HeliumNotificationProviderServiceWithInterestListeners.java
index 2ccc4c13c4169a2228ad4bbba5151051cf260d9c..4dd35211cef1db296f537e0504bc6c9f72eaeecb 100644 (file)
@@ -11,11 +11,15 @@ 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.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.mdsal.binding.spec.reflect.BindingReflections;
+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;
@@ -25,17 +29,22 @@ 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
@@ -49,23 +58,42 @@ public class HeliumNotificationProviderServiceWithInterestListeners extends Heli
         return codec.getNotificationClasses(added);
     }
 
+    @SuppressWarnings("checkstyle:IllegalCatch")
     private void notifyAllListeners(final Set<SchemaPath> added) {
-        final Iterator<ListenerRegistration<NotificationInterestListener>> listeners = interestListeners.iterator();
-        if(listeners.hasNext()) {
+        final Iterator<? extends ListenerRegistration<? extends NotificationInterestListener>> listeners =
+                interestListeners.getRegistrations().iterator();
+        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 {}", listenerRef, e);
                 }
             }
         }
     }
 
-    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 static void notifyListener(final NotificationInterestListener listener,
+            final Set<Class<? extends Notification>> baEvent) {
+        for (final Class<? extends Notification> event: baEvent) {
             listener.onNotificationSubscribtion(event);
         }
     }
@@ -87,7 +115,7 @@ public class HeliumNotificationProviderServiceWithInterestListeners extends Heli
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         super.close();
         domListener.close();
     }