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;
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;
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()
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()
baseNotificationPublisherRegistration.onSessionEnded(sessionEnd);
}
+
+ /**
+ * Invoked by blueprint.
+ */
+ public void close() {
+ if (baseNotificationPublisherRegistration != null) {
+ baseNotificationPublisherRegistration.close();
+ }
+ if (sessionListenerRegistration != null) {
+ sessionListenerRegistration.close();
+ }
+ }
}