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%2Fcommands%2FConnectClientSuccess.java;h=ad0e3624e1f1aa05969fa850c8b5b4f897316458;hb=HEAD;hp=8f16d61e349433a158db6065ebfad351536e0e87;hpb=e84f63ee098fff5b02cbce1281ca0d1208f966fa;p=controller.git diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ConnectClientSuccess.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ConnectClientSuccess.java index 8f16d61e34..ad0e3624e1 100644 --- a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ConnectClientSuccess.java +++ b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ConnectClientSuccess.java @@ -12,10 +12,18 @@ import static java.util.Objects.requireNonNull; import akka.actor.ActorRef; import akka.actor.ActorSelection; -import com.google.common.annotations.Beta; +import akka.serialization.JavaSerializer; +import akka.serialization.Serialization; import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.collect.ImmutableList; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.io.DataInput; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectInputStream; +import java.io.ObjectOutput; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamException; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; @@ -28,23 +36,60 @@ import org.opendaylight.yangtools.yang.data.tree.api.ReadOnlyDataTree; * Successful reply to an {@link ConnectClientRequest}. Client actor which initiated this connection should use * the version reported via {@link #getVersion()} of this message to communicate with this backend. Should this backend * fail, the client can try accessing the provided alternates. - * - * @author Robert Varga */ -@Beta public final class ConnectClientSuccess extends RequestSuccess { - private static final long serialVersionUID = 1L; + interface SerialForm extends RequestSuccess.SerialForm { + @Override + default ClientIdentifier readTarget(final DataInput in) throws IOException { + return ClientIdentifier.readFrom(in); + } + + @Override + default ConnectClientSuccess readExternal(final ObjectInput in, final ClientIdentifier target, + final long sequence) throws IOException, ClassNotFoundException { + final var backend = JavaSerializer.currentSystem().value().provider() + .resolveActorRef((String) in.readObject()); + final var maxMessages = in.readInt(); + + final int alternatesSize = in.readInt(); + final var alternates = new ArrayList(alternatesSize); + for (int i = 0; i < alternatesSize; ++i) { + alternates.add(ActorSelection.apply(ActorRef.noSender(), (String)in.readObject())); + } + + return new ConnectClientSuccess(target, sequence, backend, alternates, maxMessages, null); + } + + @Override + default void writeExternal(final ObjectOutput out, final ConnectClientSuccess msg) throws IOException { + out.writeObject(Serialization.serializedActorPath(msg.backend)); + out.writeInt(msg.maxMessages); + + out.writeInt(msg.alternates.size()); + for (ActorSelection b : msg.alternates) { + out.writeObject(b.toSerializationFormat()); + } + + // We are ignoring the DataTree, it is not serializable anyway + } + } - @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "This field is not Serializable but this class " - + "implements writeReplace to delegate serialization to a Proxy class and thus instances of this class " - + "aren't serialized. FindBugs does not recognize this.") - private final @NonNull List alternates; + @java.io.Serial + private static final long serialVersionUID = 1L; - @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "See justification above.") + private final @NonNull ImmutableList alternates; private final ReadOnlyDataTree dataTree; private final @NonNull ActorRef backend; private final int maxMessages; + private ConnectClientSuccess(final ConnectClientSuccess success, final ABIVersion version) { + super(success, version); + alternates = success.alternates; + dataTree = success.dataTree; + backend = success.backend; + maxMessages = success.maxMessages; + } + ConnectClientSuccess(final ClientIdentifier target, final long sequence, final ActorRef backend, final List alternates, final int maxMessages, final ReadOnlyDataTree dataTree) { super(target, sequence); @@ -83,13 +128,13 @@ public final class ConnectClientSuccess extends RequestSuccess