blob: 1c7fb13083515bfd9ab2dabe02626e8ac608ac97 [file] [log] [blame]
tomd7356722014-08-26 01:07:39 -07001package org.onlab.onos.event;
2
3import com.google.common.collect.ImmutableSet;
4
5import java.util.Map;
6import java.util.Set;
7import java.util.concurrent.ConcurrentHashMap;
8
9import static com.google.common.base.Preconditions.checkArgument;
10import static com.google.common.base.Preconditions.checkNotNull;
11
12/**
tom96dfcab2014-08-28 09:26:03 -070013 * Base implementation of event sink registry.
tomd7356722014-08-26 01:07:39 -070014 */
tom96dfcab2014-08-28 09:26:03 -070015public class DefaultEventSinkRegistry implements EventSinkRegistry {
tomd7356722014-08-26 01:07:39 -070016
tom96dfcab2014-08-28 09:26:03 -070017 private final Map<Class<? extends Event>, EventSink<? extends Event>>
18 sinks = new ConcurrentHashMap<>();
tomd7356722014-08-26 01:07:39 -070019
20 @Override
21 public <E extends Event> void addSink(Class<E> eventClass, EventSink<E> sink) {
22 checkNotNull(eventClass, "Event class cannot be null");
23 checkNotNull(sink, "Event sink cannot be null");
24 checkArgument(!sinks.containsKey(eventClass),
25 "Event sink already registered for %s", eventClass.getName());
26 sinks.put(eventClass, sink);
27 }
28
29 @Override
30 public <E extends Event> void removeSink(Class<E> eventClass) {
31 checkNotNull(eventClass, "Event class cannot be null");
32 checkArgument(sinks.remove(eventClass) != null,
33 "Event sink not registered for %s", eventClass.getName());
34 }
35
36 @Override
37 @SuppressWarnings("unchecked")
38 public <E extends Event> EventSink<E> getSink(Class<E> eventClass) {
tomb36046e2014-08-27 00:22:24 -070039 // TODO: add implicit registration of descendant classes
tomd7356722014-08-26 01:07:39 -070040 return (EventSink<E>) sinks.get(eventClass);
41 }
42
43 @Override
44 public Set<Class<? extends Event>> getSinks() {
45 return ImmutableSet.copyOf(sinks.keySet());
46 }
47}