X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=third-party%2Fatomix%2Fstorage%2Fsrc%2Fmain%2Fjava%2Fio%2Fatomix%2Futils%2Fserializer%2FNamespace.java;h=5e6814c63572386e04129ef791ac4e9c41c76fdc;hb=d9dd9f3f6014d8a5ad6de36edb11dd753e5a60d2;hp=9dcbded38bb6b4f19a6a56d5e7a4ad20ba2c052d;hpb=39fda828273d60937eaaff4d81183855343cbc57;p=controller.git diff --git a/third-party/atomix/storage/src/main/java/io/atomix/utils/serializer/Namespace.java b/third-party/atomix/storage/src/main/java/io/atomix/utils/serializer/Namespace.java index 9dcbded38b..5e6814c635 100644 --- a/third-party/atomix/storage/src/main/java/io/atomix/utils/serializer/Namespace.java +++ b/third-party/atomix/storage/src/main/java/io/atomix/utils/serializer/Namespace.java @@ -16,6 +16,7 @@ */ package io.atomix.utils.serializer; +import static com.google.common.base.Preconditions.checkState; import static java.util.Objects.requireNonNull; import com.esotericsoftware.kryo.Kryo; @@ -27,7 +28,6 @@ import com.esotericsoftware.kryo.pool.KryoCallback; import com.esotericsoftware.kryo.pool.KryoFactory; import com.esotericsoftware.kryo.pool.KryoPool; import com.google.common.base.MoreObjects; -import com.google.common.collect.ImmutableList; import io.atomix.storage.journal.JournalSerdes; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -36,9 +36,6 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; import org.objenesis.strategy.StdInstantiatorStrategy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -68,55 +65,10 @@ public final class Namespace implements JournalSerdes, KryoFactory, KryoPool { private final KryoOutputPool kryoOutputPool = new KryoOutputPool(); private final KryoInputPool kryoInputPool = new KryoInputPool(); - private final ImmutableList registeredBlocks; - + private final List registeredTypes; private final ClassLoader classLoader; private final String friendlyName; - /** - * KryoNamespace builder. - */ - private static final class Builder implements JournalSerdes.Builder { - private final int blockHeadId = INITIAL_ID; - private final List[], EntrySerializer>> types = new ArrayList<>(); - private final List blocks = new ArrayList<>(); - private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - - @Override - public Builder register(final EntrySerdes serdes, final Class... classes) { - types.add(Map.entry(classes, new EntrySerializer<>(serdes))); - return this; - } - - @Override - public Builder setClassLoader(final ClassLoader classLoader) { - this.classLoader = requireNonNull(classLoader); - return this; - } - - @Override - public JournalSerdes build() { - return build(NO_NAME); - } - - @Override - public JournalSerdes build(final String friendlyName) { - if (!types.isEmpty()) { - blocks.add(new RegistrationBlock(blockHeadId, types)); - } - return new Namespace(blocks, classLoader, friendlyName); - } - } - - /** - * Creates a new {@link Namespace} builder. - * - * @return builder - */ - public static JournalSerdes.Builder builder() { - return new Builder(); - } - /** * Creates a Kryo instance pool. * @@ -125,17 +77,26 @@ public final class Namespace implements JournalSerdes, KryoFactory, KryoPool { * @param friendlyName friendly name for the namespace */ private Namespace( - final List registeredTypes, - final ClassLoader classLoader, - final String friendlyName) { - registeredBlocks = ImmutableList.copyOf(registeredTypes); - this.classLoader = classLoader; + final List registeredTypes, + final ClassLoader classLoader, + final String friendlyName) { + this.registeredTypes = List.copyOf(registeredTypes); + this.classLoader = requireNonNull(classLoader); this.friendlyName = requireNonNull(friendlyName); // Pre-populate with a single instance release(create()); } + /** + * Creates a new {@link Namespace} builder. + * + * @return builder + */ + public static JournalSerdes.Builder builder() { + return new Builder(); + } + @Override public byte[] serialize(final Object obj) { return serialize(obj, DEFAULT_BUFFER_SIZE); @@ -238,11 +199,9 @@ public final class Namespace implements JournalSerdes, KryoFactory, KryoPool { kryo.setInstantiatorStrategy( new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy())); - for (RegistrationBlock block : registeredBlocks) { - int id = block.begin(); - for (Entry[], EntrySerializer> entry : block.types()) { - register(kryo, entry.getKey(), entry.getValue(), id++); - } + int id = INITIAL_ID; + for (RegisteredType registeredType : registeredTypes) { + register(kryo, registeredType.types(), registeredType.serializer(), id++); } return kryo; } @@ -322,47 +281,41 @@ public final class Namespace implements JournalSerdes, KryoFactory, KryoPool { // omit lengthy detail, when there's a name .toString(); } - return MoreObjects.toStringHelper(getClass()).add("registeredBlocks", registeredBlocks).toString(); + return MoreObjects.toStringHelper(getClass()).add("registeredTypes", registeredTypes).toString(); } - static final class RegistrationBlock { - private final int begin; - private final ImmutableList[], EntrySerializer>> types; - - RegistrationBlock(final int begin, final List[], EntrySerializer>> types) { - this.begin = begin; - this.types = ImmutableList.copyOf(types); + private static record RegisteredType(EntrySerializer serializer, Class[] types) { + RegisteredType { + requireNonNull(serializer); + requireNonNull(types); } + } - public int begin() { - return begin; - } + private static final class Builder implements JournalSerdes.Builder { + private final List types = new ArrayList<>(); + private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - public ImmutableList[], EntrySerializer>> types() { - return types; + @Override + public Builder register(final EntrySerdes serdes, final Class... classes) { + types.add(new RegisteredType(new EntrySerializer<>(serdes), classes)); + return this; } @Override - public String toString() { - return MoreObjects.toStringHelper(getClass()).add("begin", begin).add("types", types).toString(); + public Builder setClassLoader(final ClassLoader classLoader) { + this.classLoader = requireNonNull(classLoader); + return this; } @Override - public int hashCode() { - return types.hashCode(); + public JournalSerdes build() { + return build(NO_NAME); } - // Only the registered types are used for equality. @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - - if (obj instanceof RegistrationBlock that) { - return Objects.equals(types, that.types); - } - return false; + public JournalSerdes build(final String friendlyName) { + checkState(!types.isEmpty(), "No serializers registered"); + return new Namespace(types, classLoader, friendlyName); } } }