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.controller.config.yang.netconf.mdsal.notification;
10 import com.google.common.base.Preconditions;
11 import java.util.Collection;
12 import javax.annotation.Nonnull;
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> {
37 private static final InstanceIdentifier<Session> SESSION_INSTANCE_IDENTIFIER =
38 InstanceIdentifier.create(NetconfState.class).child(Sessions.class).child(Session.class);
39 private static final Logger LOG = LoggerFactory.getLogger(SessionNotificationProducer.class);
42 private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration;
43 private final ListenerRegistration sessionListenerRegistration;
45 public SessionNotificationProducer(final NetconfNotificationCollector netconfNotificationCollector,
46 final DataBroker dataBroker) {
47 super(SESSION_INSTANCE_IDENTIFIER);
49 this.baseNotificationPublisherRegistration = netconfNotificationCollector.registerBaseNotificationPublisher();
50 this.sessionListenerRegistration = registerOnChanges(dataBroker);
53 @SuppressWarnings("checkstyle:MissingSwitchDefault")
55 public void onDataTreeChanged(@Nonnull final Collection<DataTreeModification<Session>> changes) {
56 for (DataTreeModification<Session> change : changes) {
57 final DataObjectModification<Session> rootNode = change.getRootNode();
58 final DataObjectModification.ModificationType modificationType = rootNode.getModificationType();
59 switch (modificationType) {
61 final Session created = rootNode.getDataAfter();
62 if (created != null && rootNode.getDataBefore() == null) {
63 publishStartedSession(created);
67 final Session removed = rootNode.getDataBefore();
68 if (removed != null) {
69 publishEndedSession(removed);
73 LOG.debug("Received intentionally unhandled type: {}.", modificationType);
78 private void publishStartedSession(final DataObject dataObject) {
79 Preconditions.checkArgument(dataObject instanceof Session);
80 Session session = (Session) dataObject;
81 final NetconfSessionStart sessionStart = new NetconfSessionStartBuilder()
82 .setSessionId(new SessionIdOrZeroType(session.getSessionId()))
83 .setSourceHost(session.getSourceHost().getIpAddress())
84 .setUsername(session.getUsername())
86 baseNotificationPublisherRegistration.onSessionStarted(sessionStart);
89 private void publishEndedSession(final DataObject dataObject) {
90 Preconditions.checkArgument(dataObject instanceof Session);
91 Session session = (Session) dataObject;
92 final NetconfSessionEnd sessionEnd = new NetconfSessionEndBuilder()
93 .setSessionId(new SessionIdOrZeroType(session.getSessionId()))
94 .setSourceHost(session.getSourceHost().getIpAddress())
95 .setUsername(session.getUsername())
97 baseNotificationPublisherRegistration.onSessionEnded(sessionEnd);
102 * Invoked by blueprint.
104 public void close() {
105 if (baseNotificationPublisherRegistration != null) {
106 baseNotificationPublisherRegistration.close();
108 if (sessionListenerRegistration != null) {
109 sessionListenerRegistration.close();