2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.netconf.mdsal.notification.impl;
10 import static com.google.common.base.Preconditions.checkArgument;
12 import java.util.Collection;
13 import org.opendaylight.mdsal.binding.api.DataBroker;
14 import org.opendaylight.mdsal.binding.api.DataObjectModification;
15 import org.opendaylight.mdsal.binding.api.DataTreeModification;
16 import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
17 import org.opendaylight.netconf.notifications.NetconfNotificationCollector;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdOrZeroType;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Sessions;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEnd;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEndBuilder;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStart;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStartBuilder;
26 import org.opendaylight.yangtools.concepts.ListenerRegistration;
27 import org.opendaylight.yangtools.yang.binding.DataObject;
28 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
33 * Listens on changes in NetconfState/Sessions/Session datastore and publishes them.
35 public class SessionNotificationProducer extends OperationalDatastoreListener<Session> {
36 private static final InstanceIdentifier<Session> SESSION_INSTANCE_IDENTIFIER =
37 InstanceIdentifier.create(NetconfState.class).child(Sessions.class).child(Session.class);
38 private static final Logger LOG = LoggerFactory.getLogger(SessionNotificationProducer.class);
40 private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration;
41 private final ListenerRegistration<?> sessionListenerRegistration;
43 public SessionNotificationProducer(final NetconfNotificationCollector netconfNotificationCollector,
44 final DataBroker dataBroker) {
45 super(SESSION_INSTANCE_IDENTIFIER);
47 this.baseNotificationPublisherRegistration = netconfNotificationCollector.registerBaseNotificationPublisher();
48 this.sessionListenerRegistration = registerOnChanges(dataBroker);
52 public void onDataTreeChanged(final Collection<DataTreeModification<Session>> changes) {
53 for (DataTreeModification<Session> change : changes) {
54 final DataObjectModification<Session> rootNode = change.getRootNode();
55 final DataObjectModification.ModificationType modificationType = rootNode.getModificationType();
56 switch (modificationType) {
58 final Session created = rootNode.getDataAfter();
59 if (created != null && rootNode.getDataBefore() == null) {
60 publishStartedSession(created);
64 final Session removed = rootNode.getDataBefore();
65 if (removed != null) {
66 publishEndedSession(removed);
70 LOG.debug("Received intentionally unhandled type: {}.", modificationType);
75 private void publishStartedSession(final DataObject dataObject) {
76 checkArgument(dataObject instanceof Session);
77 Session session = (Session) dataObject;
78 final NetconfSessionStart sessionStart = new NetconfSessionStartBuilder()
79 .setSessionId(new SessionIdOrZeroType(session.getSessionId()))
80 .setSourceHost(session.getSourceHost().getIpAddress())
81 .setUsername(session.getUsername())
83 baseNotificationPublisherRegistration.onSessionStarted(sessionStart);
86 private void publishEndedSession(final DataObject dataObject) {
87 checkArgument(dataObject instanceof Session);
88 Session session = (Session) dataObject;
89 final NetconfSessionEnd sessionEnd = new NetconfSessionEndBuilder()
90 .setSessionId(new SessionIdOrZeroType(session.getSessionId()))
91 .setSourceHost(session.getSourceHost().getIpAddress())
92 .setUsername(session.getUsername())
94 baseNotificationPublisherRegistration.onSessionEnded(sessionEnd);
98 * Invoked by blueprint.
100 public void close() {
101 if (baseNotificationPublisherRegistration != null) {
102 baseNotificationPublisherRegistration.close();
104 if (sessionListenerRegistration != null) {
105 sessionListenerRegistration.close();