Merge "Remove netconf-impl test resources"
[netconf.git] / netconf / mdsal-netconf-notification / src / main / java / org / opendaylight / controller / config / yang / netconf / mdsal / notification / SessionNotificationProducer.java
index 06b3e05e5691c3043d262d306a2ce9d00c80c892..4bc7d9ff13d88b7b3f4a203c2ee2c262a53a96b5 100644 (file)
@@ -10,9 +10,11 @@ package org.opendaylight.controller.config.yang.netconf.mdsal.notification;
 import com.google.common.base.Preconditions;
 import java.util.Collection;
 import javax.annotation.Nonnull;
-import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
+import org.opendaylight.netconf.notifications.NetconfNotificationCollector;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdOrZeroType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Sessions;
@@ -21,32 +23,43 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.not
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEndBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStart;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStartBuilder;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
- * Listens on changes in NetconfState/Sessions/Session datastore and publishes them
+ * Listens on changes in NetconfState/Sessions/Session datastore and publishes them.
  */
 public class SessionNotificationProducer extends OperationalDatastoreListener<Session> {
 
     private static final InstanceIdentifier<Session> SESSION_INSTANCE_IDENTIFIER =
             InstanceIdentifier.create(NetconfState.class).child(Sessions.class).child(Session.class);
+    private static final Logger LOG = LoggerFactory.getLogger(SessionNotificationProducer.class);
+
+
     private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration;
+    private final ListenerRegistration sessionListenerRegistration;
 
-    public SessionNotificationProducer(BaseNotificationPublisherRegistration baseNotificationPublisherRegistration) {
+    public SessionNotificationProducer(final NetconfNotificationCollector netconfNotificationCollector,
+                                       final DataBroker dataBroker) {
         super(SESSION_INSTANCE_IDENTIFIER);
-        this.baseNotificationPublisherRegistration = baseNotificationPublisherRegistration;
+
+        this.baseNotificationPublisherRegistration = netconfNotificationCollector.registerBaseNotificationPublisher();
+        this.sessionListenerRegistration = registerOnChanges(dataBroker);
     }
 
+    @SuppressWarnings("checkstyle:MissingSwitchDefault")
     @Override
-    public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<Session>> changes) {
+    public void onDataTreeChanged(@Nonnull final Collection<DataTreeModification<Session>> changes) {
         for (DataTreeModification<Session> change : changes) {
             final DataObjectModification<Session> rootNode = change.getRootNode();
             final DataObjectModification.ModificationType modificationType = rootNode.getModificationType();
             switch (modificationType) {
                 case WRITE:
                     final Session created = rootNode.getDataAfter();
-                    if (created != null) {
+                    if (created != null && rootNode.getDataBefore() == null) {
                         publishStartedSession(created);
                     }
                     break;
@@ -56,11 +69,13 @@ public class SessionNotificationProducer extends OperationalDatastoreListener<Se
                         publishEndedSession(removed);
                     }
                     break;
+                default:
+                    LOG.debug("Received intentionally unhandled type: {}.", modificationType);
             }
         }
     }
 
-    private void publishStartedSession(DataObject dataObject) {
+    private void publishStartedSession(final DataObject dataObject) {
         Preconditions.checkArgument(dataObject instanceof Session);
         Session session = (Session) dataObject;
         final NetconfSessionStart sessionStart = new NetconfSessionStartBuilder()
@@ -71,7 +86,7 @@ public class SessionNotificationProducer extends OperationalDatastoreListener<Se
         baseNotificationPublisherRegistration.onSessionStarted(sessionStart);
     }
 
-    private void publishEndedSession(DataObject dataObject) {
+    private void publishEndedSession(final DataObject dataObject) {
         Preconditions.checkArgument(dataObject instanceof Session);
         Session session = (Session) dataObject;
         final NetconfSessionEnd sessionEnd = new NetconfSessionEndBuilder()
@@ -82,4 +97,16 @@ public class SessionNotificationProducer extends OperationalDatastoreListener<Se
         baseNotificationPublisherRegistration.onSessionEnded(sessionEnd);
     }
 
+
+    /**
+     * Invoked by blueprint.
+     */
+    public void close() {
+        if (baseNotificationPublisherRegistration != null) {
+            baseNotificationPublisherRegistration.close();
+        }
+        if (sessionListenerRegistration != null) {
+            sessionListenerRegistration.close();
+        }
+    }
 }