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%2FMessage.java;h=86c91ef9553bd421085d079687d049d442e64ae4;hb=refs%2Fchanges%2F47%2F103447%2F26;hp=6ee547fc93e75a8acf80a4b0e2f5c4f8ace4be55;hpb=e085f22bb1934959f9d6f7f4368c1afe964b1e07;p=controller.git diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Message.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Message.java index 6ee547fc93..86c91ef955 100644 --- a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Message.java +++ b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Message.java @@ -13,12 +13,17 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; -import java.io.Serial; +import java.io.DataInput; +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.WritableIdentifier; +import org.opendaylight.yangtools.concepts.WritableObjects; /** * An abstract concept of a Message. This class cannot be instantiated directly, use its specializations {@link Request} @@ -50,9 +55,46 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier; * @param Target identifier type * @param Message type */ -public abstract class Message> implements Immutable, - Serializable { - @Serial +public abstract class Message> + implements Immutable, Serializable { + /** + * Externalizable proxy for use with {@link Message} subclasses. + * + * @param Target identifier type + * @param Message class + */ + protected interface SerialForm> extends Externalizable { + + @NonNull C message(); + + void setMessage(@NonNull C message); + + @Override + default void writeExternal(final ObjectOutput out) throws IOException { + final var message = message(); + message.getTarget().writeTo(out); + WritableObjects.writeLong(out, message.getSequence()); + writeExternal(out, message); + } + + void writeExternal(@NonNull ObjectOutput out, @NonNull C msg) throws IOException; + + @Override + default void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { + final var target = verifyNotNull(readTarget(in)); + final var sequence = WritableObjects.readLong(in); + setMessage(verifyNotNull(readExternal(in, target, sequence))); + } + + @NonNull C readExternal(@NonNull ObjectInput in, @NonNull T target, long sequence) + throws IOException, ClassNotFoundException; + + Object readResolve(); + + @NonNull T readTarget(@NonNull DataInput in) throws IOException; + } + + @java.io.Serial private static final long serialVersionUID = 1L; private final @NonNull ABIVersion version; @@ -150,9 +192,9 @@ public abstract class Message externalizableProxy(@NonNull ABIVersion reqVersion); + protected abstract @NonNull SerialForm externalizableProxy(@NonNull ABIVersion reqVersion); - @Serial + @java.io.Serial protected final Object writeReplace() { return externalizableProxy(version); }