Switch identifiers to new proxies
[controller.git] / opendaylight / md-sal / cds-access-api / src / main / java / org / opendaylight / controller / cluster / access / concepts / MemberName.java
index 2404924c640b68970dda49578527b33de974035a..47af6b3b1ebd01395aaeb1fd10e0183d29111398 100644 (file)
@@ -20,7 +20,6 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.Serial;
 import java.nio.charset.StandardCharsets;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
@@ -29,11 +28,36 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  * Type-safe encapsulation of a cluster member name.
  */
 public final class MemberName implements Comparable<MemberName>, WritableIdentifier {
-    private static final class Proxy implements Externalizable {
-        @Serial
+    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.
@@ -42,29 +66,27 @@ public final class MemberName implements Comparable<MemberName>, WritableIdentif
             // For Externalizable
         }
 
-        Proxy(final byte[] serialized) {
-            this.serialized = requireNonNull(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();
         }
     }
 
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull String name;
@@ -140,7 +162,8 @@ public final class MemberName implements Comparable<MemberName>, WritableIdentif
         return local;
     }
 
+    @java.io.Serial
     Object writeReplace() {
-        return new Proxy(getSerialized());
+        return new MN(this);
     }
 }