289 lines
13 KiB
Java
289 lines
13 KiB
Java
package com.hypixel.hytale.event;
|
|
|
|
import com.hypixel.hytale.logger.HytaleLogger;
|
|
import java.util.HashSet;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.concurrent.CompletableFuture;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.function.Consumer;
|
|
import java.util.function.Function;
|
|
import javax.annotation.Nonnull;
|
|
import javax.annotation.Nullable;
|
|
|
|
public class EventBus implements IEventBus {
|
|
@Nonnull
|
|
private static final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
|
|
@Nonnull
|
|
private final Map<Class<? extends IBaseEvent<?>>, EventBusRegistry<?, ?, ?>> registryMap = new ConcurrentHashMap<>();
|
|
private final boolean timeEvents;
|
|
|
|
public EventBus(boolean timeEvents) {
|
|
this.timeEvents = timeEvents;
|
|
}
|
|
|
|
public void shutdown() {
|
|
this.registryMap.values().forEach(EventBusRegistry::shutdown);
|
|
}
|
|
|
|
@Nonnull
|
|
public Set<Class<? extends IBaseEvent<?>>> getRegisteredEventClasses() {
|
|
return new HashSet<>(this.registryMap.keySet());
|
|
}
|
|
|
|
@Nonnull
|
|
public Set<String> getRegisteredEventClassNames() {
|
|
Set<String> classNames = new HashSet<>();
|
|
|
|
for (Class<?> aClass : this.registryMap.keySet()) {
|
|
classNames.add(aClass.getSimpleName());
|
|
}
|
|
|
|
return classNames;
|
|
}
|
|
|
|
@Nullable
|
|
public EventBusRegistry<?, ?, ?> getRegistry(@Nonnull String eventName) {
|
|
Class<? extends IBaseEvent> eventClass = null;
|
|
|
|
for (Class<? extends IBaseEvent<?>> aClass : this.registryMap.keySet()) {
|
|
if (aClass.getSimpleName().equalsIgnoreCase(eventName) || aClass.getName().equalsIgnoreCase(eventName)) {
|
|
eventClass = aClass;
|
|
}
|
|
}
|
|
|
|
return eventClass == null ? null : this.getRegistry(eventClass);
|
|
}
|
|
|
|
@Nonnull
|
|
public <KeyType, EventType extends IBaseEvent<KeyType>> EventBusRegistry<KeyType, EventType, ?> getRegistry(@Nonnull Class<? super EventType> eventClass) {
|
|
return (EventBusRegistry<KeyType, EventType, ?>)(IAsyncEvent.class.isAssignableFrom(eventClass)
|
|
? this.getAsyncRegistry(eventClass)
|
|
: this.getSyncRegistry(eventClass));
|
|
}
|
|
|
|
@Nonnull
|
|
public <KeyType, EventType extends IEvent<KeyType>> EventBusRegistry<KeyType, EventType, ?> getSyncRegistry(@Nonnull Class<? super EventType> eventClass) {
|
|
EventBusRegistry<?, ? extends IBaseEvent<?>, ? extends EventBusRegistry.EventConsumerMap<? extends IBaseEvent<?>, ?, ?>> registry = (EventBusRegistry<?, ? extends IBaseEvent<?>, ? extends EventBusRegistry.EventConsumerMap<? extends IBaseEvent<?>, ?, ?>>)this.registryMap
|
|
.computeIfAbsent((Class<? extends IBaseEvent<?>>)eventClass, aClass -> new SyncEventBusRegistry(LOGGER, (Class<EventType>)aClass));
|
|
if (this.timeEvents) {
|
|
registry.setTimeEvents(true);
|
|
}
|
|
|
|
return (EventBusRegistry<KeyType, EventType, ?>)registry;
|
|
}
|
|
|
|
@Nonnull
|
|
private <KeyType, EventType extends IAsyncEvent<KeyType>> AsyncEventBusRegistry<KeyType, EventType> getAsyncRegistry(
|
|
@Nonnull Class<? super EventType> eventClass
|
|
) {
|
|
EventBusRegistry<?, ? extends IBaseEvent<?>, ? extends EventBusRegistry.EventConsumerMap<? extends IBaseEvent<?>, ?, ?>> registry = (EventBusRegistry<?, ? extends IBaseEvent<?>, ? extends EventBusRegistry.EventConsumerMap<? extends IBaseEvent<?>, ?, ?>>)this.registryMap
|
|
.computeIfAbsent((Class<? extends IBaseEvent<?>>)eventClass, aClass -> new AsyncEventBusRegistry(LOGGER, (Class<EventType>)aClass));
|
|
if (this.timeEvents) {
|
|
registry.setTimeEvents(true);
|
|
}
|
|
|
|
return (AsyncEventBusRegistry<KeyType, EventType>)registry;
|
|
}
|
|
|
|
@Override
|
|
public <EventType extends IBaseEvent<Void>> EventRegistration<Void, EventType> register(
|
|
@Nonnull Class<? super EventType> eventClass, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.register((short)0, eventClass, null, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <EventType extends IBaseEvent<Void>> EventRegistration<Void, EventType> register(
|
|
@Nonnull EventPriority priority, @Nonnull Class<? super EventType> eventClass, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.register(priority.getValue(), eventClass, null, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <EventType extends IBaseEvent<Void>> EventRegistration<Void, EventType> register(
|
|
short priority, @Nonnull Class<? super EventType> eventClass, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.register(priority, eventClass, null, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IBaseEvent<KeyType>> EventRegistration<KeyType, EventType> register(
|
|
@Nonnull Class<? super EventType> eventClass, @Nonnull KeyType key, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.register((short)0, eventClass, key, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IBaseEvent<KeyType>> EventRegistration<KeyType, EventType> register(
|
|
@Nonnull EventPriority priority, @Nonnull Class<? super EventType> eventClass, @Nonnull KeyType key, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.register(priority.getValue(), eventClass, key, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IBaseEvent<KeyType>> EventRegistration<KeyType, EventType> register(
|
|
short priority, @Nonnull Class<? super EventType> eventClass, @Nullable KeyType key, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.<KeyType, EventType>getRegistry(eventClass).register(priority, key, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <EventType extends IAsyncEvent<Void>> EventRegistration<Void, EventType> registerAsync(
|
|
@Nonnull Class<? super EventType> eventClass, @Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.registerAsync((short)0, eventClass, null, function);
|
|
}
|
|
|
|
@Override
|
|
public <EventType extends IAsyncEvent<Void>> EventRegistration<Void, EventType> registerAsync(
|
|
@Nonnull EventPriority priority,
|
|
@Nonnull Class<? super EventType> eventClass,
|
|
@Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.registerAsync(priority.getValue(), eventClass, null, function);
|
|
}
|
|
|
|
@Override
|
|
public <EventType extends IAsyncEvent<Void>> EventRegistration<Void, EventType> registerAsync(
|
|
short priority, Class<? super EventType> eventClass, @Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.registerAsync(priority, eventClass, null, function);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IAsyncEvent<KeyType>> EventRegistration<KeyType, EventType> registerAsync(
|
|
@Nonnull Class<? super EventType> eventClass,
|
|
@Nonnull KeyType key,
|
|
@Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.registerAsync((short)0, eventClass, key, function);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IAsyncEvent<KeyType>> EventRegistration<KeyType, EventType> registerAsync(
|
|
@Nonnull EventPriority priority,
|
|
Class<? super EventType> eventClass,
|
|
@Nonnull KeyType key,
|
|
@Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.registerAsync(priority.getValue(), eventClass, key, function);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IAsyncEvent<KeyType>> EventRegistration<KeyType, EventType> registerAsync(
|
|
short priority,
|
|
@Nonnull Class<? super EventType> eventClass,
|
|
@Nullable KeyType key,
|
|
@Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.<KeyType, EventType>getAsyncRegistry(eventClass).registerAsync(priority, key, function);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IBaseEvent<KeyType>> EventRegistration<KeyType, EventType> registerGlobal(
|
|
@Nonnull Class<? super EventType> eventClass, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.registerGlobal((short)0, eventClass, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IBaseEvent<KeyType>> EventRegistration<KeyType, EventType> registerGlobal(
|
|
@Nonnull EventPriority priority, @Nonnull Class<? super EventType> eventClass, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.registerGlobal(priority.getValue(), eventClass, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IBaseEvent<KeyType>> EventRegistration<KeyType, EventType> registerGlobal(
|
|
short priority, @Nonnull Class<? super EventType> eventClass, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.<KeyType, EventType>getRegistry(eventClass).registerGlobal(priority, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IAsyncEvent<KeyType>> EventRegistration<KeyType, EventType> registerAsyncGlobal(
|
|
@Nonnull Class<? super EventType> eventClass, @Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.registerAsyncGlobal((short)0, eventClass, function);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IAsyncEvent<KeyType>> EventRegistration<KeyType, EventType> registerAsyncGlobal(
|
|
@Nonnull EventPriority priority,
|
|
@Nonnull Class<? super EventType> eventClass,
|
|
@Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.registerAsyncGlobal(priority.getValue(), eventClass, function);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IAsyncEvent<KeyType>> EventRegistration<KeyType, EventType> registerAsyncGlobal(
|
|
short priority, @Nonnull Class<? super EventType> eventClass, @Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.<KeyType, EventType>getAsyncRegistry(eventClass).registerAsyncGlobal(priority, function);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IBaseEvent<KeyType>> EventRegistration<KeyType, EventType> registerUnhandled(
|
|
@Nonnull Class<? super EventType> eventClass, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.registerUnhandled((short)0, eventClass, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IBaseEvent<KeyType>> EventRegistration<KeyType, EventType> registerUnhandled(
|
|
@Nonnull EventPriority priority, @Nonnull Class<? super EventType> eventClass, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.registerUnhandled(priority.getValue(), eventClass, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IBaseEvent<KeyType>> EventRegistration<KeyType, EventType> registerUnhandled(
|
|
short priority, @Nonnull Class<? super EventType> eventClass, @Nonnull Consumer<EventType> consumer
|
|
) {
|
|
return this.<KeyType, EventType>getRegistry(eventClass).registerUnhandled(priority, consumer);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IAsyncEvent<KeyType>> EventRegistration<KeyType, EventType> registerAsyncUnhandled(
|
|
@Nonnull Class<? super EventType> eventClass, @Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.registerAsyncUnhandled((short)0, eventClass, function);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IAsyncEvent<KeyType>> EventRegistration<KeyType, EventType> registerAsyncUnhandled(
|
|
@Nonnull EventPriority priority,
|
|
@Nonnull Class<? super EventType> eventClass,
|
|
@Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.registerAsyncUnhandled(priority.getValue(), eventClass, function);
|
|
}
|
|
|
|
@Override
|
|
public <KeyType, EventType extends IAsyncEvent<KeyType>> EventRegistration<KeyType, EventType> registerAsyncUnhandled(
|
|
short priority, @Nonnull Class<? super EventType> eventClass, @Nonnull Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function
|
|
) {
|
|
return this.<KeyType, EventType>getAsyncRegistry(eventClass).registerAsyncUnhandled(priority, function);
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public <KeyType, EventType extends IEvent<KeyType>> IEventDispatcher<EventType, EventType> dispatchFor(
|
|
@Nonnull Class<? super EventType> eventClass, KeyType key
|
|
) {
|
|
SyncEventBusRegistry<KeyType, EventType> registry = (SyncEventBusRegistry<KeyType, EventType>)this.registryMap.get(eventClass);
|
|
return registry == null ? SyncEventBusRegistry.NO_OP : registry.dispatchFor(key);
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public <KeyType, EventType extends IAsyncEvent<KeyType>> IEventDispatcher<EventType, CompletableFuture<EventType>> dispatchForAsync(
|
|
@Nonnull Class<? super EventType> eventClass, KeyType key
|
|
) {
|
|
AsyncEventBusRegistry<KeyType, EventType> registry = (AsyncEventBusRegistry<KeyType, EventType>)this.registryMap.get(eventClass);
|
|
return registry == null ? AsyncEventBusRegistry.NO_OP : registry.dispatchFor(key);
|
|
}
|
|
}
|