MCPcopy Create free account
hub / github.com/antlr/codebuff / SubscriberRegistry

Class SubscriberRegistry

output/java_guava/1.4.18/SubscriberRegistry.java:54–244  ·  view source on GitHub ↗

Registry of subscribers to a single event bus. @author Colin Decker

Source from the content-addressed store, hash-verified

52
53
54final class SubscriberRegistry {
55
56 /**
57 * All registered subscribers, indexed by event type.
58 *
59 * <p>The {@link CopyOnWriteArraySet} values make it easy and relatively lightweight to get an
60 * immutable snapshot of all current subscribers to an event without any locking.
61 */
62 private final ConcurrentMap<Class<?>, CopyOnWriteArraySet<Subscriber>> subscribers = Maps.newConcurrentMap();
63
64 /**
65 * The event bus this registry belongs to.
66 */
67
68 @Weak
69 private final EventBus bus;
70
71 SubscriberRegistry(EventBus bus) {
72 this.bus = checkNotNull(bus);
73 }
74
75 /**
76 * Registers all subscriber methods on the given listener object.
77 */
78
79 void register(Object listener) {
80 Multimap<Class<?>, Subscriber> listenerMethods = findAllSubscribers(listener);
81 for (Map.Entry<Class<?>, Collection<Subscriber>> entry : listenerMethods.asMap().entrySet()) {
82 Class<?> eventType = entry.getKey();
83 Collection<Subscriber> eventMethodsInListener = entry.getValue();
84 CopyOnWriteArraySet<Subscriber> eventSubscribers = subscribers.get(eventType);
85 if (eventSubscribers == null) {
86 CopyOnWriteArraySet<Subscriber> newSet = new CopyOnWriteArraySet<Subscriber>();
87 eventSubscribers = MoreObjects.firstNonNull(subscribers.putIfAbsent(eventType, newSet), newSet);
88 }
89 eventSubscribers.addAll(eventMethodsInListener);
90 }
91 }
92
93 /**
94 * Unregisters all subscribers on the given listener object.
95 */
96
97 void unregister(Object listener) {
98 Multimap<Class<?>, Subscriber> listenerMethods = findAllSubscribers(listener);
99 for (Map.Entry<Class<?>, Collection<Subscriber>> entry : listenerMethods.asMap().entrySet()) {
100 Class<?> eventType = entry.getKey();
101 Collection<Subscriber> listenerMethodsForType = entry.getValue();
102 CopyOnWriteArraySet<Subscriber> currentSubscribers = subscribers.get(eventType);
103 if (currentSubscribers == null
104 || !currentSubscribers.removeAll(listenerMethodsForType)) {
105 // if removeAll returns true, all we really know is that at least one subscriber was
106 // removed... however, barring something very strange we can assume that if at least one
107 // subscriber was removed, all subscribers on listener for that event type were... after
108 // all, the definition of subscribers on a particular class is totally static
109 throw new IllegalArgumentException("missing event subscriber for an annotated method. Is " + listener
110 + " registered?");
111 }

Callers

nothing calls this directly

Calls 4

newConcurrentMapMethod · 0.95
newBuilderMethod · 0.95
buildMethod · 0.45
weakKeysMethod · 0.45

Tested by

no test coverage detected