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=fd1b1b8e995c65fc4b299e55b4ba2ed2e0861249;hpb=c9d61ee66367d819319bb8ccfa9f9b0555264d86;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 fd1b1b8e99..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,29 +8,86 @@ 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 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; + private final List modifications; private final PersistenceProtocol protocol; - ModifyTransactionRequest(final TransactionIdentifier target, final ActorRef replyTo, + 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, replyTo); + super(target, sequence, replyTo); this.modifications = ImmutableList.copyOf(modifications); this.protocol = protocol; } @@ -45,16 +102,32 @@ public final class ModifyTransactionRequest extends TransactionRequest