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