Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2015
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.70 KB | None | 0 0
  1. // JavaDocs at GitHub Repo (if needed)
  2. public class EventManager {
  3.  
  4. private static volatile Logger logger = Logger.getLogger("EGEventManager");
  5.  
  6. private static volatile List<Class<? extends Event>> eventClasses = new ArrayList<>();
  7. private static volatile List<EventListener> registeredListeners = new ArrayList<>();
  8.  
  9. ...
  10. public static synchronized boolean registerEventClass(Class<? extends Event> event) {
  11. if (!eventClasses.contains(event)) {
  12. eventClasses.add(event);
  13. return true;
  14. }
  15. return false;
  16. }
  17.  
  18. ...
  19. public static synchronized boolean unregisterEventClass(Class<? extends Event> event) {
  20. if (eventClasses.contains(event)) {
  21. eventClasses.remove(event);
  22. return true;
  23. }
  24. return false;
  25. }
  26.  
  27. ...
  28. public static synchronized boolean isEventClassRegistered(Class<? extends Event> event) {
  29. return eventClasses.contains(event);
  30. }
  31.  
  32. ...
  33. public static synchronized List<RegisteredEvent> registerEventListener(EventListener listener) {
  34. List<RegisteredEvent> newlyRegistered = null;
  35. if (!registeredListeners.contains(listener)) {
  36. newlyRegistered = registerEventHandlers(listener);
  37. }
  38. return newlyRegistered;
  39. }
  40.  
  41. @SuppressWarnings("unchecked")
  42. private static synchronized List<RegisteredEvent> registerEventHandlers(EventListener listener) {
  43. List<RegisteredEvent> newlyRegistered = new ArrayList<>();
  44.  
  45. try {
  46. Class<? extends EventListener> eventListenerClass = listener.getClass();
  47. Method[] classMethods = eventListenerClass.getDeclaredMethods();
  48. for (int i = 0; i < classMethods.length; i++) {
  49. Method method = classMethods[i];
  50. if (method.getParameterCount() != 1) continue;
  51. EventHandler[] methodAnnotations = method.getDeclaredAnnotationsByType(EventHandler.class);
  52. if (methodAnnotations.length == 0) continue;
  53. EventHandler eventHandlerAnnotation = methodAnnotations[0];
  54. EventPriority priority = eventHandlerAnnotation.value();
  55. Class<? extends Event> eventClass = (Class<? extends Event>) method.getParameterTypes()[0];
  56. PrioritizedEvents.addRegisteredEvent(new RegisteredEvent(listener, method, eventClass, priority));
  57. }
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. }
  61. return newlyRegistered;
  62. }
  63.  
  64. ...
  65. public static synchronized boolean unregisterEventListener(EventListener listener) {
  66. if (registeredListeners.contains(listener)) {
  67. registeredListeners.remove(listener);
  68. return true;
  69. }
  70. return false;
  71. }
  72.  
  73. ...
  74. public static synchronized void call(EventExecutor eventExecutor, Class<? extends Event> eventClass, Object... eventArgs) {
  75. try {
  76. if (!eventClasses.contains(eventClass)) {
  77. logger.warning("EventManager.call(Class<? extends Event>) cancelled: event is not contained in the registered Event classes!");
  78. return;
  79. }
  80.  
  81. List<RegisteredEvent> lowPriority = PrioritizedEvents.getRegisteredEvents(EventPriority.Low);
  82. List<RegisteredEvent> normalPriority = PrioritizedEvents.getRegisteredEvents(EventPriority.Normal);
  83. List<RegisteredEvent> highPriority = PrioritizedEvents.getRegisteredEvents(EventPriority.High);
  84.  
  85. Event eventInstance = null;
  86.  
  87. Class<?>[] constructorParameters = EventUtilities.getArrayOfClasses(eventArgs);
  88. Constructor<?> constructor = eventClass.getDeclaredConstructor(constructorParameters);
  89.  
  90. eventInstance = (Event) constructor.newInstance(eventArgs);
  91.  
  92. for (int i = 0; i < lowPriority.size(); i++) {
  93. RegisteredEvent registeredEvent = lowPriority.get(i);
  94. EventListener listener = registeredEvent.getListener();
  95. Method method = registeredEvent.getMethod();
  96.  
  97. if (registeredEvent.getEventClass() != eventClass) continue;
  98. method.invoke(listener, eventInstance);
  99. }
  100. for (int i = 0; i < normalPriority.size(); i++) {
  101. RegisteredEvent registeredEvent = normalPriority.get(i);
  102. EventListener listener = registeredEvent.getListener();
  103. Method method = registeredEvent.getMethod();
  104.  
  105. if (registeredEvent.getEventClass() != eventClass) continue;
  106. method.invoke(listener, eventInstance);
  107. }
  108. for (int i = 0; i < highPriority.size(); i++) {
  109. RegisteredEvent registeredEvent = highPriority.get(i);
  110. EventListener listener = registeredEvent.getListener();
  111. Method method = registeredEvent.getMethod();
  112.  
  113. if (registeredEvent.getEventClass() != eventClass) continue;
  114. method.invoke(listener, eventInstance);
  115. }
  116.  
  117. if (!eventInstance.isCancelled()) eventExecutor.execute();
  118. } catch (Exception e) {
  119. e.printStackTrace();
  120. }
  121. }
  122.  
  123. ...
  124. static class PrioritizedEvents {
  125.  
  126. private static volatile Map<EventPriority, List<RegisteredEvent>> prioritized = new HashMap<>();
  127.  
  128. static {
  129. EventPriority[] values = EventPriority.values();
  130. for (int i = 0; i < values.length; i++) {
  131. EventPriority priority = values[i];
  132. prioritized.put(priority, new ArrayList<>());
  133. }
  134. }
  135.  
  136. ...
  137. public static synchronized List<RegisteredEvent> getRegisteredEvents(EventPriority priority) {
  138. return prioritized.get(priority);
  139. }
  140.  
  141. ...
  142. public static synchronized boolean addRegisteredEvent(RegisteredEvent registeredEvent) {
  143. getRegisteredEvents(registeredEvent.getPriority()).add(registeredEvent);
  144. return true;
  145. }
  146. }
  147.  
  148. // Full code available at GitHub (if needed)
  149. public class RegisteredEvent {
  150.  
  151. private EventListener listener;
  152. private Method method;
  153. private Class<? extends Event> eventClass;
  154. private EventPriority priority;
  155.  
  156. ...
  157. public RegisteredEvent(EventListener listener, Method method, Class<? extends Event> eventClass, EventPriority priority) {
  158. this.listener = listener;
  159. this.method = method;
  160. this.eventClass = eventClass;
  161. this.priority = priority;
  162. }
  163.  
  164. ...
  165. public EventListener getListener() {
  166. return listener;
  167. }
  168.  
  169. ...
  170. public Method getMethod() {
  171. return method;
  172. }
  173.  
  174. ...
  175. public Class<?> getEventClass() {
  176. return eventClass;
  177. }
  178.  
  179. ...
  180. public EventPriority getPriority() {
  181. return priority;
  182. }
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement