1 package com.atlassian.plugin.event.impl;
2
3 import com.atlassian.event.api.EventListener;
4 import com.atlassian.event.api.EventPublisher;
5 import com.atlassian.event.config.ListenerHandlersConfiguration;
6 import com.atlassian.event.internal.AsynchronousAbleEventDispatcher;
7 import com.atlassian.event.internal.EventExecutorFactoryImpl;
8 import com.atlassian.event.internal.EventPublisherImpl;
9 import com.atlassian.event.internal.EventThreadPoolConfigurationImpl;
10 import com.atlassian.event.spi.EventDispatcher;
11 import com.atlassian.event.spi.EventExecutorFactory;
12 import com.atlassian.event.spi.ListenerHandler;
13 import com.atlassian.plugin.event.NotificationException;
14 import com.atlassian.plugin.event.PluginEventManager;
15 import com.atlassian.plugin.scope.EverythingIsActiveScopeManager;
16 import com.atlassian.plugin.scope.ScopeManager;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import static com.atlassian.plugin.util.Assertions.notNull;
22
23
24
25
26
27
28
29 public class DefaultPluginEventManager implements PluginEventManager {
30 private final EventPublisher eventPublisher;
31
32 public DefaultPluginEventManager() {
33 this(defaultMethodSelectors());
34 }
35
36
37
38
39
40
41 public DefaultPluginEventManager(final ListenerMethodSelector... selectors) {
42 this(new EverythingIsActiveScopeManager(), selectors);
43 }
44
45 public DefaultPluginEventManager(ScopeManager scopeManager) {
46 this(scopeManager, defaultMethodSelectors());
47 }
48
49 public DefaultPluginEventManager(ScopeManager scopeManager, final ListenerMethodSelector... selectors) {
50 final ListenerHandlersConfiguration configuration = new ListenerHandlersConfiguration() {
51 public List<ListenerHandler> getListenerHandlers() {
52 final List<ListenerHandler> handlers = new ArrayList<ListenerHandler>(selectors.length);
53 for (final ListenerMethodSelector selector : selectors) {
54 handlers.add(new MethodSelectorListenerHandler(selector));
55 }
56 return handlers;
57 }
58 };
59
60 final EventExecutorFactory executorFactory = new EventExecutorFactoryImpl(new EventThreadPoolConfigurationImpl());
61 final EventDispatcher eventDispatcher = new AsynchronousAbleEventDispatcher(executorFactory);
62 eventPublisher = new EventPublisherImpl(eventDispatcher, configuration, scopeManager);
63 }
64
65
66
67
68 public DefaultPluginEventManager(final EventPublisher eventPublisher) {
69 this.eventPublisher = notNull("eventPublisher", eventPublisher);
70 }
71
72 public void register(final Object listener) {
73 eventPublisher.register(notNull("listener", listener));
74 }
75
76 public void unregister(final Object listener) {
77 eventPublisher.unregister(notNull("listener", listener));
78 }
79
80 public void broadcast(final Object event) throws NotificationException {
81 notNull("event", event);
82 try {
83 eventPublisher.publish(event);
84 } catch (final RuntimeException e) {
85 throw new NotificationException(e);
86 }
87 }
88
89 public EventPublisher getEventPublisher() {
90 return eventPublisher;
91 }
92
93 static ListenerMethodSelector[] defaultMethodSelectors() {
94 final ListenerMethodSelector methodNames = new MethodNameListenerMethodSelector();
95 final ListenerMethodSelector pluginEvent = new AnnotationListenerMethodSelector();
96 final ListenerMethodSelector eventListener = new AnnotationListenerMethodSelector(EventListener.class);
97 return new ListenerMethodSelector[]{methodNames, pluginEvent, eventListener};
98 }
99 }