X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fcds-access-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Faccess%2Fconcepts%2FMemberName.java;h=47af6b3b1ebd01395aaeb1fd10e0183d29111398;hb=30ea4cdba4f2fc009be72e393a5091c837185ab9;hp=55737c47b7f62ad548e86b3d693d349ed5789ca6;hpb=93fd87f9e46446be9eb8538669ebbfade205590e;p=controller.git diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/MemberName.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/MemberName.java index 55737c47b7..47af6b3b1e 100644 --- a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/MemberName.java +++ b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/MemberName.java @@ -7,11 +7,13 @@ */ package org.opendaylight.controller.cluster.access.concepts; -import com.google.common.annotations.Beta; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Verify.verifyNotNull; +import static java.util.Objects.requireNonNull; + import com.google.common.base.MoreObjects; -import com.google.common.base.Preconditions; import com.google.common.base.Strings; -import com.google.common.base.Verify; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.DataInput; import java.io.DataOutput; import java.io.Externalizable; @@ -19,18 +21,43 @@ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.nio.charset.StandardCharsets; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.concepts.WritableIdentifier; /** * Type-safe encapsulation of a cluster member name. - * - * @author Robert Varga */ -@Beta public final class MemberName implements Comparable, WritableIdentifier { - private static final class Proxy implements Externalizable { + interface SerialForm extends Externalizable { + @NonNull MemberName name(); + + void setName(@NonNull MemberName name); + + @java.io.Serial + Object readResolve(); + + @Override + default void writeExternal(final ObjectOutput out) throws IOException { + final var serialized = name().getSerialized(); + out.writeInt(serialized.length); + out.write(serialized); + } + + @Override + default void readExternal(final ObjectInput in) throws IOException { + final var serialized = new byte[in.readInt()]; + in.readFully(serialized); + // TODO: consider caching instances here + setName(new MemberName(new String(serialized, StandardCharsets.UTF_8), serialized)); + } + } + + @Deprecated(since = "7.0.0", forRemoval = true) + private static final class Proxy implements SerialForm { + @java.io.Serial private static final long serialVersionUID = 1L; - private byte[] serialized; + + private MemberName name; // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to // be able to create instances via reflection. @@ -39,48 +66,51 @@ public final class MemberName implements Comparable, WritableIdentif // For Externalizable } - Proxy(final byte[] serialized) { - this.serialized = Preconditions.checkNotNull(serialized); + Proxy(final MemberName name) { + this.name = requireNonNull(name); } @Override - public void writeExternal(final ObjectOutput out) throws IOException { - out.writeInt(serialized.length); - out.write(serialized); + public MemberName name() { + return verifyNotNull(name); } @Override - public void readExternal(final ObjectInput in) throws IOException { - serialized = new byte[in.readInt()]; - in.readFully(serialized); + public void setName(final MemberName name) { + this.name = requireNonNull(name); } - private Object readResolve() { - // TODO: consider caching instances here - return new MemberName(new String(serialized, StandardCharsets.UTF_8), serialized); + @Override + public Object readResolve() { + return name(); } } + @java.io.Serial private static final long serialVersionUID = 1L; - private final String name; + + private final @NonNull String name; + + @SuppressFBWarnings(value = "VO_VOLATILE_REFERENCE_TO_ARRAY", + justification = "The array elements are non-volatile but we don't access them.") private volatile byte[] serialized; private MemberName(final String name) { - this.name = Preconditions.checkNotNull(name); + this.name = requireNonNull(name); } MemberName(final String name, final byte[] serialized) { this(name); - this.serialized = Verify.verifyNotNull(serialized); + this.serialized = verifyNotNull(serialized); } - public static MemberName forName(final String name) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(name)); + public static @NonNull MemberName forName(final String name) { + checkArgument(!Strings.isNullOrEmpty(name)); // TODO: consider caching instances here return new MemberName(name); } - public static MemberName readFrom(final DataInput in) throws IOException { + public static @NonNull MemberName readFrom(final DataInput in) throws IOException { final byte[] serialized = new byte[in.readInt()]; in.readFully(serialized); return new MemberName(new String(serialized, StandardCharsets.UTF_8)); @@ -93,10 +123,16 @@ public final class MemberName implements Comparable, WritableIdentif out.write(local); } - public String getName() { + public @NonNull String getName() { return name; } + public org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.cds.types.rev191024 + .@NonNull MemberName toYang() { + return new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.cds.types.rev191024 + .MemberName(name); + } + @Override public int hashCode() { return name.hashCode(); @@ -126,7 +162,8 @@ public final class MemberName implements Comparable, WritableIdentif return local; } + @java.io.Serial Object writeReplace() { - return new Proxy(getSerialized()); + return new MN(this); } }