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