Merge "Removing { } from NormalizedNodeJsonBodyWriter"
[controller.git] / opendaylight / md-sal / messagebus-impl / src / main / java / org / opendaylight / controller / messagebus / app / impl / EventSourceTopology.java
1 /*
2  * Copyright (c) 2013 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
9 package org.opendaylight.controller.messagebus.app.impl;
10
11 import java.util.List;
12 import java.util.Map;
13 import java.util.concurrent.ConcurrentHashMap;
14
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.controller.mdsal.DataStore;
19 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.messagebus.eventsource.rev141202.Node1;
20 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.messagebus.eventsource.rev141202.Node1Builder;
21 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.messagebus.eventsource.rev141202.TopologyTypes1;
22 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.messagebus.eventsource.rev141202.TopologyTypes1Builder;
23 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.messagebus.eventsource.rev141202.topology.event.source.type.TopologyEventSource;
24 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.messagebus.eventsource.rev141202.topology.event.source.type.TopologyEventSourceBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
29 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
30 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
32 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.TopologyTypes;
33 import org.opendaylight.yangtools.concepts.ListenerRegistration;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38
39 public class EventSourceTopology {
40     private static final Logger LOGGER = LoggerFactory.getLogger(EventSourceTopology.class);
41
42     private static final String topologyId = "EVENT-SOURCE-TOPOLOGY" ;
43     private static final TopologyKey topologyKey = new TopologyKey(new TopologyId(topologyId));
44     private static final LogicalDatastoreType datastoreType = LogicalDatastoreType.OPERATIONAL;
45
46     private static final InstanceIdentifier<Topology> topologyInstanceIdentifier =
47             InstanceIdentifier.create(NetworkTopology.class)
48                     .child(Topology.class, topologyKey);
49
50     private static final InstanceIdentifier<TopologyTypes1> topologyTypeInstanceIdentifier =
51             topologyInstanceIdentifier
52                     .child(TopologyTypes.class)
53                     .augmentation(TopologyTypes1.class);
54
55     private static final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
56                                             .network.topology.rev131021.network.topology.topology.Node> eventSourceTopologyPath =
57             InstanceIdentifier.create(NetworkTopology.class)
58                     .child(Topology.class)
59                     .child(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
60                             .network.topology.rev131021.network.topology.topology.Node.class);
61
62     private final Map<DataChangeListener, ListenerRegistration<DataChangeListener>> registrations =
63             new ConcurrentHashMap<>();
64
65     private final DataStore dataStore;
66
67     public EventSourceTopology(DataStore dataStore) {
68         this.dataStore = dataStore;
69     }
70
71     public void mdsalReady() {
72         TopologyEventSource topologySource = new TopologyEventSourceBuilder().build();
73         TopologyTypes1 topologyTypeAugment = new TopologyTypes1Builder().setTopologyEventSource(topologySource).build();
74
75         dataStore.asyncPUT(datastoreType, topologyTypeInstanceIdentifier, topologyTypeAugment);
76     }
77
78     public void insert(Node node) {
79         String nodeId = node.getKey().getId().getValue();
80         NodeKey nodeKey = new NodeKey(new NodeId(nodeId));
81         InstanceIdentifier<Node1> topologyNodeAugment
82                 = topologyInstanceIdentifier
83                 .child(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
84                         .network.topology.rev131021.network.topology.topology.Node.class, nodeKey)
85                 .augmentation(Node1.class);
86
87         Node1 nodeAgument = new Node1Builder().setEventSourceNode(node.getId()).build();
88         dataStore.asyncPUT(datastoreType, topologyNodeAugment, nodeAgument);
89     }
90
91     // TODO: Should we expose this functioanlity over RPC?
92     public List<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
93                 .network.topology.rev131021.network.topology.topology.Node> snapshot() {
94         Topology topology = dataStore.read(datastoreType, topologyInstanceIdentifier);
95         return topology.getNode();
96     }
97
98     public void registerDataChangeListener(DataChangeListener listener) {
99         ListenerRegistration<DataChangeListener> listenerRegistration = dataStore.registerDataChangeListener(datastoreType,
100                 eventSourceTopologyPath,
101                 listener,
102                 DataBroker.DataChangeScope.SUBTREE);
103
104         registrations.put(listener, listenerRegistration);
105     }
106 }