Add new cds-access-api proxies
[controller.git] / opendaylight / md-sal / cds-access-api / src / main / java / org / opendaylight / controller / cluster / access / commands / ModifyTransactionRequest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.cluster.access.commands;
9
10 import akka.actor.ActorRef;
11 import com.google.common.base.MoreObjects.ToStringHelper;
12 import com.google.common.collect.ImmutableList;
13 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
14 import java.io.IOException;
15 import java.io.ObjectInput;
16 import java.io.ObjectOutput;
17 import java.util.ArrayList;
18 import java.util.List;
19 import java.util.Optional;
20 import org.opendaylight.controller.cluster.access.ABIVersion;
21 import org.opendaylight.controller.cluster.access.concepts.SliceableMessage;
22 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
23 import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
24 import org.opendaylight.yangtools.yang.data.impl.schema.ReusableImmutableNormalizedNodeStreamWriter;
25
26 /**
27  * A transaction request to apply a particular set of operations on top of the current transaction. This message is
28  * used to also finish a transaction by specifying a {@link PersistenceProtocol}.
29  */
30 public final class ModifyTransactionRequest extends TransactionRequest<ModifyTransactionRequest>
31         implements SliceableMessage {
32     interface SerialForm extends TransactionRequest.SerialForm<ModifyTransactionRequest> {
33
34
35         @Override
36         default ModifyTransactionRequest readExternal(final ObjectInput in, final TransactionIdentifier target,
37                 final long sequence, final ActorRef replyTo) throws IOException {
38
39             final var protocol = Optional.ofNullable(PersistenceProtocol.readFrom(in));
40             final int size = in.readInt();
41             final List<TransactionModification> modifications;
42             if (size != 0) {
43                 modifications = new ArrayList<>(size);
44                 final var nnin = NormalizedNodeDataInput.newDataInput(in);
45                 final var writer = ReusableImmutableNormalizedNodeStreamWriter.create();
46                 for (int i = 0; i < size; ++i) {
47                     modifications.add(TransactionModification.readFrom(nnin, writer));
48                 }
49             } else {
50                 modifications = ImmutableList.of();
51             }
52
53             return new ModifyTransactionRequest(target, sequence, replyTo, modifications, protocol.orElse(null));
54         }
55
56         @Override
57         default void writeExternal(final ObjectOutput out, final ModifyTransactionRequest msg) throws IOException {
58             TransactionRequest.SerialForm.super.writeExternal(out, msg);
59
60             out.writeByte(PersistenceProtocol.byteValue(msg.getPersistenceProtocol().orElse(null)));
61
62             final var modifications = msg.getModifications();
63             out.writeInt(modifications.size());
64             if (!modifications.isEmpty()) {
65                 try (var nnout = msg.getVersion().getStreamVersion().newDataOutput(out)) {
66                     for (var op : modifications) {
67                         op.writeTo(nnout);
68                     }
69                 }
70             }
71         }
72     }
73
74     @java.io.Serial
75     private static final long serialVersionUID = 1L;
76
77     @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "This field is not Serializable but this class "
78             + "implements writeReplace to delegate serialization to a Proxy class and thus instances of this class "
79             + "aren't serialized. FindBugs does not recognize this.")
80     private final List<TransactionModification> modifications;
81     private final PersistenceProtocol protocol;
82
83     private ModifyTransactionRequest(final ModifyTransactionRequest request, final ABIVersion version) {
84         super(request, version);
85         modifications = request.modifications;
86         protocol = request.protocol;
87     }
88
89     ModifyTransactionRequest(final TransactionIdentifier target, final long sequence, final ActorRef replyTo,
90         final List<TransactionModification> modifications, final PersistenceProtocol protocol) {
91         super(target, sequence, replyTo);
92         this.modifications = ImmutableList.copyOf(modifications);
93         this.protocol = protocol;
94     }
95
96     public Optional<PersistenceProtocol> getPersistenceProtocol() {
97         return Optional.ofNullable(protocol);
98     }
99
100     public List<TransactionModification> getModifications() {
101         return modifications;
102     }
103
104     @Override
105     protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
106         return super.addToStringAttributes(toStringHelper).add("modifications", modifications.size())
107                 .add("protocol", protocol);
108     }
109
110     @Override
111     protected SerialForm externalizableProxy(final ABIVersion version) {
112         return ABIVersion.MAGNESIUM.lt(version) ? new MTR(this) : new ModifyTransactionRequestProxyV1(this);
113     }
114
115     @Override
116     protected ModifyTransactionRequest cloneAsVersion(final ABIVersion version) {
117         return new ModifyTransactionRequest(this, version);
118     }
119 }