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;
            }
         }
      }
   }
}