Log transactions being allocated
[controller.git] / opendaylight / md-sal / sal-common-impl / src / main / java / org / opendaylight / controller / md / sal / common / impl / ListenerRegistry.java
1 package org.opendaylight.controller.md.sal.common.impl;
2
3 import java.util.Collections;
4 import java.util.EventListener;
5 import java.util.HashSet;
6 import java.util.Set;
7 import java.util.concurrent.ConcurrentHashMap;
8
9 import static com.google.common.base.Preconditions.*;
10
11 import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
12 import org.opendaylight.yangtools.concepts.ListenerRegistration;
13
14 public class ListenerRegistry<T extends EventListener> {
15
16     final Set<ListenerRegistration<T>> listeners;
17     final Set<ListenerRegistration<T>> unmodifiableView;
18
19     public ListenerRegistry() {
20         listeners = new HashSet<>();
21         unmodifiableView = Collections.unmodifiableSet(listeners);
22     }
23
24     public Iterable<ListenerRegistration<T>> getListeners() {
25         return unmodifiableView;
26     }
27
28     
29     public ListenerRegistration<T> register(T listener) {
30         checkNotNull(listener, "Listener should not be null.");
31         ListenerRegistrationImpl<T> ret = new ListenerRegistrationImpl<T>(listener);
32         listeners.add(ret);
33         return ret;
34     }
35     
36     
37     @SuppressWarnings("rawtypes")
38     private void remove(ListenerRegistrationImpl registration) {
39         listeners.remove(registration);
40     }
41
42     private class ListenerRegistrationImpl<P extends EventListener> //
43             extends AbstractObjectRegistration<P> //
44             implements ListenerRegistration<P> {
45
46         public ListenerRegistrationImpl(P instance) {
47             super(instance);
48         }
49
50         @Override
51         protected void removeRegistration() {
52             ListenerRegistry.this.remove(this);
53         }
54     }
55 }