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%2FEnvelope.java;h=eed7b5374113a4bf4b91d53fb576281d667259e6;hb=HEAD;hp=5f2d15d60797b184d978dc0620aa5ccf467446d1;hpb=9b4f21460c6dcb10c381df631d064d05de16546c;p=controller.git 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 5f2d15d607..eed7b53741 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 @@ -7,30 +7,70 @@ */ 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.yangtools.concepts.Immutable; +import org.opendaylight.yangtools.concepts.WritableObjects; public abstract class Envelope> implements Immutable, Serializable { + 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 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; } /** - * Get the enclosed message + * Get the enclosed message. * * @return enclose message */ - public T getMessage() { + public @NonNull T getMessage() { return message; } @@ -58,9 +98,10 @@ public abstract class Envelope> implements Immutable, Se .add("txSequence", Long.toHexString(txSequence)).add("message", message).toString(); } + @java.io.Serial final Object writeReplace() { return createProxy(); } - abstract AbstractEnvelopeProxy createProxy(); + abstract @NonNull SerialForm createProxy(); }