Bukkit  1.5.2-R1.0
 All Classes Namespaces Files Functions Variables Enumerator Pages
HandlerList.java
Go to the documentation of this file.
1 package org.bukkit.event;
2 
3 import org.bukkit.plugin.Plugin;
4 import org.bukkit.plugin.RegisteredListener;
5 
6 import java.util.*;
7 import java.util.Map.Entry;
8 
12 public class HandlerList {
16  private volatile RegisteredListener[] handlers = null;
17 
23  private final EnumMap<EventPriority, ArrayList<RegisteredListener>> handlerslots;
24 
28  private static ArrayList<HandlerList> allLists = new ArrayList<HandlerList>();
29 
35  public static void bakeAll() {
36  synchronized (allLists) {
37  for (HandlerList h : allLists) {
38  h.bake();
39  }
40  }
41  }
42 
46  public static void unregisterAll() {
47  synchronized (allLists) {
48  for (HandlerList h : allLists) {
49  synchronized (h) {
50  for (List<RegisteredListener> list : h.handlerslots.values()) {
51  list.clear();
52  }
53  h.handlers = null;
54  }
55  }
56  }
57  }
58 
64  public static void unregisterAll(Plugin plugin) {
65  synchronized (allLists) {
66  for (HandlerList h : allLists) {
67  h.unregister(plugin);
68  }
69  }
70  }
71 
77  public static void unregisterAll(Listener listener) {
78  synchronized (allLists) {
79  for (HandlerList h : allLists) {
80  h.unregister(listener);
81  }
82  }
83  }
84 
89  public HandlerList() {
90  handlerslots = new EnumMap<EventPriority, ArrayList<RegisteredListener>>(EventPriority.class);
91  for (EventPriority o : EventPriority.values()) {
92  handlerslots.put(o, new ArrayList<RegisteredListener>());
93  }
94  synchronized (allLists) {
95  allLists.add(this);
96  }
97  }
98 
104  public synchronized void register(RegisteredListener listener) {
105  if (handlerslots.get(listener.getPriority()).contains(listener))
106  throw new IllegalStateException("This listener is already registered to priority " + listener.getPriority().toString());
107  handlers = null;
108  handlerslots.get(listener.getPriority()).add(listener);
109  }
110 
116  public void registerAll(Collection<RegisteredListener> listeners) {
117  for (RegisteredListener listener : listeners) {
118  register(listener);
119  }
120  }
121 
127  public synchronized void unregister(RegisteredListener listener) {
128  if (handlerslots.get(listener.getPriority()).remove(listener)) {
129  handlers = null;
130  }
131  }
132 
138  public synchronized void unregister(Plugin plugin) {
139  boolean changed = false;
140  for (List<RegisteredListener> list : handlerslots.values()) {
141  for (ListIterator<RegisteredListener> i = list.listIterator(); i.hasNext();) {
142  if (i.next().getPlugin().equals(plugin)) {
143  i.remove();
144  changed = true;
145  }
146  }
147  }
148  if (changed) handlers = null;
149  }
150 
156  public synchronized void unregister(Listener listener) {
157  boolean changed = false;
158  for (List<RegisteredListener> list : handlerslots.values()) {
159  for (ListIterator<RegisteredListener> i = list.listIterator(); i.hasNext();) {
160  if (i.next().getListener().equals(listener)) {
161  i.remove();
162  changed = true;
163  }
164  }
165  }
166  if (changed) handlers = null;
167  }
168 
172  public synchronized void bake() {
173  if (handlers != null) return; // don't re-bake when still valid
174  List<RegisteredListener> entries = new ArrayList<RegisteredListener>();
175  for (Entry<EventPriority, ArrayList<RegisteredListener>> entry : handlerslots.entrySet()) {
176  entries.addAll(entry.getValue());
177  }
178  handlers = entries.toArray(new RegisteredListener[entries.size()]);
179  }
180 
187  RegisteredListener[] handlers;
188  while ((handlers = this.handlers) == null) bake(); // This prevents fringe cases of returning null
189  return handlers;
190  }
191 
199  public static ArrayList<RegisteredListener> getRegisteredListeners(Plugin plugin) {
200  ArrayList<RegisteredListener> listeners = new ArrayList<RegisteredListener>();
201  synchronized (allLists) {
202  for (HandlerList h : allLists) {
203  synchronized (h) {
204  for (List<RegisteredListener> list : h.handlerslots.values()) {
205  for (RegisteredListener listener : list) {
206  if (listener.getPlugin().equals(plugin)) {
207  listeners.add(listener);
208  }
209  }
210  }
211  }
212  }
213  }
214  return listeners;
215  }
216 
222  @SuppressWarnings("unchecked")
223  public static ArrayList<HandlerList> getHandlerLists() {
224  synchronized (allLists) {
225  return (ArrayList<HandlerList>) allLists.clone();
226  }
227  }
228 }