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.DataObjectModification;
14 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
15 import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdOrZeroType;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Sessions;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEnd;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionEndBuilder;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStart;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStartBuilder;
24 import org.opendaylight.yangtools.yang.binding.DataObject;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 * Listens on changes in NetconfState/Sessions/Session datastore and publishes them
30 public class SessionNotificationProducer extends OperationalDatastoreListener<Session> {
32 private static final InstanceIdentifier<Session> SESSION_INSTANCE_IDENTIFIER =
33 InstanceIdentifier.create(NetconfState.class).child(Sessions.class).child(Session.class);
34 private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration;
36 public SessionNotificationProducer(BaseNotificationPublisherRegistration baseNotificationPublisherRegistration) {
37 super(SESSION_INSTANCE_IDENTIFIER);
38 this.baseNotificationPublisherRegistration = baseNotificationPublisherRegistration;
42 public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<Session>> changes) {
43 for (DataTreeModification<Session> change : changes) {
44 final DataObjectModification<Session> rootNode = change.getRootNode();
45 final DataObjectModification.ModificationType modificationType = rootNode.getModificationType();
46 switch (modificationType) {
48 final Session created = rootNode.getDataAfter();
49 if (created != null && rootNode.getDataBefore() == null) {
50 publishStartedSession(created);
54 final Session removed = rootNode.getDataBefore();
55 if (removed != null) {
56 publishEndedSession(removed);
63 private void publishStartedSession(DataObject dataObject) {
64 Preconditions.checkArgument(dataObject instanceof Session);
65 Session session = (Session) dataObject;
66 final NetconfSessionStart sessionStart = new NetconfSessionStartBuilder()
67 .setSessionId(new SessionIdOrZeroType(session.getSessionId()))
68 .setSourceHost(session.getSourceHost().getIpAddress())
69 .setUsername(session.getUsername())
71 baseNotificationPublisherRegistration.onSessionStarted(sessionStart);
74 private void publishEndedSession(DataObject dataObject) {
75 Preconditions.checkArgument(dataObject instanceof Session);
76 Session session = (Session) dataObject;
77 final NetconfSessionEnd sessionEnd = new NetconfSessionEndBuilder()
78 .setSessionId(new SessionIdOrZeroType(session.getSessionId()))
79 .setSourceHost(session.getSourceHost().getIpAddress())
80 .setUsername(session.getUsername())
82 baseNotificationPublisherRegistration.onSessionEnded(sessionEnd);