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.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
15 import org.opendaylight.controller.md.sal.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;
31 * Listens on changes in NetconfState/Sessions/Session datastore and publishes them
33 public class SessionNotificationProducer extends OperationalDatastoreListener<Session> {
35 private static final InstanceIdentifier<Session> SESSION_INSTANCE_IDENTIFIER =
36 InstanceIdentifier.create(NetconfState.class).child(Sessions.class).child(Session.class);
38 private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration;
39 private final ListenerRegistration sessionListenerRegistration;
41 public SessionNotificationProducer(final NetconfNotificationCollector netconfNotificationCollector,
42 final DataBroker dataBroker) {
43 super(SESSION_INSTANCE_IDENTIFIER);
45 this.baseNotificationPublisherRegistration = netconfNotificationCollector.registerBaseNotificationPublisher();
46 this.sessionListenerRegistration = registerOnChanges(dataBroker);
50 public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<Session>> changes) {
51 for (DataTreeModification<Session> change : changes) {
52 final DataObjectModification<Session> rootNode = change.getRootNode();
53 final DataObjectModification.ModificationType modificationType = rootNode.getModificationType();
54 switch (modificationType) {
56 final Session created = rootNode.getDataAfter();
57 if (created != null && rootNode.getDataBefore() == null) {
58 publishStartedSession(created);
62 final Session removed = rootNode.getDataBefore();
63 if (removed != null) {
64 publishEndedSession(removed);
71 private void publishStartedSession(DataObject dataObject) {
72 Preconditions.checkArgument(dataObject instanceof Session);
73 Session session = (Session) dataObject;
74 final NetconfSessionStart sessionStart = new NetconfSessionStartBuilder()
75 .setSessionId(new SessionIdOrZeroType(session.getSessionId()))
76 .setSourceHost(session.getSourceHost().getIpAddress())
77 .setUsername(session.getUsername())
79 baseNotificationPublisherRegistration.onSessionStarted(sessionStart);
82 private void publishEndedSession(DataObject dataObject) {
83 Preconditions.checkArgument(dataObject instanceof Session);
84 Session session = (Session) dataObject;
85 final NetconfSessionEnd sessionEnd = new NetconfSessionEndBuilder()
86 .setSessionId(new SessionIdOrZeroType(session.getSessionId()))
87 .setSourceHost(session.getSourceHost().getIpAddress())
88 .setUsername(session.getUsername())
90 baseNotificationPublisherRegistration.onSessionEnded(sessionEnd);
98 if (baseNotificationPublisherRegistration != null) {
99 baseNotificationPublisherRegistration.close();
101 if (sessionListenerRegistration != null) {
102 sessionListenerRegistration.close();