Deprecate ABIVersion.MAGNESIUM
[controller.git] / opendaylight / md-sal / cds-access-api / src / main / java / org / opendaylight / controller / cluster / access / concepts / Envelope.java
index cd674b48569e109ba1bd60be9dd386641e770820..7524985d4f38a898535505f237378ab0dce1195d 100644 (file)
  */
 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 long sequence;
-    private final long retry;
+    private final @NonNull T message;
+    private final long txSequence;
+    private final long sessionId;
 
-    Envelope(final T message, final long sequence, final long retry) {
-        this.message = Preconditions.checkNotNull(message);
-        this.sequence = sequence;
-        this.retry = retry;
+    Envelope(final T message, final long sessionId, final long txSequence) {
+        this.message = requireNonNull(message);
+        this.sessionId = sessionId;
+        this.txSequence = txSequence;
     }
 
     /**
-     * Get the enclosed message
+     * Get the enclosed message.
      *
      * @return enclose message
      */
-    public T getMessage() {
+    public @NonNull T getMessage() {
         return message;
     }
 
     /**
-     * Get the message sequence of this envelope.
+     * Get the message transmission sequence of this envelope.
      *
      * @return Message sequence
      */
-    public long getSequence() {
-        return sequence;
+    public long getTxSequence() {
+        return txSequence;
     }
 
     /**
-     * Get the message retry counter.
+     * Get the session identifier.
      *
-     * @return Retry counter
+     * @return Session identifier
      */
-    public long getRetry() {
-        return retry;
+    public long getSessionId() {
+        return sessionId;
     }
 
     @Override
     public String toString() {
-        return MoreObjects.toStringHelper(Envelope.class).add("sequence", Long.toUnsignedString(sequence, 16)).
-                add("retry", retry).add("message", message).toString();
+        return MoreObjects.toStringHelper(Envelope.class).add("sessionId", Long.toHexString(sessionId))
+                .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();
 }