EventConsumer class
Пакет: com.hypixel.hytale.event
Файл: com/hypixel/hytale/event/EventBusRegistry.java
Поля (5)
| Модификаторы | Тип | Имя |
|---|---|---|
|
protected static final AtomicInteger |
consumerIndex |
|
protected final String |
consumerString |
|
protected final int |
index |
|
protected final short |
priority |
|
protected final Metric |
timer |
Методы (5)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public String |
getConsumerStringpublic String getConsumerString() |
|
public int |
getIndexpublic int getIndex() |
|
public short |
getPrioritypublic short getPriority() |
|
public Metric |
getTimerpublic Metric getTimer() |
|
public String |
toStringpublic String toString() |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.event;
class="kw">import com.hypixel.fastutil.shorts.Short2ObjectConcurrentHashMap;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.metrics.metric.Metric;
class="kw">import java.util.Arrays;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.CopyOnWriteArrayList;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.concurrent.atomic.AtomicInteger;
class="kw">import java.util.concurrent.atomic.AtomicReference;
class="kw">import java.util.function.Consumer;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class="kw">abstract class EventBusRegistry<KeyType, EventType class="kw">extends IBaseEvent<KeyType>, ConsumerMapType class="kw">extends EventBusRegistry.EventConsumerMap<EventType, ?, ?>> {
@Nonnull
class="kw">protected class="kw">static class="kw">final Object NULL = new Object();
@Nonnull
class="kw">protected class="kw">final HytaleLogger logger;
@Nonnull
class="kw">protected class="kw">final Class<EventType> eventClass;
@Nonnull
class="kw">protected class="kw">final Map<KeyType, ConsumerMapType> map = new ConcurrentHashMap<>();
@Nonnull
class="kw">protected class="kw">final ConsumerMapType global;
@Nonnull
class="kw">protected class="kw">final ConsumerMapType unhandled;
class="kw">protected boolean timeEvents;
class="kw">protected class="kw">volatile boolean shutdown;
class="kw">public EventBusRegistry(@Nonnull HytaleLogger var1, @Nonnull Class<EventType> var2, @Nonnull ConsumerMapType var3, @Nonnull ConsumerMapType var4) {
this.logger = var1;
this.eventClass = var2;
this.global = var3;
this.unhandled = var4;
}
@Nonnull
class="kw">public Class<EventType> getEventClass() {
class="kw">return this.eventClass;
}
class="kw">public boolean isTimeEvents() {
class="kw">return this.timeEvents;
}
class="kw">public void setTimeEvents(boolean var1) {
this.timeEvents = var1;
}
class="kw">public void shutdown() {
this.shutdown = true;
this.map.clear();
}
class="kw">public boolean isAlive() {
class="kw">return !this.shutdown;
}
@Nonnull
class="kw">protected EventRegistration<KeyType, EventType> deadRegistration(@Nonnull String var1) {
((HytaleLogger.Api)this.logger.at(Level.FINE).atMostEvery(1, TimeUnit.MINUTES))
.log("Ignoring %s on shut-down EventRegistry for %s", var1, this.eventClass.getName());
class="kw">return new EventRegistration<>(this.eventClass, this::isAlive, () -> {});
}
class="kw">public class="kw">abstract EventRegistration<KeyType, EventType> register(short var1, @Nullable KeyType var2, @Nonnull Consumer<EventType> var3);
class="kw">public class="kw">abstract EventRegistration<KeyType, EventType> registerGlobal(short var1, @Nonnull Consumer<EventType> var2);
class="kw">public class="kw">abstract EventRegistration<KeyType, EventType> registerUnhandled(short var1, @Nonnull Consumer<EventType> var2);
class="kw">public class="kw">abstract IEventDispatcher<EventType, ?> dispatchFor(KeyType var1);
class="kw">public class="kw">abstract class="kw">static class EventConsumer {
@Nonnull
class="kw">protected class="kw">static class="kw">final AtomicInteger consumerIndex = new AtomicInteger();
class="kw">protected class="kw">final int index;
class="kw">protected class="kw">final short priority;
@Nonnull
class="kw">protected class="kw">final String consumerString;
@Nonnull
class="kw">protected class="kw">final Metric timer = new Metric();
class="kw">public EventConsumer(short var1, @Nonnull String var2) {
this.priority = var1;
this.consumerString = var2;
this.index = consumerIndex.getAndIncrement();
}
class="kw">public int getIndex() {
class="kw">return this.index;
}
class="kw">public short getPriority() {
class="kw">return this.priority;
}
@Nonnull
class="kw">public String getConsumerString() {
class="kw">return this.consumerString;
}
@Nonnull
class="kw">public Metric getTimer() {
class="kw">return this.timer;
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "EventConsumer{index="
+ this.index
+ ", priority="
+ this.priority
+ ", consumerString='"
+ this.consumerString
+ "', timer="
+ this.timer
+ "}";
}
}
class="kw">public class="kw">abstract class="kw">static class EventConsumerMap<EventType class="kw">extends IBaseEvent, ConsumerType class="kw">extends EventBusRegistry.EventConsumer, ReturnType>
class="kw">implements IEventDispatcher<EventType, ReturnType> {
class="kw">private class="kw">static class="kw">final short[] EMPTY_SHORT_ARRAY = new short[0];
class="kw">private class="kw">final AtomicReference<short[]> prioritiesRef = new AtomicReference<>(EMPTY_SHORT_ARRAY);
@Nonnull
class="kw">private class="kw">final Short2ObjectConcurrentHashMap<List<ConsumerType>> map = new Short2ObjectConcurrentHashMap<>(true, (short)-32768);
class="kw">public EventConsumerMap() {
}
class="kw">public boolean isEmpty() {
class="kw">return this.map.isEmpty();
}
class="kw">public void add(@Nonnull ConsumerType var1) {
short var2 = var1.getPriority();
boolean[] var3 = new boolean[]{false};
this.map.computeIfAbsent(var2, var1x -> {
var3[0] = true;
class="kw">return new CopyOnWriteArrayList<>();
}).add(var1);
if (var3[0]) {
this.addPriority(var2);
}
}
class="kw">public boolean remove(@Nonnull ConsumerType var1) {
short var2 = var1.getPriority();
boolean[] var3 = new boolean[]{false, false};
this.map.computeIfPresent(var2, (var2x, var3x) -> {
var3[0] = var3x.remove(var1);
if (!var3x.isEmpty()) {
class="kw">return var3x;
}
var3[1] = true;
class="kw">return null;
});
if (var3[1]) {
this.removePriority(var2);
}
class="kw">return var3[0];
}
class="kw">public short[] getPriorities() {
class="kw">return this.prioritiesRef.get();
}
@Nullable
class="kw">public List<ConsumerType> get(short var1) {
class="kw">return this.map.get(var1);
}
class="kw">private void addPriority(short var1) {
while (this.map.containsKey(var1)) {
short[] var2 = this.prioritiesRef.get();
int var4 = Arrays.binarySearch(var2, var1);
if (var4 >= 0) {
class="kw">return;
}
int var5 = -(var4 + 1);
int var6 = var2.length + 1;
short[] var3 = new short[var6];
System.arraycopy(var2, 0, var3, 0, var5);
var3[var5] = var1;
System.arraycopy(var2, var5, var3, var5 + 1, var2.length - var5);
if (this.prioritiesRef.compareAndSet(var2, var3)) {
class="kw">return;
}
}
}
class="kw">private void removePriority(short var1) {
while (!this.map.containsKey(var1)) {
short[] var2 = this.prioritiesRef.get();
int var4 = Arrays.binarySearch(var2, var1);
if (var4 < 0) {
class="kw">return;
}
int var5 = var2.length - 1;
short[] var3 = new short[var5];
System.arraycopy(var2, 0, var3, 0, var4);
System.arraycopy(var2, var4 + 1, var3, var4, var5 - var4);
if (this.prioritiesRef.compareAndSet(var2, var3)) {
class="kw">return;
}
}
}
}
}