Metric class

Пакет: com.hypixel.hytale.metrics

Файл: com/hypixel/hytale/metrics/MetricsRegistry.java

Поля (4)

МодификаторыТипИмя
private final Codec<R> codec
private final Function<R, MetricsRegistry<R>> codecFunc
private final Function<T, R> func
Object var3

Методы (4)

МодификаторыВозвратСигнатура
public BsonValue encodepublic BsonValue encode(T var1, ExtraInfo var2)
public Codec<R> getCodecpublic Codec<R> getCodec(R var1)
if if(this.func == null)
if if(this.codec != null)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.metrics;

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.schema.SchemaContext;
class="kw">import com.hypixel.hytale.codec.schema.config.Schema;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.logger.backend.HytaleFileHandler;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
class="kw">import java.io.BufferedWriter;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.Paths;
class="kw">import java.time.LocalDateTime;
class="kw">import java.time.ZoneId;
class="kw">import java.util.Map;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.locks.StampedLock;
class="kw">import java.util.function.Function;
class="kw">import javax.annotation.CheckForNull;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bson.BsonDocument;
class="kw">import org.bson.BsonValue;
class="kw">import org.bson.codecs.BsonDocumentCodec;
class="kw">import org.bson.codecs.EncoderContext;
class="kw">import org.bson.json.JsonMode;
class="kw">import org.bson.json.JsonWriter;
class="kw">import org.bson.json.JsonWriterSettings;

class="kw">public class MetricsRegistry<T> class="kw">implements Codec<T> {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">public class="kw">static class="kw">final JsonWriterSettings JSON_SETTINGS = JsonWriterSettings.builder()
      .outputMode(JsonMode.STRICT)
      .indent(false)
      .newLineCharacters("\n")
      .int64Converter((var0, var1) -> var1.writeNumber(Long.toString(var0)))
      .build();
   class="kw">private class="kw">static class="kw">final EncoderContext ENCODER_CONTEXT = EncoderContext.builder().build();
   class="kw">private class="kw">static class="kw">final BsonDocumentCodec BSON_DOCUMENT_CODEC = new BsonDocumentCodec();
   @Nullable
   class="kw">private class="kw">final Function<T, MetricProvider> appendFunc;
   class="kw">private class="kw">final StampedLock lock = new StampedLock();
   class="kw">private class="kw">final Map<String, MetricsRegistry.Metric<T, ?>> map = new Object2ObjectLinkedOpenHashMap();

   class="kw">public MetricsRegistry() {
      this.appendFunc = null;
   }

   class="kw">public MetricsRegistry(Function<T, MetricProvider> var1) {
      this.appendFunc = var1;
   }

   class="kw">public MetricsRegistry<T> register(String var1, MetricsRegistry<Void> var2) {
      long var3 = this.lock.writeLock();

      try {
         if (this.map.putIfAbsent(var1, new MetricsRegistry.Metric<>(null, var2)) != null) {
            throw new IllegalArgumentException("Metric already registered: " + var1);
         }
      } class="kw">finally {
         this.lock.unlockWrite(var3);
      }

      class="kw">return this;
   }

   class="kw">public <R> MetricsRegistry<T> register(String var1, Function<T, R> var2, Codec<R> var3) {
      long var4 = this.lock.writeLock();

      try {
         if (this.map.putIfAbsent(var1, new MetricsRegistry.Metric<>(var2, var3)) != null) {
            throw new IllegalArgumentException("Metric already registered: " + var1);
         }
      } class="kw">finally {
         this.lock.unlockWrite(var4);
      }

      class="kw">return this;
   }

   class="kw">public <R class="kw">extends MetricProvider> MetricsRegistry<T> register(String var1, @Nonnull Function<T, R> var2) {
      class="kw">return this.register(var1, var2.andThen(var0 -> var0 == null ? null : var0.toMetricResults()), MetricResults.CODEC);
   }

   @Deprecated
   class="kw">public <R> MetricsRegistry<T> register(String var1, Function<T, R> var2, Function<R, MetricsRegistry<R>> var3) {
      long var4 = this.lock.writeLock();

      try {
         if (this.map.putIfAbsent(var1, new MetricsRegistry.Metric<>(var2, var3)) != null) {
            throw new IllegalArgumentException("Metric already registered: " + var1);
         }
      } class="kw">finally {
         this.lock.unlockWrite(var4);
      }

      class="kw">return this;
   }

   @Override
   class="kw">public T decode(BsonValue var1, ExtraInfo var2) {
      throw new UnsupportedOperationException("Not implemented");
   }

   @Override
   class="kw">public BsonValue encode(T var1, ExtraInfo var2) {
      BsonDocument var3 = new BsonDocument();
      long var4 = this.lock.readLock();

      try {
         for (Entry var7 : this.map.entrySet()) {
            String var8 = var7.getKey();
            BsonValue var9 = var7.getValue().encode(var1, var2);
            if (var9 != null) {
               var3.put(var8, var9);
            }
         }
      } class="kw">finally {
         this.lock.unlockRead(var4);
      }

      if (this.appendFunc != null) {
         MetricProvider var13 = this.appendFunc.apply(var1);
         if (var13 != null) {
            MetricResults var14 = var13.toMetricResults();
            if (var14 != null) {
               var3.putAll(var14.getBson());
            }
         }
      }

      class="kw">return var3;
   }

   @Nonnull
   @Override
   class="kw">public Schema toSchema(@Nonnull SchemaContext var1) {
      throw new UnsupportedOperationException("Not implemented");
   }

   @Nonnull
   class="kw">public MetricResults toMetricResults(T var1) {
      class="kw">return new MetricResults(this.dumpToBson(var1).asDocument());
   }

   class="kw">public BsonValue dumpToBson(T var1) {
      ExtraInfo var2 = ExtraInfo.THREAD_LOCAL.get();
      BsonDocument var3 = this.encode(var1, var2).asDocument();
      var2.getValidationResults().logOrThrowValidatorExceptions(LOGGER);
      class="kw">return var3;
   }

   @Nonnull
   class="kw">public Path dumpToJson(T var1) class="kw">throws IOException {
      Path var2 = createDumpPath(".dump.json");
      this.dumpToJson(var2, var1);
      class="kw">return var2;
   }

   class="kw">public void dumpToJson(@Nonnull Path var1, T var2) class="kw">throws IOException {
      BsonValue var3 = this.dumpToBson(var2);

      try (BufferedWriter var4 = Files.newBufferedWriter(var1)) {
         BSON_DOCUMENT_CODEC.encode(new JsonWriter(var4, JSON_SETTINGS), var3.asDocument(), ENCODER_CONTEXT);
      }
   }

   @Nonnull
   class="kw">public class="kw">static Path createDumpPath(@Nullable String var0) class="kw">throws IOException {
      class="kw">return createDumpPath((String)null, var0);
   }

   @Nonnull
   class="kw">public class="kw">static Path createDumpPath(@Nonnull Path var0, @Nullable String var1) {
      class="kw">return createDatePath(var0, null, var1);
   }

   @Nonnull
   class="kw">public class="kw">static Path createDumpPath(@Nullable String var0, @Nullable String var1) class="kw">throws IOException {
      Path var2 = Paths.get("dumps");
      if (!Files.exists(var2)) {
         Files.createDirectories(var2);
      }

      class="kw">return createDatePath(var2, var0, var1);
   }

   @Nonnull
   class="kw">public class="kw">static Path createDatePath(@Nonnull Path var0, @Nullable String var1, @Nullable String var2) {
      String var3 = HytaleFileHandler.LOG_FILE_DATE_FORMAT.format(LocalDateTime.now(ZoneId.systemDefault()));
      if (var1 != null) {
         var3 = var1 + var3;
      }

      Path var4 = var2 != null ? var0.resolve(var3 + var2) : var0.resolve(var3);
      int var5 = 0;

      while (Files.exists(var4)) {
         if (var2 != null) {
            var4 = var0.resolve(var3 + "_" + var5++ + var2);
         } else {
            var4 = var0.resolve(var3 + "_" + var5++);
         }
      }

      class="kw">return var4;
   }

   class="kw">private class="kw">static class Metric<T, R> {
      @Nullable
      class="kw">private class="kw">final Function<T, R> func;
      @CheckForNull
      class="kw">private class="kw">final Codec<R> codec;
      @CheckForNull
      class="kw">private class="kw">final Function<R, MetricsRegistry<R>> codecFunc;

      class="kw">public Metric(@Nullable Function<T, R> var1, @Nullable Codec<R> var2) {
         this.func = var1;
         this.codec = var2;
         this.codecFunc = null;
      }

      class="kw">public Metric(@Nullable Function<T, R> var1, @Nullable Function<R, MetricsRegistry<R>> var2) {
         this.func = var1;
         this.codec = null;
         this.codecFunc = var2;
      }

      @Nullable
      class="kw">public BsonValue encode(T var1, ExtraInfo var2) {
         if (this.func == null) {
            assert this.codec != null;
            class="kw">return this.codec.encode(null, var2);
         } else {
            Object var3 = this.func.apply(var1);
            class="kw">return var3 == null ? null : this.getCodec(var3).encode(var3, var2);
         }
      }

      @Nonnull
      class="kw">public Codec<R> getCodec(R var1) {
         if (this.codec != null) {
            class="kw">return this.codec;
         }

         assert this.codecFunc != null;
         class="kw">return this.codecFunc.apply(var1);
      }
   }
}