cn.nukkit.event.HandlerList Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of powernukkit Show documentation
Show all versions of powernukkit Show documentation
A Minecraft Bedrock Edition server software implementation made in Java from scratch which supports all new features.
package cn.nukkit.event;
import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.plugin.Plugin;
import cn.nukkit.plugin.RegisteredListener;
import java.util.*;
/**
* @author Nukkit Team.
*/
public class HandlerList {
private volatile RegisteredListener[] handlers = null;
private final EnumMap> handlerslots;
private static final ArrayList allLists = new ArrayList<>();
public static void bakeAll() {
synchronized (allLists) {
for (HandlerList h : allLists) {
h.bake();
}
}
}
public static void unregisterAll() {
synchronized (allLists) {
for (HandlerList h : allLists) {
synchronized (h) {
for (List list : h.handlerslots.values()) {
list.clear();
}
h.handlers = null;
}
}
}
}
public static void unregisterAll(Plugin plugin) {
synchronized (allLists) {
for (HandlerList h : allLists) {
h.unregister(plugin);
}
}
}
public static void unregisterAll(Listener listener) {
synchronized (allLists) {
for (HandlerList h : allLists) {
h.unregister(listener);
}
}
}
public HandlerList() {
handlerslots = new EnumMap<>(EventPriority.class);
for (EventPriority o : EventPriority.values()) {
handlerslots.put(o, new ArrayList<>());
}
synchronized (allLists) {
allLists.add(this);
}
}
public synchronized void register(RegisteredListener listener) {
if (handlerslots.get(listener.getPriority()).contains(listener))
throw new IllegalStateException("This listener is already registered to priority " + listener.getPriority().toString());
handlers = null;
handlerslots.get(listener.getPriority()).add(listener);
}
public void registerAll(Collection listeners) {
for (RegisteredListener listener : listeners) {
register(listener);
}
}
public synchronized void unregister(RegisteredListener listener) {
if (handlerslots.get(listener.getPriority()).remove(listener)) {
handlers = null;
}
}
public synchronized void unregister(Plugin plugin) {
boolean changed = false;
for (List list : handlerslots.values()) {
for (ListIterator i = list.listIterator(); i.hasNext(); ) {
if (i.next().getPlugin().equals(plugin)) {
i.remove();
changed = true;
}
}
}
if (changed) handlers = null;
}
public synchronized void unregister(Listener listener) {
boolean changed = false;
for (List list : handlerslots.values()) {
for (ListIterator i = list.listIterator(); i.hasNext(); ) {
if (i.next().getListener().equals(listener)) {
i.remove();
changed = true;
}
}
}
if (changed) handlers = null;
}
public synchronized void bake() {
if (handlers != null) return; // don't re-bake when still valid
List entries = new ArrayList<>();
for (Map.Entry> entry : handlerslots.entrySet()) {
entries.addAll(entry.getValue());
}
handlers = entries.toArray(RegisteredListener.EMPTY_ARRAY);
}
public RegisteredListener[] getRegisteredListeners() {
RegisteredListener[] handlers;
while ((handlers = this.handlers) == null) {
bake();
} // This prevents fringe cases of returning null
return handlers;
}
public static ArrayList getRegisteredListeners(Plugin plugin) {
ArrayList listeners = new ArrayList<>();
synchronized (allLists) {
for (HandlerList h : allLists) {
synchronized (h) {
for (List list : h.handlerslots.values()) {
for (RegisteredListener listener : list) {
if (listener.getPlugin().equals(plugin)) {
listeners.add(listener);
}
}
}
}
}
}
return listeners;
}
public static ArrayList getHandlerLists() {
synchronized (allLists) {
return new ArrayList<>(allLists);
}
}
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public boolean isEmpty() {
RegisteredListener[] handlers = this.handlers;
if (handlers != null) {
return handlers.length == 0;
}
return getRegisteredListeners().length == 0;
}
}