UnknownIdException class
Пакет: com.hypixel.hytale.codec.lookup
Файл: com/hypixel/hytale/codec/lookup/ACodecMapCodec.java
extends: CodecException
Методы (1)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
|
super super(var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.codec.lookup;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.InheritCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.exception.CodecException;
class="kw">import com.hypixel.hytale.codec.record.RecordCodec;
class="kw">import com.hypixel.hytale.codec.schema.SchemaContext;
class="kw">import com.hypixel.hytale.codec.schema.config.ObjectSchema;
class="kw">import com.hypixel.hytale.codec.schema.config.Schema;
class="kw">import com.hypixel.hytale.codec.schema.config.StringSchema;
class="kw">import com.hypixel.hytale.codec.util.RawJsonReader;
class="kw">import com.hypixel.hytale.codec.validation.ValidatableCodec;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.IOException;
class="kw">import java.util.Arrays;
class="kw">import java.util.Collections;
class="kw">import java.util.Comparator;
class="kw">import java.util.HashSet;
class="kw">import java.util.LinkedHashMap;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.atomic.AtomicReference;
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">public class="kw">abstract class ACodecMapCodec<K, T, C class="kw">extends Codec<? class="kw">extends T>> class="kw">implements Codec<T>, ValidatableCodec<T>, InheritCodec<T> {
class="kw">protected class="kw">final String key;
class="kw">protected class="kw">final Codec<K> keyCodec;
class="kw">protected class="kw">final Map<K, C> idToCodec = new ConcurrentHashMap<>();
class="kw">protected class="kw">final Map<Class<? class="kw">extends T>, K> classToId = new ConcurrentHashMap<>();
class="kw">protected class="kw">final Map<K, Class<? class="kw">extends T>> idToClass = new ConcurrentHashMap<>();
@Nonnull
class="kw">protected AtomicReference<ACodecMapCodec.CodecPriority<C>[]> codecs = new AtomicReference<>(new ACodecMapCodec.CodecPriority[0]);
class="kw">protected class="kw">final boolean allowDefault;
class="kw">protected class="kw">final boolean encodeDefaultKey;
class="kw">public ACodecMapCodec(Codec<K> var1) {
this(var1, false);
}
class="kw">public ACodecMapCodec(Codec<K> var1, boolean var2) {
this("Id", var1, var2);
}
class="kw">public ACodecMapCodec(String var1, Codec<K> var2) {
this(var1, var2, false);
}
class="kw">public ACodecMapCodec(String var1, Codec<K> var2, boolean var3) {
this(var1, var2, var3, true);
}
class="kw">public ACodecMapCodec(String var1, Codec<K> var2, boolean var3, boolean var4) {
this.key = var1;
this.allowDefault = var3;
this.encodeDefaultKey = var4;
this.keyCodec = var2;
}
@Nonnull
class="kw">public ACodecMapCodec<K, T, C> register(K var1, Class<? class="kw">extends T> var2, C var3) {
this.register(Priority.NORMAL, var1, var2, var3);
class="kw">return this;
}
class="kw">public ACodecMapCodec<K, T, C> register(@Nonnull Priority var1, K var2, Class<? class="kw">extends T> var3, C var4) {
this.idToCodec.put(var2, var4);
this.classToId.put(var3, var2);
this.idToClass.put(var2, var3);
if (var4 class="kw">instanceof ValidatableCodec) {
((ValidatableCodec)var4).validateDefaults(new ExtraInfo(), new HashSet<>());
}
if (!this.allowDefault && !var1.equals(Priority.NORMAL)) {
throw new IllegalStateException("Defaults disallowed but non-normal priority provided");
}
if (!this.allowDefault) {
class="kw">return this;
}
ACodecMapCodec.CodecPriority var5 = new ACodecMapCodec.CodecPriority<>(var4, var1);
ACodecMapCodec.CodecPriority[] var6;
ACodecMapCodec.CodecPriority[] var7;
do {
var6 = this.codecs.get();
int var8 = Arrays.binarySearch(var6, var5, Comparator.comparingInt(var0 -> var0.priority().getLevel()));
int var9;
if (var8 >= 0) {
var9 = var8 + 1;
} else {
var9 = -(var8 + 1);
}
var7 = new ACodecMapCodec.CodecPriority[var6.length + 1];
System.arraycopy(var6, 0, var7, 0, var9);
var7[var9] = var5;
System.arraycopy(var6, var9, var7, var9 + 1, var6.length - var9);
} while (!this.codecs.compareAndSet(var6, var7));
class="kw">return this;
}
class="kw">public void remove(Class<? class="kw">extends T> var1) {
Object var2 = this.classToId.remove(var1);
if (var2 != null) {
Codec var3 = this.idToCodec.remove(var2);
this.idToClass.remove(var2);
if (this.allowDefault) {
ACodecMapCodec.CodecPriority[] var4;
ACodecMapCodec.CodecPriority[] var5;
do {
var4 = this.codecs.get();
int var6 = -1;
for (int var7 = 0; var7 < var4.length; var7++) {
ACodecMapCodec.CodecPriority var8 = var4[var7];
if (var8.codec() == var3) {
var6 = var7;
break;
}
}
if (var6 == -1) {
class="kw">return;
}
var5 = new ACodecMapCodec.CodecPriority[var4.length - 1];
System.arraycopy(var4, 0, var5, 0, var6);
System.arraycopy(var4, var6 + 1, var5, var6, var4.length - var6 - 1);
} while (!this.codecs.compareAndSet(var4, var5));
}
}
}
@Nonnull
class="kw">public String getKey() {
class="kw">return this.key;
}
@Nullable
class="kw">public C getDefaultCodec() {
ACodecMapCodec.CodecPriority[] var1 = this.codecs.get();
class="kw">return var1.length == 0 ? null : var1[0].codec();
}
class="kw">public C getCodecFor(K var1) {
class="kw">return this.idToCodec.get(var1);
}
class="kw">public C getCodecFor(Class<? class="kw">extends T> var1) {
class="kw">return this.idToCodec.get(this.classToId.get(var1));
}
class="kw">public Class<? class="kw">extends T> getClassFor(K var1) {
class="kw">return this.idToClass.get(var1);
}
class="kw">public K getIdFor(Class<? class="kw">extends T> var1) {
class="kw">return this.classToId.get(var1);
}
class="kw">public Set<K> getRegisteredIds() {
class="kw">return Collections.unmodifiableSet(this.idToCodec.keySet());
}
@Override
class="kw">public T decode(@Nonnull BsonValue var1, ExtraInfo var2) {
BsonDocument var3 = var1.asDocument();
BsonValue var4 = var3.get(this.key);
Codec var5 = var4 == null ? null : this.idToCodec.get(this.keyCodec.decode(var4, var2));
if (var5 == null) {
Codec var6 = this.getDefaultCodec();
if (var6 == null) {
throw new ACodecMapCodec.UnknownIdException("No codec registered with for '" + this.key + "': " + var4);
} else {
class="kw">return (T)var6.decode(var3, var2);
}
} else {
class="kw">return (T)var5.decode(var3, var2);
}
}
@Nullable
@Override
class="kw">public T decodeAndInherit(@Nonnull BsonDocument var1, T var2, ExtraInfo var3) {
BsonValue var4 = var1.get(this.key);
Codec var5 = this.idToCodec.get(var4 == null ? null : var4.asString().getValue());
if (var5 == null) {
Codec var6 = this.getDefaultCodec();
if (var6 == null) {
throw new ACodecMapCodec.UnknownIdException("No codec registered with for '" + this.key + "': " + var4);
} else {
class="kw">return (T)(var6 class="kw">instanceof InheritCodec ? ((InheritCodec)var6).decodeAndInherit(var1, var2, var3) : var6.decode(var1, var3));
}
} else {
class="kw">return (T)(var5 class="kw">instanceof InheritCodec ? ((InheritCodec)var5).decodeAndInherit(var1, var2, var3) : var5.decode(var1, var3));
}
}
@Override
class="kw">public void decodeAndInherit(@Nonnull BsonDocument var1, T var2, T var3, ExtraInfo var4) {
BsonValue var5 = var1.get(this.key);
Codec var6 = this.idToCodec.get(var5 == null ? null : var5.asString().getValue());
if (var6 == null) {
Codec var7 = this.getDefaultCodec();
if (var7 == null) {
throw new ACodecMapCodec.UnknownIdException("No codec registered with for '" + this.key + "': " + var5);
}
if (var7 class="kw">instanceof InheritCodec) {
((InheritCodec)var7).decodeAndInherit(var1, var2, var3, var4);
} else {
throw new UnsupportedOperationException();
}
} else if (var6 class="kw">instanceof InheritCodec) {
((InheritCodec)var6).decodeAndInherit(var1, var2, var3, var4);
} else {
throw new UnsupportedOperationException();
}
}
@Override
class="kw">public BsonValue encode(@Nonnull T var1, ExtraInfo var2) {
Class var3 = (Class<? class="kw">extends T>)var1.getClass();
Object var4 = this.classToId.get(var3);
Codec var5 = this.getDefaultCodec();
if (var4 == null && var5 == null) {
throw new ACodecMapCodec.UnknownIdException("No id registered with for '" + var3 + "': " + var1);
}
Codec var6 = this.idToCodec.get(var4);
if (var6 == null) {
if (var5 == null) {
throw new ACodecMapCodec.UnknownIdException("No codec registered with for '" + var3 + "': " + var1);
}
var6 = var5;
}
BsonValue var7 = var6.encode(var1, var2);
if (var4 == null) {
class="kw">return var7;
}
BsonDocument var8 = new BsonDocument();
if (this.encodeDefaultKey || var6 != var5) {
var8.put(this.key, this.keyCodec.encode(var4, var2));
}
var8.putAll(var7.asDocument());
class="kw">return var8;
}
@Nullable
@Override
class="kw">public T decodeJson(@Nonnull RawJsonReader var1, @Nonnull ExtraInfo var2) class="kw">throws IOException {
var1.mark();
Object var3 = null;
if (RawJsonReader.seekToKey(var1, this.key)) {
var3 = this.keyCodec.decodeJson(var1, var2);
}
var1.reset();
var2.ignoreUnusedKey(this.key);
try {
Codec var4 = var3 == null ? null : this.idToCodec.get(var3);
if (var4 == null) {
Codec var5 = this.getDefaultCodec();
if (var5 == null) {
throw new ACodecMapCodec.UnknownIdException("No codec registered with for '" + this.key + "': " + var3);
} else {
class="kw">return (T)var5.decodeJson(var1, var2);
}
} else {
class="kw">return (T)var4.decodeJson(var1, var2);
}
} class="kw">finally {
var2.popIgnoredUnusedKey();
}
}
@Nullable
@Override
class="kw">public T decodeAndInheritJson(@Nonnull RawJsonReader var1, @Nullable T var2, @Nonnull ExtraInfo var3) class="kw">throws IOException {
var1.mark();
Object var4 = null;
if (RawJsonReader.seekToKey(var1, this.key)) {
var4 = this.keyCodec.decodeJson(var1, var3);
} else if (var2 != null) {
var4 = this.getIdFor((Class<? class="kw">extends T>)var2.getClass());
}
var1.reset();
var3.ignoreUnusedKey(this.key);
try {
Codec var5 = var4 == null ? null : this.idToCodec.get(var4);
if (var5 == null) {
Codec var6 = this.getDefaultCodec();
if (var6 == null) {
throw new ACodecMapCodec.UnknownIdException("No codec registered with for '" + this.key + "': " + var4);
} else {
class="kw">return (T)(var6 class="kw">instanceof InheritCodec ? ((InheritCodec)var6).decodeAndInheritJson(var1, var2, var3) : var6.decodeJson(var1, var3));
}
} else {
class="kw">return (T)(var5 class="kw">instanceof InheritCodec ? ((InheritCodec)var5).decodeAndInheritJson(var1, var2, var3) : var5.decodeJson(var1, var3));
}
} class="kw">finally {
var3.popIgnoredUnusedKey();
}
}
@Override
class="kw">public void decodeAndInheritJson(@Nonnull RawJsonReader var1, T var2, @Nullable T var3, @Nonnull ExtraInfo var4) class="kw">throws IOException {
var1.mark();
Object var5 = null;
if (RawJsonReader.seekToKey(var1, this.key)) {
var5 = this.keyCodec.decodeJson(var1, var4);
} else if (var3 != null) {
var5 = this.getIdFor((Class<? class="kw">extends T>)var3.getClass());
}
var1.reset();
var4.ignoreUnusedKey(this.key);
try {
Codec var6 = var5 == null ? null : this.idToCodec.get(var5);
if (var6 != null) {
if (!(var6 class="kw">instanceof InheritCodec)) {
throw new UnsupportedOperationException();
}
((InheritCodec)var6).decodeAndInheritJson(var1, var2, var3, var4);
class="kw">return;
}
Codec var7 = this.getDefaultCodec();
if (var7 == null) {
throw new ACodecMapCodec.UnknownIdException("No codec registered with for '" + this.key + "': " + var5);
}
if (!(var7 class="kw">instanceof InheritCodec)) {
throw new UnsupportedOperationException();
}
((InheritCodec)var7).decodeAndInheritJson(var1, var2, var3, var4);
} class="kw">finally {
var4.popIgnoredUnusedKey();
}
}
@Override
class="kw">public void validate(@Nonnull T var1, ExtraInfo var2) {
Object var3 = this.getIdFor((Class<? class="kw">extends T>)var1.getClass());
Codec var4 = this.getCodecFor(var3);
if (this.keyCodec class="kw">instanceof ValidatableCodec) {
((ValidatableCodec)this.keyCodec).validate(var3, var2);
}
if (var4 class="kw">instanceof ValidatableCodec) {
((ValidatableCodec)var4).validate(var1, var2);
}
}
@Override
class="kw">public void validateDefaults(ExtraInfo var1, @Nonnull Set<Codec<?>> var2) {
if (var2.add(this)) {
ValidatableCodec.validateDefaults(this.keyCodec, var1, var2);
for (Codec var4 : this.idToCodec.values()) {
ValidatableCodec.validateDefaults(var4, var1, var2);
}
}
}
@Nonnull
@Override
class="kw">public Schema toSchema(@Nonnull SchemaContext var1) {
List var2 = new ObjectArrayList();
Entry[] var3 = this.idToCodec.entrySet().toArray(Entry[]::new);
Arrays.sort(var3, Comparator.comparing(var0 -> var0.getKey() class="kw">instanceof Comparable ? (Comparable)var0.getKey() : var0.getKey().toString()));
Codec var4 = this.allowDefault ? this.getDefaultCodec() : null;
String var5 = null;
for (Entry var9 : var3) {
Codec var10 = var9.getValue();
if (var10 == var4) {
var5 = var9.getKey().toString();
}
Schema var11 = var1.refDefinition(var10);
if (var11.getRef() != null) {
class="kw">switch (var10) {
case BuilderCodec var14:
if (var1.getRawDefinition(var14) class="kw">instanceof ObjectSchema var21) {
this.mutateChildSchema(var9.getKey().toString(), var1, (Codec<? class="kw">extends T>)var14, var21);
}
break;
case RecordCodec var15:
if (var1.getRawDefinition(var15) class="kw">instanceof ObjectSchema var17) {
this.mutateChildSchema(var9.getKey().toString(), var1, (Codec<? class="kw">extends T>)var15, var17);
}
break;
class="kw">default:
}
}
var2.add(var11);
}
if (var2.isEmpty()) {
ObjectSchema var19 = new ObjectSchema();
var19.setAdditionalProperties(false);
var19.setHytaleSchemaTypeField(new Schema.SchemaTypeField(this.key, null));
class="kw">return var19;
} else {
Schema var18 = Schema.anyOf(var2.toArray(Schema[]::new));
var18.getHytale().setMergesProperties(true);
var18.setTitle("Type Selector");
var18.setHytaleSchemaTypeField(
new Schema.SchemaTypeField(this.key, var5, Arrays.stream(var3).map(var0 -> var0.getKey().toString()).toArray(String[]::new))
);
class="kw">return var18;
}
}
class="kw">protected void mutateChildSchema(String var1, @Nonnull SchemaContext var2, Codec<? class="kw">extends T> var3, @Nonnull ObjectSchema var4) {
Codec var5 = null;
if (this.allowDefault) {
var5 = this.getDefaultCodec();
}
Schema var6 = this.keyCodec.toSchema(var2);
if (var5 == var3) {
var6.setTypes(new String[]{"null", "string"});
Schema var7 = var6;
var6 = new Schema();
StringSchema var8 = new StringSchema();
var8.setEnum(
this.idToCodec.entrySet().stream().filter(var1x -> var1x.getValue() != var3).map(Entry::getKey).map(Object::toString).toArray(String[]::new)
);
var6.setAllOf(var7, Schema.not(var8));
} else {
((StringSchema)var6).setConst(var1);
}
var6.setMarkdownDescription("This field controls the type, it must be set to the constant value \"" + var1 + "\" to function as this type.");
LinkedHashMap var9 = new LinkedHashMap<>();
var9.put(this.key, var6);
Map var10 = var4.getProperties();
var10.remove(this.key);
var9.putAll(var10);
var4.setProperties(var9);
}
class="kw">private record CodecPriority<C>(C codec, Priority priority) {
class="kw">private CodecPriority {
}
}
class="kw">public class="kw">static class UnknownIdException class="kw">extends CodecException {
class="kw">public UnknownIdException(String var1) {
super(var1);
}
}
}