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%2FModifyTransactionRequest.java;h=b1ddd389306ac9ad5e38f8abbcd155dd91a1dec7;hb=HEAD;hp=0f01ee578a7fb085a66e9b0c7b9050b46f384394;hpb=d63cb58db4227292de723345e9f26852846d235d;p=controller.git diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ModifyTransactionRequest.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ModifyTransactionRequest.java index 0f01ee578a..b1ddd38930 100644 --- a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ModifyTransactionRequest.java +++ b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ModifyTransactionRequest.java @@ -8,31 +8,83 @@ package org.opendaylight.controller.cluster.access.commands; import akka.actor.ActorRef; -import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.collect.ImmutableList; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +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.opendaylight.controller.cluster.access.ABIVersion; +import org.opendaylight.controller.cluster.access.concepts.SliceableMessage; import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; +import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput; +import org.opendaylight.yangtools.yang.data.impl.schema.ReusableImmutableNormalizedNodeStreamWriter; /** * A transaction request to apply a particular set of operations on top of the current transaction. This message is * used to also finish a transaction by specifying a {@link PersistenceProtocol}. - * - * @author Robert Varga */ -@Beta -public final class ModifyTransactionRequest extends TransactionRequest { +public final class ModifyTransactionRequest extends TransactionRequest + implements SliceableMessage { + interface SerialForm extends TransactionRequest.SerialForm { + + + @Override + default ModifyTransactionRequest readExternal(final ObjectInput in, final TransactionIdentifier target, + final long sequence, final ActorRef replyTo) throws IOException { + + final var protocol = Optional.ofNullable(PersistenceProtocol.readFrom(in)); + final int size = in.readInt(); + final List modifications; + if (size != 0) { + modifications = new ArrayList<>(size); + final var nnin = NormalizedNodeDataInput.newDataInput(in); + final var writer = ReusableImmutableNormalizedNodeStreamWriter.create(); + for (int i = 0; i < size; ++i) { + modifications.add(TransactionModification.readFrom(nnin, writer)); + } + } else { + modifications = ImmutableList.of(); + } + + return new ModifyTransactionRequest(target, sequence, replyTo, modifications, protocol.orElse(null)); + } + + @Override + default void writeExternal(final ObjectOutput out, final ModifyTransactionRequest msg) throws IOException { + TransactionRequest.SerialForm.super.writeExternal(out, msg); + + out.writeByte(PersistenceProtocol.byteValue(msg.getPersistenceProtocol().orElse(null))); + + final var modifications = msg.getModifications(); + out.writeInt(modifications.size()); + if (!modifications.isEmpty()) { + try (var nnout = msg.getVersion().getStreamVersion().newDataOutput(out)) { + for (var op : modifications) { + op.writeTo(nnout); + } + } + } + } + } + + @java.io.Serial private static final long serialVersionUID = 1L; - @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 List modifications; private final PersistenceProtocol protocol; + private ModifyTransactionRequest(final ModifyTransactionRequest request, final ABIVersion version) { + super(request, version); + modifications = request.modifications; + protocol = request.protocol; + } + ModifyTransactionRequest(final TransactionIdentifier target, final long sequence, final ActorRef replyTo, final List modifications, final PersistenceProtocol protocol) { super(target, sequence, replyTo); @@ -50,16 +102,32 @@ public final class ModifyTransactionRequest extends TransactionRequest