1 package org.opendaylight.controller.sal.streams.listeners;
5 import java.util.concurrent.ConcurrentHashMap;
6 import java.util.concurrent.locks.Lock;
7 import java.util.concurrent.locks.ReentrantLock;
9 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
12 * {@link Notificator} is responsible to create, remove and find {@link ListenerAdapter} listener.
14 public class Notificator {
16 private static Map<String, ListenerAdapter> listenersByStreamName = new ConcurrentHashMap<>();
17 private static Map<InstanceIdentifier, ListenerAdapter> listenersByInstanceIdentifier = new ConcurrentHashMap<>();
18 private static final Lock lock = new ReentrantLock();
20 private Notificator() {
24 * Returns list of all stream names
26 public static Set<String> getStreamNames() {
27 return listenersByStreamName.keySet();
32 * Gets {@link ListenerAdapter} specified by stream name.
35 * The name of the stream.
36 * @return {@link ListenerAdapter} specified by stream name.
38 public static ListenerAdapter getListenerFor(String streamName) {
39 return listenersByStreamName.get(streamName);
43 * Gets {@link ListenerAdapter} listener specified by
44 * {@link InstanceIdentifier} path.
47 * Path to data in data repository.
48 * @return ListenerAdapter
50 public static ListenerAdapter getListenerFor(InstanceIdentifier path) {
51 return listenersByInstanceIdentifier.get(path);
55 * Checks if the listener specified by {@link InstanceIdentifier} path
59 * Path to data in data repository.
60 * @return True if the listener exist, false otherwise.
62 public static boolean existListenerFor(InstanceIdentifier path) {
63 return listenersByInstanceIdentifier.containsKey(path);
67 * Creates new {@link ListenerAdapter} listener from
68 * {@link InstanceIdentifier} path and stream name.
71 * Path to data in data repository.
73 * The name of the stream.
74 * @return New {@link ListenerAdapter} listener from
75 * {@link InstanceIdentifier} path and stream name.
77 public static ListenerAdapter createListener(InstanceIdentifier path,
79 ListenerAdapter listener = new ListenerAdapter(path, streamName);
82 listenersByInstanceIdentifier.put(path, listener);
83 listenersByStreamName.put(streamName, listener);
91 * Looks for listener determined by {@link InstanceIdentifier} path and
97 public static void removeListener(InstanceIdentifier path) {
98 ListenerAdapter listener = listenersByInstanceIdentifier.get(path);
99 deleteListener(listener);
103 * Creates String representation of stream name from URI. Removes slash from
104 * URI in start and end position.
107 * URI for creation stream name.
108 * @return String representation of stream name.
110 public static String createStreamNameFromUri(String uri) {
115 if (result.startsWith("/")) {
116 result = result.substring(1);
118 if (result.endsWith("/")) {
119 result = result.substring(0, result.length());
125 * Removes all listeners.
127 public static void removeAllListeners() {
128 for (ListenerAdapter listener : listenersByInstanceIdentifier.values()) {
131 } catch (Exception e) {
136 listenersByStreamName = new ConcurrentHashMap<>();
137 listenersByInstanceIdentifier = new ConcurrentHashMap<>();
144 * Checks if listener has at least one subscriber. In case it doesn't have any, delete
150 public static void removeListenerIfNoSubscriberExists(
151 ListenerAdapter listener) {
152 if (!listener.hasSubscribers()) {
153 deleteListener(listener);
158 * Delete {@link ListenerAdapter} listener specified in parameter.
163 private static void deleteListener(ListenerAdapter listener) {
164 if (listener != null) {
167 } catch (Exception e) {
171 listenersByInstanceIdentifier.remove(listener.getPath());
172 listenersByStreamName.remove(listener.getStreamName());