X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fcds-access-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Faccess%2Fconcepts%2FEnvelope.java;fp=opendaylight%2Fmd-sal%2Fcds-access-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Faccess%2Fconcepts%2FEnvelope.java;h=7d39f48e0ccac61e95f813a4d0ea86f62a94db46;hp=44cf7171c7f902828b6d0c569a64e93431b5e537;hb=d92bd0e575983b3d6a09a73089ef8f9c62f94eaa;hpb=e085f22bb1934959f9d6f7f4368c1afe964b1e07 diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Envelope.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Envelope.java index 44cf7171c7..7d39f48e0c 100644 --- a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Envelope.java +++ b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Envelope.java @@ -10,13 +10,50 @@ package org.opendaylight.controller.cluster.access.concepts; import static java.util.Objects.requireNonNull; import com.google.common.base.MoreObjects; -import java.io.Serial; +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> implements Immutable, Serializable { - @Serial + interface SerialForm, E extends Envelope> 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 @NonNull T message; @@ -62,10 +99,12 @@ public abstract class Envelope> implements Immutable, Se .add("txSequence", Long.toHexString(txSequence)).add("message", message).toString(); } - @Serial + @java.io.Serial final Object writeReplace() { - return createProxy(); + return ABIVersion.MAGNESIUM.lt(message.getVersion()) ? createProxy() : legacyProxy(); } - abstract AbstractEnvelopeProxy createProxy(); + abstract @NonNull SerialForm createProxy(); + + abstract @NonNull AbstractEnvelopeProxy legacyProxy(); }