Add blueprint wiring to mdsal-netconf-notification
[netconf.git] / netconf / mdsal-netconf-notification / src / main / java / org / opendaylight / controller / config / yang / netconf / mdsal / notification / SessionNotificationProducer.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.config.yang.netconf.mdsal.notification;
9
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;
29
30 /**
31  * Listens on changes in NetconfState/Sessions/Session datastore and publishes them
32  */
33 public class SessionNotificationProducer extends OperationalDatastoreListener<Session> {
34
35     private static final InstanceIdentifier<Session> SESSION_INSTANCE_IDENTIFIER =
36             InstanceIdentifier.create(NetconfState.class).child(Sessions.class).child(Session.class);
37
38     private final BaseNotificationPublisherRegistration baseNotificationPublisherRegistration;
39     private final ListenerRegistration sessionListenerRegistration;
40
41     public SessionNotificationProducer(final NetconfNotificationCollector netconfNotificationCollector,
42                                        final DataBroker dataBroker) {
43         super(SESSION_INSTANCE_IDENTIFIER);
44
45         this.baseNotificationPublisherRegistration = netconfNotificationCollector.registerBaseNotificationPublisher();
46         this.sessionListenerRegistration = registerOnChanges(dataBroker);
47     }
48
49     @Override
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) {
55                 case WRITE:
56                     final Session created = rootNode.getDataAfter();
57                     if (created != null && rootNode.getDataBefore() == null) {
58                         publishStartedSession(created);
59                     }
60                     break;
61                 case DELETE:
62                     final Session removed = rootNode.getDataBefore();
63                     if (removed != null) {
64                         publishEndedSession(removed);
65                     }
66                     break;
67             }
68         }
69     }
70
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())
78                 .build();
79         baseNotificationPublisherRegistration.onSessionStarted(sessionStart);
80     }
81
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())
89                 .build();
90         baseNotificationPublisherRegistration.onSessionEnded(sessionEnd);
91     }
92
93
94     /**
95      * Invoke by blueprint
96      */
97     public void close() {
98         if (baseNotificationPublisherRegistration != null) {
99             baseNotificationPublisherRegistration.close();
100         }
101         if (sessionListenerRegistration != null) {
102             sessionListenerRegistration.close();
103         }
104     }
105 }