View Javadoc
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   * Simple, synchronous event manager that uses one or more method selectors to determine event listeners.
25   * <p>
26   * The default method selectors are {@link MethodNameListenerMethodSelector} and
27   * {@link AnnotationListenerMethodSelector}.
28   */
29  public class DefaultPluginEventManager implements PluginEventManager {
30      private final EventPublisher eventPublisher;
31  
32      public DefaultPluginEventManager() {
33          this(defaultMethodSelectors());
34      }
35  
36      /**
37       * Uses the supplied selectors to determine listener methods.
38       *
39       * @param selectors used to determine which are listener methods
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       * Delegate all event publication to the supplied {@code EventPublisher}.
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  }