Deprecate ABIVersion.MAGNESIUM
[controller.git] / opendaylight / md-sal / cds-access-api / src / main / java / org / opendaylight / controller / cluster / access / concepts / Envelope.java
index 02686d9708254acac8373ed32ee0604f4f7ad7fa..7524985d4f38a898535505f237378ab0dce1195d 100644 (file)
@@ -7,20 +7,61 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.io.Serializable;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.concepts.WritableObjects;
 
 public abstract class Envelope<T extends Message<?, ?>> implements Immutable, Serializable {
+    interface SerialForm<T extends Message<?, ?>, E extends Envelope<T>> extends Externalizable {
+
+        @NonNull E envelope();
+
+        void setEnvelope(@NonNull E envelope);
+
+        @java.io.Serial
+        Object readResolve();
+
+        @Override
+        default void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
+            final byte header = WritableObjects.readLongHeader(in);
+            final var sessionId = WritableObjects.readFirstLong(in, header);
+            final var txSequence = WritableObjects.readSecondLong(in, header);
+            @SuppressWarnings("unchecked")
+            final var message = (T) in.readObject();
+            setEnvelope(readExternal(in, sessionId, txSequence, message));
+        }
+
+        E readExternal(ObjectInput in, long sessionId, long txSequence, T message) throws IOException;
+
+        @Override
+        default void writeExternal(final ObjectOutput out) throws IOException {
+            writeExternal(out, envelope());
+        }
+
+        default void writeExternal(final ObjectOutput out, final @NonNull E envelope) throws IOException {
+            WritableObjects.writeLongs(out, envelope.getSessionId(), envelope.getTxSequence());
+            out.writeObject(envelope.getMessage());
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private final T message;
+    private final @NonNull T message;
     private final long txSequence;
     private final long sessionId;
 
     Envelope(final T message, final long sessionId, final long txSequence) {
-        this.message = Preconditions.checkNotNull(message);
+        this.message = requireNonNull(message);
         this.sessionId = sessionId;
         this.txSequence = txSequence;
     }
@@ -30,7 +71,7 @@ public abstract class Envelope<T extends Message<?, ?>> implements Immutable, Se
      *
      * @return enclose message
      */
-    public T getMessage() {
+    public @NonNull T getMessage() {
         return message;
     }
 
@@ -58,9 +99,13 @@ public abstract class Envelope<T extends Message<?, ?>> implements Immutable, Se
                 .add("txSequence", Long.toHexString(txSequence)).add("message", message).toString();
     }
 
+    @java.io.Serial
     final Object writeReplace() {
-        return createProxy();
+        return ABIVersion.MAGNESIUM.lt(message.getVersion()) ? createProxy() : legacyProxy();
     }
 
-    abstract AbstractEnvelopeProxy<T> createProxy();
+    abstract @NonNull SerialForm<T, ?> createProxy();
+
+    @Deprecated(since = "7.0.0", forRemoval = true)
+    abstract @NonNull AbstractEnvelopeProxy<T, ?> legacyProxy();
 }