View Javadoc

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