Add new cds-access-api proxies 47/103447/26
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 27 Nov 2022 12:59:16 +0000 (13:59 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 1 Dec 2022 15:44:28 +0000 (16:44 +0100)
Externalizable serialization format record class hierarchy, which leads
to significant overheads. This patch introduces proxies which are are
flat, i.e. have java.Object as their superclass, eliminating this
overhead.

The way we do this is we defined SerialForm interfaces which extend
Externalizable and define the serialization protocol in terms of default
methods. We then define a bunch of classes which are pure data holders
implementing individual SerialForms.

Also ensure messages properly implement cloneAsVersion() to propagate
the target version, now that it matters for them.

Finally audit use of java.io.Serial so that we do not import it -- it is
just pure overhead vs. using @java.io.Serial directly.

JIRA: CONTROLLER-2051
Change-Id: I01132665027687edc1c6d44dda8a6ab0cab6ad6a
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
168 files changed:
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/ABIVersion.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/AbstractVersionException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/FutureVersionException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/PastVersionException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/AbortLocalTransactionRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/AbstractLocalHistoryRequestProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/AbstractLocalTransactionRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/AbstractReadPathTransactionRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/AbstractReadPathTransactionRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/AbstractReadTransactionRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/AbstractReadTransactionRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/AbstractTransactionRequestProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/AbstractTransactionSuccessProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CCF.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CCR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CCS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CHR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ClosedTransactionException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CommitLocalTransactionRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ConnectClientFailure.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ConnectClientFailureProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ConnectClientRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ConnectClientRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ConnectClientSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ConnectClientSuccessProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CreateLocalHistoryRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CreateLocalHistoryRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/DHR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/DeadHistoryException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/DeadTransactionException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/DestroyLocalHistoryRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/DestroyLocalHistoryRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ETR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ETS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ExistsTransactionRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ExistsTransactionRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ExistsTransactionSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ExistsTransactionSuccessProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/HF.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/HS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ITSR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ITSS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/IncrementTransactionSequenceRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/IncrementTransactionSequenceRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/IncrementTransactionSequenceSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/IncrementTransactionSequenceSuccessProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/LocalHistoryFailure.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/LocalHistoryFailureProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/LocalHistoryRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/LocalHistorySuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/LocalHistorySuccessProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/MTR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/MTS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ModifyTransactionRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ModifyTransactionRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ModifyTransactionSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ModifyTransactionSuccessProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/NotLeaderException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/OutOfOrderRequestException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/OutOfSequenceEnvelopeException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/PHR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/PurgeLocalHistoryRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/PurgeLocalHistoryRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/RTR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/RTS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ReadTransactionRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ReadTransactionRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ReadTransactionSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ReadTransactionSuccessProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/STR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/STS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/SkipTransactionsRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/SkipTransactionsRequestV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/SkipTransactionsResponse.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/SkipTransactionsResponseProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TAR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TAS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TCCS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TCS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TDCR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TF.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPCR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPCS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPR.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPS.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionAbortRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionAbortRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionAbortSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionAbortSuccessProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionCanCommitSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionCanCommitSuccessProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionCommitSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionCommitSuccessProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionDoCommitRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionDoCommitRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionFailure.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionFailureProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionPreCommitRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionPreCommitRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionPreCommitSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionPreCommitSuccessProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionPurgeRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionPurgeRequestProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionPurgeResponse.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionPurgeResponseProxyV1.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionRequest.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TransactionSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/UnknownHistoryException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/AbstractEnvelopeProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/AbstractMessageProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/AbstractRequestFailureProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/AbstractRequestProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/AbstractResponseEnvelopeProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/AbstractResponseProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/AbstractSuccessProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/CI.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/ClientIdentifier.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Envelope.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FE.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FI.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FT.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FailureEnvelope.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FailureEnvelopeProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FrontendIdentifier.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FrontendType.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/HI.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/LocalHistoryIdentifier.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/MN.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/MemberName.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Message.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/RE.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Request.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/RequestEnvelope.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/RequestEnvelopeProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/RequestException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/RequestFailure.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/RequestSuccess.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/Response.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/ResponseEnvelope.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/RetiredGenerationException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/RuntimeRequestException.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/SE.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/SuccessEnvelope.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/SuccessEnvelopeProxy.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/TI.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/TransactionIdentifier.java
opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/UnsupportedRequestException.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/ConnectClientSuccessTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/ExistsTransactionSuccessTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/LocalHistoryFailureTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/ModifyTransactionRequestEmptyTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/ModifyTransactionRequestTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/ReadTransactionSuccessNoDataTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/ReadTransactionSuccessTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/SkipTransactionsRequestTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/SkipTransactionsResponseTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/TransactionAbortRequestTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/TransactionAbortSuccessTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/TransactionCanCommitSuccessTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/TransactionCommitSuccessTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/TransactionDoCommitRequestTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/TransactionFailureTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/TransactionPreCommitRequestTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/TransactionPreCommitSuccessTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/TransactionPurgeRequestTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/commands/TransactionPurgeResponseTest.java
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/FailureEnvelopeTest.java
opendaylight/md-sal/cds-access-client/src/test/java/org/opendaylight/controller/cluster/access/client/TransmittingTransmitQueueTest.java

index 84eb8f6c97f3222c91f9fab6037156c9cd42618e..716083156b32aca9fe1e9c0eaf52b4eeddf84e13 100644 (file)
@@ -136,6 +136,17 @@ public enum ABIVersion implements WritableObject {
         };
     }
 
+    /**
+     * Return {@code true} if this version is earier than some {@code other} version.
+     *
+     * @param other Other {@link ABIVersion}
+     * @return {@code true} if {@code other is later}
+     * @throws NullPointerException if {@code other} is null
+     */
+    public boolean lt(final @NonNull ABIVersion other) {
+        return compareTo(other) < 0;
+    }
+
     @Override
     public void writeTo(final DataOutput out) throws IOException {
         out.writeShort(value);
index f1c538c7180af1f7d464af7385299b583264a0ee..1555b59501b586f4ab812b8a595001d4c4f33e1e 100644 (file)
@@ -9,14 +9,13 @@ package org.opendaylight.controller.cluster.access;
 
 import static java.util.Objects.requireNonNull;
 
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 
 /**
  * Abstract base exception used for reporting version mismatches from {@link ABIVersion}.
  */
 public abstract class AbstractVersionException extends Exception {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull ABIVersion closestVersion;
index 4cd807ee097bce537c22fd163e1711d89876ebfb..f0ceaa4890b61dbc38493075be9cbf7e3fc74213 100644 (file)
@@ -7,17 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access;
 
-import java.io.Serial;
-
 /**
  * Exception thrown from {@link ABIVersion#valueOf(short)} when the specified version is too new to be supported
  * by the codebase.
  */
 public final class FutureVersionException extends AbstractVersionException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    FutureVersionException(final short version, ABIVersion closest) {
+    FutureVersionException(final short version, final ABIVersion closest) {
         super("Version " + Short.toUnsignedInt(version) + " is too new", version, closest);
     }
 }
index 0b7f134ec97bc5cc91c2b6c06c6a97d3c1396e52..c333d3495e163e494c4daa28480e058c0c3a38af 100644 (file)
@@ -7,16 +7,12 @@
  */
 package org.opendaylight.controller.cluster.access;
 
-import java.io.Serial;
-
 /**
  * Exception thrown from {@link ABIVersion#valueOf(short)} when the specified version is too old and no longer
  * supported by the codebase.
- *
- * @author Robert Varga
  */
 public final class PastVersionException extends AbstractVersionException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     PastVersionException(final short version, final ABIVersion closest) {
index 37ddb9e7e7391e0e163f477b7b85cee34b498310..9e2998c5b2536a8ef3d406de7e5c5f90c203dab2 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -18,7 +17,7 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * not important for single transactions, but is critical to ensure transaction ordering within local histories.
  */
 public final class AbortLocalTransactionRequest extends AbstractLocalTransactionRequest<AbortLocalTransactionRequest> {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public AbortLocalTransactionRequest(final @NonNull TransactionIdentifier identifier,
index cd02a20099597500687525db4ec5816679527714..1bd37fb83c18b8cb5cf7f89ef4ce076c252140ed 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.DataInput;
-import java.io.IOException;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.AbstractRequestProxy;
 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
 
@@ -21,8 +18,8 @@ import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifie
  * @param <T> Message type
  */
 abstract class AbstractLocalHistoryRequestProxy<T extends LocalHistoryRequest<T>>
-        extends AbstractRequestProxy<LocalHistoryIdentifier, T> {
-    @Serial
+        extends AbstractRequestProxy<LocalHistoryIdentifier, T> implements LocalHistoryRequest.SerialForm<T> {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     protected AbstractLocalHistoryRequestProxy() {
@@ -32,9 +29,4 @@ abstract class AbstractLocalHistoryRequestProxy<T extends LocalHistoryRequest<T>
     AbstractLocalHistoryRequestProxy(final T request) {
         super(request);
     }
-
-    @Override
-    protected final LocalHistoryIdentifier readTarget(final DataInput in) throws IOException {
-        return LocalHistoryIdentifier.readFrom(in);
-    }
 }
index f31e4088890e6a0a0486caf32dd3325b481ffd91..5831e65c11a88aabea03d78ee595635a4490097e 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.Request;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
@@ -23,7 +22,7 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  */
 public abstract class AbstractLocalTransactionRequest<T extends AbstractLocalTransactionRequest<T>>
         extends TransactionRequest<T> {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     AbstractLocalTransactionRequest(final TransactionIdentifier identifier, final long sequence,
@@ -32,7 +31,7 @@ public abstract class AbstractLocalTransactionRequest<T extends AbstractLocalTra
     }
 
     @Override
-    protected final AbstractTransactionRequestProxy<T> externalizableProxy(final ABIVersion version) {
+    protected final SerialForm<T> externalizableProxy(final ABIVersion version) {
         throw new UnsupportedOperationException("Local transaction request " + this + " should never be serialized");
     }
 
index 1cdade9ac0373062274d57f025e1c58400afbfa8..2b4ee0e7e8dd2ef8ffaa7a2e9b69a1783668b257 100644 (file)
@@ -11,11 +11,14 @@ import static java.util.Objects.requireNonNull;
 
 import akka.actor.ActorRef;
 import com.google.common.base.MoreObjects.ToStringHelper;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
 
 /**
  * Abstract base class for {@link TransactionRequest}s accessing data as visible in the isolated context of a particular
@@ -29,7 +32,29 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
  */
 public abstract class AbstractReadPathTransactionRequest<T extends AbstractReadPathTransactionRequest<T>>
         extends AbstractReadTransactionRequest<T> {
-    @Serial
+    interface SerialForm<T extends AbstractReadPathTransactionRequest<T>>
+            extends AbstractReadTransactionRequest.SerialForm<T> {
+
+        @Override
+        default T readExternal(final ObjectInput in, final TransactionIdentifier target, final long sequence,
+                final ActorRef replyTo, final boolean snapshotOnly) throws IOException {
+            return readExternal(in, target, sequence, replyTo, snapshotOnly,
+                NormalizedNodeDataInput.newDataInput(in).readYangInstanceIdentifier());
+        }
+
+        @NonNull T readExternal(@NonNull ObjectInput in, @NonNull TransactionIdentifier target, long sequence,
+            @NonNull ActorRef replyTo, boolean snapshotOnly, @NonNull YangInstanceIdentifier path) throws IOException;
+
+        @Override
+        default void writeExternal(final ObjectOutput out, final T msg) throws IOException {
+            AbstractReadTransactionRequest.SerialForm.super.writeExternal(out, msg);
+            try (var nnout = msg.getVersion().getStreamVersion().newDataOutput(out)) {
+                nnout.writeYangInstanceIdentifier(msg.getPath());
+            }
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull YangInstanceIdentifier path;
@@ -55,5 +80,5 @@ public abstract class AbstractReadPathTransactionRequest<T extends AbstractReadP
     }
 
     @Override
-    protected abstract AbstractReadTransactionRequestProxyV1<T> externalizableProxy(ABIVersion version);
+    protected abstract SerialForm<T> externalizableProxy(ABIVersion version);
 }
index e139920d6f2f064ea9552a2cd7a35b118e754fea..e5429841f3a45954e892e64db3824f4a82b57834 100644 (file)
@@ -7,17 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
-import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataOutput;
-import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion;
-
 /**
  * Abstract base class for serialization proxies associated with {@link AbstractReadTransactionRequest}s. It implements
  * the initial (Boron) serialization format.
@@ -27,43 +16,15 @@ import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVer
  * @param <T> Message type
  */
 abstract class AbstractReadPathTransactionRequestProxyV1<T extends AbstractReadPathTransactionRequest<T>>
-        extends AbstractReadTransactionRequestProxyV1<T> {
-    @Serial
+        extends AbstractReadTransactionRequestProxyV1<T> implements AbstractReadPathTransactionRequest.SerialForm<T> {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private YangInstanceIdentifier path;
-    private transient NormalizedNodeStreamVersion streamVersion;
-
     protected AbstractReadPathTransactionRequestProxyV1() {
         // For Externalizable
     }
 
     AbstractReadPathTransactionRequestProxyV1(final T request) {
         super(request);
-        path = request.getPath();
-        streamVersion = request.getVersion().getStreamVersion();
     }
-
-    @Override
-    public final void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        try (NormalizedNodeDataOutput nnout = streamVersion.newDataOutput(out)) {
-            nnout.writeYangInstanceIdentifier(path);
-        }
-    }
-
-    @Override
-    public final void readExternal(final ObjectInput in) throws ClassNotFoundException, IOException {
-        super.readExternal(in);
-        path = NormalizedNodeDataInput.newDataInput(in).readYangInstanceIdentifier();
-    }
-
-    @Override
-    protected final T createReadRequest(final TransactionIdentifier target, final long sequence,
-            final ActorRef replyTo, final boolean snapshotOnly) {
-        return createReadPathRequest(target, sequence, replyTo, path, snapshotOnly);
-    }
-
-    abstract T createReadPathRequest(TransactionIdentifier target, long sequence, ActorRef replyTo,
-            YangInstanceIdentifier requestPath, boolean snapshotOnly);
 }
index 4c1d3971f51e1a42709e3fbea9bcfd879c96d429..23fdd85140db711919672496df7cb10745af7c4a 100644 (file)
@@ -9,7 +9,10 @@ package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
 import com.google.common.base.MoreObjects.ToStringHelper;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -24,7 +27,24 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  */
 public abstract class AbstractReadTransactionRequest<T extends AbstractReadTransactionRequest<T>>
         extends TransactionRequest<T> {
-    @Serial
+    interface SerialForm<T extends AbstractReadTransactionRequest<T>> extends TransactionRequest.SerialForm<T> {
+        @Override
+        default T readExternal(final ObjectInput in, final TransactionIdentifier target, final long sequence,
+                final ActorRef replyTo) throws IOException {
+            return readExternal(in, target, sequence, replyTo, in.readBoolean());
+        }
+
+        @NonNull T readExternal(@NonNull ObjectInput in, @NonNull TransactionIdentifier target, long sequence,
+            @NonNull ActorRef replyTo, boolean snapshotOnly) throws IOException;
+
+        @Override
+        default void writeExternal(final ObjectOutput out, final T msg) throws IOException {
+            TransactionRequest.SerialForm.super.writeExternal(out, msg);
+            out.writeBoolean(msg.isSnapshotOnly());
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final boolean snapshotOnly;
@@ -50,5 +70,5 @@ public abstract class AbstractReadTransactionRequest<T extends AbstractReadTrans
     }
 
     @Override
-    protected abstract AbstractReadTransactionRequestProxyV1<T> externalizableProxy(ABIVersion version);
+    protected abstract SerialForm<T> externalizableProxy(ABIVersion version);
 }
index 66bca1d7465e15e2da21ef669fb433f25420baff..e8539ea57b421f880d4d7506c61aa0dc3a9d7a36 100644 (file)
@@ -7,13 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Abstract base class for serialization proxies associated with {@link AbstractReadTransactionRequest}s. It implements
  * the initial (Boron) serialization format.
@@ -23,38 +16,15 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * @param <T> Message type
  */
 abstract class AbstractReadTransactionRequestProxyV1<T extends AbstractReadTransactionRequest<T>>
-        extends AbstractTransactionRequestProxy<T> {
-    @Serial
+        extends AbstractTransactionRequestProxy<T> implements AbstractReadTransactionRequest.SerialForm<T> {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private boolean snapshotOnly;
-
     protected AbstractReadTransactionRequestProxyV1() {
         // For Externalizable
     }
 
     AbstractReadTransactionRequestProxyV1(final T request) {
         super(request);
-        snapshotOnly = request.isSnapshotOnly();
     }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeBoolean(snapshotOnly);
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws ClassNotFoundException, IOException {
-        super.readExternal(in);
-        snapshotOnly = in.readBoolean();
-    }
-
-    @Override
-    protected final T createRequest(final TransactionIdentifier target, final long sequence, final ActorRef replyTo) {
-        return createReadRequest(target, sequence, replyTo, snapshotOnly);
-    }
-
-    @SuppressWarnings("checkstyle:hiddenField")
-    abstract T createReadRequest(TransactionIdentifier target, long sequence, ActorRef replyTo, boolean snapshotOnly);
 }
index b37227056a131d76331c6d3d30502a527e21eb16..f43a0d223041b02c1df5f5e5af003dbeec9156cd 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.DataInput;
-import java.io.IOException;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.AbstractRequestProxy;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -21,8 +18,8 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * @param <T> Message type
  */
 abstract class AbstractTransactionRequestProxy<T extends TransactionRequest<T>>
-        extends AbstractRequestProxy<TransactionIdentifier, T> {
-    @Serial
+        extends AbstractRequestProxy<TransactionIdentifier, T> implements TransactionRequest.SerialForm<T> {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     AbstractTransactionRequestProxy() {
@@ -32,9 +29,4 @@ abstract class AbstractTransactionRequestProxy<T extends TransactionRequest<T>>
     AbstractTransactionRequestProxy(final T request) {
         super(request);
     }
-
-    @Override
-    protected final TransactionIdentifier readTarget(final DataInput in) throws IOException {
-        return TransactionIdentifier.readFrom(in);
-    }
 }
index 187ad71c35185c93eac612de9174f86f05c13363..ee44907b22ae822fe45fe5550b127eca2cfb84d0 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.DataInput;
-import java.io.IOException;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.AbstractSuccessProxy;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -21,8 +18,8 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * @param <T> Message type
  */
 abstract class AbstractTransactionSuccessProxy<T extends TransactionSuccess<T>>
-        extends AbstractSuccessProxy<TransactionIdentifier, T> {
-    @Serial
+        extends AbstractSuccessProxy<TransactionIdentifier, T> implements TransactionSuccess.SerialForm<T> {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     AbstractTransactionSuccessProxy() {
@@ -32,9 +29,4 @@ abstract class AbstractTransactionSuccessProxy<T extends TransactionSuccess<T>>
     AbstractTransactionSuccessProxy(final T request) {
         super(request);
     }
-
-    @Override
-    protected final TransactionIdentifier readTarget(final DataInput in) throws IOException {
-        return TransactionIdentifier.readFrom(in);
-    }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CCF.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CCF.java
new file mode 100644 (file)
index 0000000..ea9c37e
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link ConnectClientFailure}. It implements the Chlorine SR2 serialization format.
+ */
+final class CCF implements ConnectClientFailure.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private ConnectClientFailure message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public CCF() {
+        // for Externalizable
+    }
+
+    CCF(final ConnectClientFailure request) {
+        message = requireNonNull(request);
+    }
+
+    @Override
+    public ConnectClientFailure message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final ConnectClientFailure message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CCR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CCR.java
new file mode 100644 (file)
index 0000000..ace94d5
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link ConnectClientRequest}. It implements the Chlorine SR2 serialization format.
+ */
+final class CCR implements ConnectClientRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private ConnectClientRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public CCR() {
+        // for Externalizable
+    }
+
+    CCR(final ConnectClientRequest request) {
+        message = requireNonNull(request);
+    }
+
+    @Override
+    public ConnectClientRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final ConnectClientRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CCS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CCS.java
new file mode 100644 (file)
index 0000000..ea425e5
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link ConnectClientSuccess}. It implements the Chlorine SR2 serialization format.
+ */
+final class CCS implements ConnectClientSuccess.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private ConnectClientSuccess message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public CCS() {
+        // for Externalizable
+    }
+
+    CCS(final ConnectClientSuccess request) {
+        message = requireNonNull(request);
+    }
+
+    @Override
+    public ConnectClientSuccess message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final ConnectClientSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CHR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/CHR.java
new file mode 100644 (file)
index 0000000..da3fd13
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link CreateLocalHistoryRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class CHR implements CreateLocalHistoryRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private CreateLocalHistoryRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public CHR() {
+        // For Externalizable
+    }
+
+    CHR(final CreateLocalHistoryRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public CreateLocalHistoryRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final CreateLocalHistoryRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
index 10bee071a5d34c8deb91756de5ff8a020363f2ff..67b1a40408f39067e6ec42b6bc99695d1177ee05 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 
 /**
@@ -17,7 +16,7 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  * leader moved before the frontend retried the corresponding request.
  */
 public final class ClosedTransactionException extends RequestException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final boolean successful;
index c51165fb63c771589617fb83feca4e985cbeeaf9..c7502d51d4519d6d2d4e96f8ba7beb1360259143 100644 (file)
@@ -12,7 +12,6 @@ import static java.util.Objects.requireNonNull;
 import akka.actor.ActorRef;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.io.Serial;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
@@ -25,7 +24,7 @@ import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModification;
  */
 public final class CommitLocalTransactionRequest
         extends AbstractLocalTransactionRequest<CommitLocalTransactionRequest> {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "This field is not Serializable but this class "
index e11798ab8083364caa253adf4f3104bcdf63679b..aa93708cd4d6a342e9a43aa6a786bc54874171d5 100644 (file)
@@ -7,9 +7,9 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.DataInput;
+import java.io.IOException;
 import org.opendaylight.controller.cluster.access.ABIVersion;
-import org.opendaylight.controller.cluster.access.concepts.AbstractRequestFailureProxy;
 import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 import org.opendaylight.controller.cluster.access.concepts.RequestFailure;
@@ -18,7 +18,20 @@ import org.opendaylight.controller.cluster.access.concepts.RequestFailure;
  * A {@link RequestFailure} reported when {@link ConnectClientRequest} fails.
  */
 public final class ConnectClientFailure extends RequestFailure<ClientIdentifier, ConnectClientFailure> {
-    @Serial
+    interface SerialForm extends RequestFailure.SerialForm<ClientIdentifier, ConnectClientFailure> {
+        @Override
+        default ClientIdentifier readTarget(final DataInput in) throws IOException {
+            return ClientIdentifier.readFrom(in);
+        }
+
+        @Override
+        default ConnectClientFailure createFailure(final ClientIdentifier target, final long sequence,
+                final RequestException cause) {
+            return new ConnectClientFailure(target, sequence, cause);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     ConnectClientFailure(final ClientIdentifier target, final long sequence, final RequestException cause) {
@@ -30,9 +43,8 @@ public final class ConnectClientFailure extends RequestFailure<ClientIdentifier,
     }
 
     @Override
-    protected AbstractRequestFailureProxy<ClientIdentifier, ConnectClientFailure> externalizableProxy(
-            final ABIVersion version) {
-        return new ConnectClientFailureProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new CCF(this) : new ConnectClientFailureProxyV1(this);
     }
 
     @Override
index 84a10dae160c25f06f44454f0b824ec4ded78b67..75f3a5f1fc0b144465d7c35e2812a503dc7436dc 100644 (file)
@@ -7,12 +7,8 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.DataInput;
-import java.io.IOException;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.AbstractRequestFailureProxy;
 import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
-import org.opendaylight.controller.cluster.access.concepts.RequestException;
 
 /**
  * Serialization proxy for use with {@link ConnectClientFailure}. This class implements initial (Boron) serialization
@@ -20,8 +16,9 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  *
  * @author Robert Varga
  */
-final class ConnectClientFailureProxyV1 extends AbstractRequestFailureProxy<ClientIdentifier, ConnectClientFailure> {
-    @Serial
+final class ConnectClientFailureProxyV1 extends AbstractRequestFailureProxy<ClientIdentifier, ConnectClientFailure>
+        implements ConnectClientFailure.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 2688639416324657256L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -34,15 +31,4 @@ final class ConnectClientFailureProxyV1 extends AbstractRequestFailureProxy<Clie
     ConnectClientFailureProxyV1(final ConnectClientFailure failure) {
         super(failure);
     }
-
-    @Override
-    protected ConnectClientFailure createFailure(final ClientIdentifier target, final long sequence,
-            final RequestException cause) {
-        return new ConnectClientFailure(target, sequence, cause);
-    }
-
-    @Override
-    protected ClientIdentifier readTarget(final DataInput in) throws IOException {
-        return ClientIdentifier.readFrom(in);
-    }
 }
index 12534e037def93dbcd50a40655c3904eb076dc86..12fb0181d5f7e35be9424b8384deb07cd061d0a8 100644 (file)
@@ -11,9 +11,11 @@ import static java.util.Objects.requireNonNull;
 
 import akka.actor.ActorRef;
 import com.google.common.base.MoreObjects.ToStringHelper;
-import java.io.Serial;
+import java.io.DataInput;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
-import org.opendaylight.controller.cluster.access.concepts.AbstractRequestProxy;
 import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
 import org.opendaylight.controller.cluster.access.concepts.Request;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
@@ -28,7 +30,28 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  * It also includes request stream sequencing information.
  */
 public final class ConnectClientRequest extends Request<ClientIdentifier, ConnectClientRequest> {
-    @Serial
+    interface SerialForm extends Request.SerialForm<ClientIdentifier, ConnectClientRequest> {
+        @Override
+        default ConnectClientRequest readExternal(final ObjectInput in, final ClientIdentifier target,
+                final long sequence, final ActorRef replyTo) throws IOException {
+            return new ConnectClientRequest(target, sequence, replyTo, ABIVersion.inexactReadFrom(in),
+                ABIVersion.inexactReadFrom(in));
+        }
+
+        @Override
+        default ClientIdentifier readTarget(final DataInput in) throws IOException {
+            return ClientIdentifier.readFrom(in);
+        }
+
+        @Override
+        default void writeExternal(final ObjectOutput out, final ConnectClientRequest msg) throws IOException {
+            Request.SerialForm.super.writeExternal(out, msg);
+            msg.getMinVersion().writeTo(out);
+            msg.getMaxVersion().writeTo(out);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final ABIVersion minVersion;
@@ -66,9 +89,8 @@ public final class ConnectClientRequest extends Request<ClientIdentifier, Connec
     }
 
     @Override
-    protected AbstractRequestProxy<ClientIdentifier, ConnectClientRequest> externalizableProxy(
-            final ABIVersion version) {
-        return new ConnectClientRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new CCR(this) : new ConnectClientRequestProxyV1(this);
     }
 
     @Override
index b420125b8312616c28aebacd0b8ff6449aac2f5b..419852328f8f16652b25024cae303ea86496014a 100644 (file)
@@ -7,13 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.DataInput;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.AbstractRequestProxy;
 import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
 
@@ -23,13 +16,11 @@ import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
  *
  * @author Robert Varga
  */
-final class ConnectClientRequestProxyV1 extends AbstractRequestProxy<ClientIdentifier, ConnectClientRequest> {
-    @Serial
+final class ConnectClientRequestProxyV1 extends AbstractRequestProxy<ClientIdentifier, ConnectClientRequest>
+        implements ConnectClientRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 8439729661327852159L;
 
-    private ABIVersion minVersion;
-    private ABIVersion maxVersion;
-
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
     // be able to create instances via reflection.
     @SuppressWarnings("checkstyle:RedundantModifier")
@@ -39,32 +30,5 @@ final class ConnectClientRequestProxyV1 extends AbstractRequestProxy<ClientIdent
 
     ConnectClientRequestProxyV1(final ConnectClientRequest request) {
         super(request);
-        minVersion = request.getMinVersion();
-        maxVersion = request.getMaxVersion();
-    }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        minVersion.writeTo(out);
-        maxVersion.writeTo(out);
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        minVersion = ABIVersion.inexactReadFrom(in);
-        maxVersion = ABIVersion.inexactReadFrom(in);
-    }
-
-    @Override
-    protected ConnectClientRequest createRequest(final ClientIdentifier target, final long sequence,
-            final ActorRef replyTo) {
-        return new ConnectClientRequest(target, sequence, replyTo, minVersion, maxVersion);
-    }
-
-    @Override
-    protected ClientIdentifier readTarget(final DataInput in) throws IOException {
-        return ClientIdentifier.readFrom(in);
     }
 }
index d87a486f7917ff512176172eee67b7539dd0891d..72dd51d616d9f56deb925fcbe1a22389f2c96a8f 100644 (file)
@@ -12,10 +12,16 @@ import static java.util.Objects.requireNonNull;
 
 import akka.actor.ActorRef;
 import akka.actor.ActorSelection;
+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.Serial;
+import java.io.DataInput;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
@@ -30,7 +36,43 @@ import org.opendaylight.yangtools.yang.data.tree.api.ReadOnlyDataTree;
  * fail, the client can try accessing the provided alternates.
  */
 public final class ConnectClientSuccess extends RequestSuccess<ClientIdentifier, ConnectClientSuccess> {
-    @Serial
+    interface SerialForm extends RequestSuccess.SerialForm<ClientIdentifier, ConnectClientSuccess> {
+        @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<ActorSelection>(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
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull ImmutableList<ActorSelection> alternates;
@@ -40,6 +82,14 @@ public final class ConnectClientSuccess extends RequestSuccess<ClientIdentifier,
     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<ActorSelection> alternates, final int maxMessages, final ReadOnlyDataTree dataTree) {
         super(target, sequence);
@@ -78,13 +128,13 @@ public final class ConnectClientSuccess extends RequestSuccess<ClientIdentifier,
     }
 
     @Override
-    protected ConnectClientSuccessProxyV1 externalizableProxy(final ABIVersion version) {
-        return new ConnectClientSuccessProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new CCS(this) : new ConnectClientSuccessProxyV1(this);
     }
 
     @Override
     protected ConnectClientSuccess cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new ConnectClientSuccess(this, version);
     }
 
     @Override
index ed04f031974c6915b323ac73ad009985d3b7aab0..ec898b016c1305439254ec1b590a993ba592e402 100644 (file)
@@ -7,17 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import akka.actor.ActorSelection;
-import akka.serialization.JavaSerializer;
-import akka.serialization.Serialization;
-import java.io.DataInput;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import java.util.ArrayList;
-import java.util.List;
 import org.opendaylight.controller.cluster.access.concepts.AbstractSuccessProxy;
 import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
 
@@ -27,14 +16,11 @@ import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
  *
  * @author Robert Varga
  */
-final class ConnectClientSuccessProxyV1 extends AbstractSuccessProxy<ClientIdentifier, ConnectClientSuccess> {
-    @Serial
+final class ConnectClientSuccessProxyV1 extends AbstractSuccessProxy<ClientIdentifier, ConnectClientSuccess>
+        implements ConnectClientSuccess.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private List<ActorSelection> alternates;
-    private ActorRef backend;
-    private int maxMessages;
-
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
     // be able to create instances via reflection.
     @SuppressWarnings("checkstyle:RedundantModifier")
@@ -44,46 +30,5 @@ final class ConnectClientSuccessProxyV1 extends AbstractSuccessProxy<ClientIdent
 
     ConnectClientSuccessProxyV1(final ConnectClientSuccess success) {
         super(success);
-        alternates = success.getAlternates();
-        backend = success.getBackend();
-        maxMessages = success.getMaxMessages();
-        // We are ignoring the DataTree, it is not serializable anyway
-    }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-
-        out.writeObject(Serialization.serializedActorPath(backend));
-        out.writeInt(maxMessages);
-
-        out.writeInt(alternates.size());
-        for (ActorSelection b : alternates) {
-            out.writeObject(b.toSerializationFormat());
-        }
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-
-        backend = JavaSerializer.currentSystem().value().provider().resolveActorRef((String) in.readObject());
-        maxMessages = in.readInt();
-
-        final int alternatesSize = in.readInt();
-        alternates = new ArrayList<>(alternatesSize);
-        for (int i = 0; i < alternatesSize; ++i) {
-            alternates.add(ActorSelection.apply(ActorRef.noSender(), (String)in.readObject()));
-        }
-    }
-
-    @Override
-    protected ConnectClientSuccess createSuccess(final ClientIdentifier target, final long sequence) {
-        return new ConnectClientSuccess(target, sequence, backend, alternates, maxMessages, null);
-    }
-
-    @Override
-    protected ClientIdentifier readTarget(final DataInput in) throws IOException {
-        return ClientIdentifier.readFrom(in);
     }
 }
index 4e07b8ff75df1d04a1156e4ebe97eb24a9f871a5..2520aeefd4b4d1e639430cd9131dad98b5294800 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
 
@@ -16,7 +16,15 @@ import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifie
  * Request to create a new local history.
  */
 public final class CreateLocalHistoryRequest extends LocalHistoryRequest<CreateLocalHistoryRequest> {
-    @Serial
+    interface SerialForm extends LocalHistoryRequest.SerialForm<CreateLocalHistoryRequest> {
+        @Override
+        default CreateLocalHistoryRequest readExternal(final ObjectInput in, final LocalHistoryIdentifier target,
+                final long sequence, final ActorRef replyTo) {
+            return new CreateLocalHistoryRequest(target, sequence, replyTo);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public CreateLocalHistoryRequest(final LocalHistoryIdentifier target, final ActorRef replyTo) {
@@ -32,9 +40,8 @@ public final class CreateLocalHistoryRequest extends LocalHistoryRequest<CreateL
     }
 
     @Override
-    protected AbstractLocalHistoryRequestProxy<CreateLocalHistoryRequest> externalizableProxy(
-            final ABIVersion version) {
-        return new CreateLocalHistoryRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new CHR(this) : new CreateLocalHistoryRequestProxyV1(this);
     }
 
     @Override
index ff3d09844ee9ce0a32b636fb1090942e14435fe9..f5581e1414e89b7a2a43615e3712909d99f8095b 100644 (file)
@@ -7,18 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
-
 /**
  * Externalizable proxy for use with {@link CreateLocalHistoryRequest}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class CreateLocalHistoryRequestProxyV1 extends AbstractLocalHistoryRequestProxy<CreateLocalHistoryRequest> {
-    @Serial
+final class CreateLocalHistoryRequestProxyV1 extends AbstractLocalHistoryRequestProxy<CreateLocalHistoryRequest>
+        implements CreateLocalHistoryRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -31,10 +28,4 @@ final class CreateLocalHistoryRequestProxyV1 extends AbstractLocalHistoryRequest
     CreateLocalHistoryRequestProxyV1(final CreateLocalHistoryRequest request) {
         super(request);
     }
-
-    @Override
-    protected CreateLocalHistoryRequest createRequest(final LocalHistoryIdentifier target, final long sequence,
-            final ActorRef replyTo) {
-        return new CreateLocalHistoryRequest(target, sequence, replyTo);
-    }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/DHR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/DHR.java
new file mode 100644 (file)
index 0000000..ebd0f02
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link DestroyLocalHistoryRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class DHR implements DestroyLocalHistoryRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private DestroyLocalHistoryRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public DHR() {
+        // for Externalizable
+    }
+
+    DHR(final DestroyLocalHistoryRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public DestroyLocalHistoryRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final DestroyLocalHistoryRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
index 81c8dabf5cfeba908b5548803a1c76bff65a514c..a91eb6971c3c4d2f173122e0dfb03b294dfe443e 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.controller.cluster.access.commands;
 
 import com.google.common.collect.RangeSet;
 import com.google.common.primitives.UnsignedLong;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 
 /**
@@ -17,7 +16,7 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  * been retired.
  */
 public final class DeadHistoryException extends RequestException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public DeadHistoryException(final RangeSet<UnsignedLong> purgedHistories) {
index dadfb931108f73ab840afc3ca0b60cfe872e5143..0f259c1a947ba32d1b8bb1fe3f2dd02677e08357 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.controller.cluster.access.commands;
 import com.google.common.collect.ImmutableRangeSet;
 import com.google.common.collect.RangeSet;
 import com.google.common.primitives.UnsignedLong;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 
 /**
@@ -18,7 +17,7 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  * already been purged.
  */
 public final class DeadTransactionException extends RequestException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final RangeSet<UnsignedLong> purgedIdentifiers;
index 3c9a4b69456c489a860c25c82059d29b777c1134..e70bd53654884e6fc5ca4b59c225dc75e6963047 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
 
@@ -16,7 +16,15 @@ import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifie
  * Request to destroy a local history.
  */
 public final class DestroyLocalHistoryRequest extends LocalHistoryRequest<DestroyLocalHistoryRequest> {
-    @Serial
+    interface SerialForm extends LocalHistoryRequest.SerialForm<DestroyLocalHistoryRequest> {
+        @Override
+        default DestroyLocalHistoryRequest readExternal(final ObjectInput in, final LocalHistoryIdentifier target,
+                final long sequence, final ActorRef replyTo) {
+            return new DestroyLocalHistoryRequest(target, sequence, replyTo);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public DestroyLocalHistoryRequest(final LocalHistoryIdentifier target, final long sequence,
@@ -29,9 +37,8 @@ public final class DestroyLocalHistoryRequest extends LocalHistoryRequest<Destro
     }
 
     @Override
-    protected AbstractLocalHistoryRequestProxy<DestroyLocalHistoryRequest> externalizableProxy(
-            final ABIVersion version) {
-        return new DestroyLocalHistoryRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new DHR(this) : new DestroyLocalHistoryRequestProxyV1(this);
     }
 
     @Override
index d5eb96e9700d83efcee7a513b4e976314c3abf59..ad285ca8ac5494b3909198a16e0fed76de57ea6a 100644 (file)
@@ -7,18 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
-
 /**
  * Externalizable proxy for use with {@link DestroyLocalHistoryRequest}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class DestroyLocalHistoryRequestProxyV1 extends AbstractLocalHistoryRequestProxy<DestroyLocalHistoryRequest> {
-    @Serial
+final class DestroyLocalHistoryRequestProxyV1 extends AbstractLocalHistoryRequestProxy<DestroyLocalHistoryRequest>
+        implements DestroyLocalHistoryRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -31,10 +28,4 @@ final class DestroyLocalHistoryRequestProxyV1 extends AbstractLocalHistoryReques
     DestroyLocalHistoryRequestProxyV1(final DestroyLocalHistoryRequest request) {
         super(request);
     }
-
-    @Override
-    protected DestroyLocalHistoryRequest createRequest(final LocalHistoryIdentifier target, final long sequence,
-            final ActorRef replyTo) {
-        return new DestroyLocalHistoryRequest(target, sequence, replyTo);
-    }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ETR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ETR.java
new file mode 100644 (file)
index 0000000..26964e4
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link ExistsTransactionRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class ETR implements ExistsTransactionRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private ExistsTransactionRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public ETR() {
+        // for Externalizable
+    }
+
+    ETR(final ExistsTransactionRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public ExistsTransactionRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final ExistsTransactionRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ETS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ETS.java
new file mode 100644 (file)
index 0000000..8cfc5e2
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link ExistsTransactionSuccess}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class ETS implements ExistsTransactionSuccess.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private ExistsTransactionSuccess message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public ETS() {
+        // for Externalizable
+    }
+
+    ETS(final ExistsTransactionSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public ExistsTransactionSuccess message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final ExistsTransactionSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
index d5e619c7065e999b00d8a3c0e020c38a39d57da3..1d16186af0b9f522e0ed392413b67c443cc4b7ae 100644 (file)
@@ -8,7 +8,8 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
@@ -18,11 +19,20 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
  * A transaction request to query if a particular path exists in the current view of a particular transaction.
  */
 public final class ExistsTransactionRequest extends AbstractReadPathTransactionRequest<ExistsTransactionRequest> {
-    @Serial
+    interface SerialForm extends AbstractReadPathTransactionRequest.SerialForm<ExistsTransactionRequest> {
+        @Override
+        default ExistsTransactionRequest readExternal(final ObjectInput in, final TransactionIdentifier target,
+            final long sequence, final ActorRef replyTo, final boolean snapshotOnly, final YangInstanceIdentifier path)
+                throws IOException {
+            return new ExistsTransactionRequest(target, sequence, replyTo, path, snapshotOnly);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public ExistsTransactionRequest(final @NonNull TransactionIdentifier identifier, final long sequence,
-            final @NonNull  ActorRef replyTo, final @NonNull YangInstanceIdentifier path, final boolean snapshotOnly) {
+            final @NonNull ActorRef replyTo, final @NonNull YangInstanceIdentifier path, final boolean snapshotOnly) {
         super(identifier, sequence, replyTo, path, snapshotOnly);
     }
 
@@ -36,7 +46,7 @@ public final class ExistsTransactionRequest extends AbstractReadPathTransactionR
     }
 
     @Override
-    protected ExistsTransactionRequestProxyV1 externalizableProxy(final ABIVersion version) {
-        return new ExistsTransactionRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new ETR(this) : new ExistsTransactionRequestProxyV1(this);
     }
 }
index a899da944cae30cdc8303fb41022cc6ea6d70f6e..9e048e27dc67b0f18c3c7d250dfb4f8a398be350 100644 (file)
@@ -7,20 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-
 /**
  * Externalizable proxy for use with {@link ExistsTransactionRequest}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class ExistsTransactionRequestProxyV1 extends
-        AbstractReadPathTransactionRequestProxyV1<ExistsTransactionRequest> {
-    @Serial
+final class ExistsTransactionRequestProxyV1 extends AbstractReadPathTransactionRequestProxyV1<ExistsTransactionRequest>
+        implements ExistsTransactionRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -33,10 +28,4 @@ final class ExistsTransactionRequestProxyV1 extends
     ExistsTransactionRequestProxyV1(final ExistsTransactionRequest request) {
         super(request);
     }
-
-    @Override
-    ExistsTransactionRequest createReadPathRequest(final TransactionIdentifier target, final long sequence,
-            final ActorRef replyTo, final YangInstanceIdentifier path, final boolean snapshotOnly) {
-        return new ExistsTransactionRequest(target, sequence, replyTo, path, snapshotOnly);
-    }
 }
index 3110002e4fe91842c9f049f77466e7d900268d57..ca5377051a4d5db83b969500d57b4eb873d29542 100644 (file)
@@ -8,7 +8,9 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import com.google.common.base.MoreObjects.ToStringHelper;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -17,11 +19,29 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * {@link #getExists()}.
  */
 public final class ExistsTransactionSuccess extends TransactionSuccess<ExistsTransactionSuccess> {
-    @Serial
+    interface SerialForm extends TransactionSuccess.SerialForm<ExistsTransactionSuccess> {
+        @Override
+        default ExistsTransactionSuccess readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence) throws IOException {
+            return new ExistsTransactionSuccess(target, sequence, in.readBoolean());
+        }
+
+        @Override
+        default void writeExternal(final ObjectOutput out, final ExistsTransactionSuccess msg) throws IOException {
+            out.writeBoolean(msg.getExists());
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final boolean exists;
 
+    private ExistsTransactionSuccess(final ExistsTransactionSuccess success, final ABIVersion version) {
+        super(success, version);
+        exists = success.exists;
+    }
+
     public ExistsTransactionSuccess(final TransactionIdentifier target, final long sequence, final boolean exists) {
         super(target, sequence);
         this.exists = exists;
@@ -32,13 +52,13 @@ public final class ExistsTransactionSuccess extends TransactionSuccess<ExistsTra
     }
 
     @Override
-    protected ExistsTransactionSuccessProxyV1 externalizableProxy(final ABIVersion version) {
-        return new ExistsTransactionSuccessProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new ETS(this) : new ExistsTransactionSuccessProxyV1(this);
     }
 
     @Override
     protected ExistsTransactionSuccess cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new ExistsTransactionSuccess(this, version);
     }
 
     @Override
index ed66fb2d3d21db7e96bf1f0a41663d21d904507a..96d1843bdd444f3783c4d287259ad91ebcbe8d6e 100644 (file)
@@ -7,24 +7,17 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link ExistsTransactionSuccess}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class ExistsTransactionSuccessProxyV1 extends AbstractTransactionSuccessProxy<ExistsTransactionSuccess> {
-    @Serial
+final class ExistsTransactionSuccessProxyV1 extends AbstractTransactionSuccessProxy<ExistsTransactionSuccess>
+        implements ExistsTransactionSuccess.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private boolean exists;
-
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
     // be able to create instances via reflection.
     @SuppressWarnings("checkstyle:RedundantModifier")
@@ -34,23 +27,5 @@ final class ExistsTransactionSuccessProxyV1 extends AbstractTransactionSuccessPr
 
     ExistsTransactionSuccessProxyV1(final ExistsTransactionSuccess request) {
         super(request);
-        exists = request.getExists();
-    }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeBoolean(exists);
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        exists = in.readBoolean();
-    }
-
-    @Override
-    protected ExistsTransactionSuccess createSuccess(final TransactionIdentifier target, final long sequence) {
-        return new ExistsTransactionSuccess(target, sequence, exists);
     }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/HF.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/HF.java
new file mode 100644 (file)
index 0000000..68e9b09
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link LocalHistoryFailure}. It implements the Chlorine SR2 serialization format.
+ */
+final class HF implements LocalHistoryFailure.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private LocalHistoryFailure message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public HF() {
+        // for Externalizable
+    }
+
+    HF(final LocalHistoryFailure message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public LocalHistoryFailure message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final LocalHistoryFailure message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/HS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/HS.java
new file mode 100644 (file)
index 0000000..4ab0ff5
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link LocalHistorySuccess}. It implements the Chlorine SR2 serialization format.
+ */
+final class HS implements LocalHistorySuccess.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private LocalHistorySuccess message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public HS() {
+        // for Externalizable
+    }
+
+    HS(final LocalHistorySuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public LocalHistorySuccess message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final LocalHistorySuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ITSR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ITSR.java
new file mode 100644 (file)
index 0000000..ef76f5e
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link IncrementTransactionSequenceRequest}. It implements the Chlorine SR2
+ * serialization format.
+ */
+final class ITSR implements IncrementTransactionSequenceRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private IncrementTransactionSequenceRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public ITSR() {
+        // for Externalizable
+    }
+
+    ITSR(final IncrementTransactionSequenceRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public IncrementTransactionSequenceRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final IncrementTransactionSequenceRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ITSS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/ITSS.java
new file mode 100644 (file)
index 0000000..178992a
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link IncrementTransactionSequenceSuccess}. It implements the Chlorine SR2
+ * serialization format.
+ */
+final class ITSS implements IncrementTransactionSequenceSuccess.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private IncrementTransactionSequenceSuccess message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public ITSS() {
+        // for Externalizable
+    }
+
+    ITSS(final IncrementTransactionSequenceSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public IncrementTransactionSequenceSuccess message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final IncrementTransactionSequenceSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
index 5e85316c413d75b9040355c4d10b65b334fab496..55a435beeec09d1a280940b8f9a45cd05741ad3d 100644 (file)
@@ -7,30 +7,55 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 import akka.actor.ActorRef;
-import com.google.common.base.Preconditions;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
+import org.opendaylight.yangtools.concepts.WritableObjects;
 
 /**
  * A blank transaction request. This is used to provide backfill requests in converted retransmit scenarios, such as
  * when a initial request to a transaction (such as a {@link ReadTransactionRequest}) is satisfied by the backend
  * before the need to replay the transaction to a different remote backend.
- *
- * @author Robert Varga
  */
 public final class IncrementTransactionSequenceRequest extends
         AbstractReadTransactionRequest<IncrementTransactionSequenceRequest> {
-    @Serial
+    interface SerialForm extends AbstractReadTransactionRequest.SerialForm<IncrementTransactionSequenceRequest> {
+        @Override
+        default void writeExternal(final ObjectOutput out, final IncrementTransactionSequenceRequest msg)
+                throws IOException {
+            AbstractReadTransactionRequest.SerialForm.super.writeExternal(out, msg);
+            WritableObjects.writeLong(out, msg.getIncrement());
+        }
+
+        @Override
+        default IncrementTransactionSequenceRequest readExternal(final ObjectInput in,
+                final TransactionIdentifier target, final long sequence, final ActorRef replyTo,
+                final boolean snapshotOnly) throws IOException {
+            return new IncrementTransactionSequenceRequest(target, sequence, replyTo, snapshotOnly,
+                WritableObjects.readLong(in));
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final long increment;
 
+    public IncrementTransactionSequenceRequest(final IncrementTransactionSequenceRequest request,
+            final ABIVersion version) {
+        super(request, version);
+        increment = request.increment;
+    }
+
     public IncrementTransactionSequenceRequest(final TransactionIdentifier identifier, final long sequence,
             final ActorRef replyTo, final boolean snapshotOnly, final long increment) {
         super(identifier, sequence, replyTo, snapshotOnly);
-        Preconditions.checkArgument(increment >= 0);
+        checkArgument(increment >= 0, "Unexpected increment %s", increment);
         this.increment = increment;
     }
 
@@ -44,12 +69,12 @@ public final class IncrementTransactionSequenceRequest extends
     }
 
     @Override
-    protected IncrementTransactionSequenceRequestProxyV1 externalizableProxy(final ABIVersion version) {
-        return new IncrementTransactionSequenceRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new ITSR(this) : new IncrementTransactionSequenceRequestProxyV1(this);
     }
 
     @Override
     protected IncrementTransactionSequenceRequest cloneAsVersion(final ABIVersion targetVersion) {
-        return this;
+        return new IncrementTransactionSequenceRequest(this, targetVersion);
     }
 }
index c400b3c75062d8ec1d5aca7e173b4ee5f3dd2798..bedae8e5e81c4ae50d1dd3b845cffa478b7ba80e 100644 (file)
@@ -7,21 +7,12 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-import org.opendaylight.yangtools.concepts.WritableObjects;
-
 final class IncrementTransactionSequenceRequestProxyV1
-        extends AbstractReadTransactionRequestProxyV1<IncrementTransactionSequenceRequest> {
-    @Serial
+        extends AbstractReadTransactionRequestProxyV1<IncrementTransactionSequenceRequest>
+        implements IncrementTransactionSequenceRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = -7345885599575376005L;
 
-    private long increment;
-
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
     // be able to create instances via reflection.
     @SuppressWarnings("checkstyle:RedundantModifier")
@@ -31,24 +22,5 @@ final class IncrementTransactionSequenceRequestProxyV1
 
     IncrementTransactionSequenceRequestProxyV1(final IncrementTransactionSequenceRequest request) {
         super(request);
-        increment = request.getIncrement();
-    }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        WritableObjects.writeLong(out, increment);
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws ClassNotFoundException, IOException {
-        super.readExternal(in);
-        increment = WritableObjects.readLong(in);
-    }
-
-    @Override
-    IncrementTransactionSequenceRequest createReadRequest(final TransactionIdentifier target, final long sequence,
-            final ActorRef replyToActor, final boolean snapshotOnly) {
-        return new IncrementTransactionSequenceRequest(target, sequence, replyToActor, snapshotOnly, increment);
     }
 }
index a147545dd9a84bab87adf68d045c67cfeed9726d..e462edc4d80acca0a604c3b8ae3c25bd86c79e66 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -15,20 +15,33 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * Successful reply to an {@link IncrementTransactionSequenceRequest}.
  */
 public final class IncrementTransactionSequenceSuccess extends TransactionSuccess<IncrementTransactionSequenceSuccess> {
-    @Serial
+    interface SerialForm extends TransactionSuccess.SerialForm<IncrementTransactionSequenceSuccess> {
+        @Override
+        default IncrementTransactionSequenceSuccess readExternal(final ObjectInput it,
+                final TransactionIdentifier target, final long sequence) {
+            return new IncrementTransactionSequenceSuccess(target, sequence);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private IncrementTransactionSequenceSuccess(final IncrementTransactionSequenceSuccess success,
+            final ABIVersion version) {
+        super(success, version);
+    }
+
     public IncrementTransactionSequenceSuccess(final TransactionIdentifier target, final long sequence) {
         super(target, sequence);
     }
 
     @Override
-    protected IncrementTransactionSequenceSuccessProxyV1 externalizableProxy(final ABIVersion version) {
-        return new IncrementTransactionSequenceSuccessProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new ITSS(this) : new IncrementTransactionSequenceSuccessProxyV1(this);
     }
 
     @Override
     protected IncrementTransactionSequenceSuccess cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new IncrementTransactionSequenceSuccess(this, version);
     }
 }
index 58c017bb9499b1ab14d65857d2f04b43940e917d..0acb9b442906b953084a85cf01db0fee203ecff1 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link IncrementTransactionSequenceSuccess}. It implements the initial (Boron)
  * serialization format.
@@ -17,8 +14,9 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * @author Robert Varga
  */
 final class IncrementTransactionSequenceSuccessProxyV1
-        extends AbstractTransactionSuccessProxy<IncrementTransactionSequenceSuccess> {
-    @Serial
+        extends AbstractTransactionSuccessProxy<IncrementTransactionSequenceSuccess>
+        implements IncrementTransactionSequenceSuccess.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -31,10 +29,4 @@ final class IncrementTransactionSequenceSuccessProxyV1
     IncrementTransactionSequenceSuccessProxyV1(final IncrementTransactionSequenceSuccess request) {
         super(request);
     }
-
-    @Override
-    protected IncrementTransactionSequenceSuccess createSuccess(final TransactionIdentifier target,
-            final long sequence) {
-        return new IncrementTransactionSequenceSuccess(target, sequence);
-    }
 }
index 60aba50d360a26df3f6d34de392573767bb3b4d0..6f2eda8ba6b9d501c06854e542d1a180e8acc5d0 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.DataInput;
+import java.io.IOException;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
@@ -17,20 +18,37 @@ import org.opendaylight.controller.cluster.access.concepts.RequestFailure;
  * Generic {@link RequestFailure} involving a {@link LocalHistoryRequest}.
  */
 public final class LocalHistoryFailure extends RequestFailure<LocalHistoryIdentifier, LocalHistoryFailure> {
-    @Serial
+    interface SerialForm extends RequestFailure.SerialForm<LocalHistoryIdentifier, LocalHistoryFailure> {
+        @Override
+        default LocalHistoryIdentifier readTarget(final DataInput in) throws IOException {
+            return LocalHistoryIdentifier.readFrom(in);
+        }
+
+        @Override
+        default LocalHistoryFailure createFailure(final LocalHistoryIdentifier target, final long sequence,
+                final RequestException cause) {
+            return new LocalHistoryFailure(target, sequence, cause);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private LocalHistoryFailure(final LocalHistoryFailure failure, final ABIVersion version) {
+        super(failure, version);
+    }
+
     LocalHistoryFailure(final LocalHistoryIdentifier target, final long sequence, final RequestException cause) {
         super(target, sequence, cause);
     }
 
     @Override
-    protected LocalHistoryFailure cloneAsVersion(final ABIVersion version) {
-        return this;
+    protected LocalHistoryFailure cloneAsVersion(final ABIVersion targetVersion) {
+        return new LocalHistoryFailure(this, targetVersion);
     }
 
     @Override
-    protected LocalHistoryFailureProxyV1 externalizableProxy(final ABIVersion version) {
-        return new LocalHistoryFailureProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new HF(this) : new LocalHistoryFailureProxyV1(this);
     }
 }
index 11ebfa55fbf2f9019c1928eb61aa660b313d257d..f044936b7a2d4b8f8881dc929d8e98d498ab635a 100644 (file)
@@ -7,12 +7,8 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.DataInput;
-import java.io.IOException;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.AbstractRequestFailureProxy;
 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
-import org.opendaylight.controller.cluster.access.concepts.RequestException;
 
 /**
  * Externalizable proxy for use with {@link LocalHistoryFailure}. It implements the initial (Boron) serialization
@@ -20,9 +16,10 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  *
  * @author Robert Varga
  */
-final class LocalHistoryFailureProxyV1 extends
-        AbstractRequestFailureProxy<LocalHistoryIdentifier, LocalHistoryFailure> {
-    @Serial
+final class LocalHistoryFailureProxyV1
+        extends AbstractRequestFailureProxy<LocalHistoryIdentifier, LocalHistoryFailure>
+        implements LocalHistoryFailure.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -35,15 +32,4 @@ final class LocalHistoryFailureProxyV1 extends
     LocalHistoryFailureProxyV1(final LocalHistoryFailure failure) {
         super(failure);
     }
-
-    @Override
-    protected LocalHistoryFailure createFailure(final LocalHistoryIdentifier target, final long sequence,
-            final RequestException cause) {
-        return new LocalHistoryFailure(target, sequence, cause);
-    }
-
-    @Override
-    protected LocalHistoryIdentifier readTarget(final DataInput in) throws IOException {
-        return LocalHistoryIdentifier.readFrom(in);
-    }
 }
index 0fe4c2d6181f56e2f4ea5f2fb1f427745caac49c..c304384fd8b7089729c03ba8108aee1ba86c67f3 100644 (file)
@@ -9,7 +9,8 @@ package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
 import com.google.common.base.Preconditions;
-import java.io.Serial;
+import java.io.DataInput;
+import java.io.IOException;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
 import org.opendaylight.controller.cluster.access.concepts.Request;
@@ -22,7 +23,14 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  * @param <T> Message type
  */
 public abstract class LocalHistoryRequest<T extends LocalHistoryRequest<T>> extends Request<LocalHistoryIdentifier, T> {
-    @Serial
+    interface SerialForm<T extends LocalHistoryRequest<T>> extends Request.SerialForm<LocalHistoryIdentifier, T> {
+        @Override
+        default LocalHistoryIdentifier readTarget(final DataInput in) throws IOException {
+            return LocalHistoryIdentifier.readFrom(in);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     LocalHistoryRequest(final LocalHistoryIdentifier target, final long sequence, final ActorRef replyTo) {
@@ -40,5 +48,5 @@ public abstract class LocalHistoryRequest<T extends LocalHistoryRequest<T>> exte
     }
 
     @Override
-    protected abstract AbstractLocalHistoryRequestProxy<T> externalizableProxy(ABIVersion version);
+    protected abstract SerialForm<T> externalizableProxy(ABIVersion version);
 }
index 99c1de1d619ecd7126822db58f863cc5ab2d0d68..a36994937b1aafd443d7fde204ac462a3a5fffff 100644 (file)
@@ -7,9 +7,10 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.DataInput;
+import java.io.IOException;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
-import org.opendaylight.controller.cluster.access.concepts.AbstractSuccessProxy;
 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
 import org.opendaylight.controller.cluster.access.concepts.RequestSuccess;
 
@@ -17,25 +18,37 @@ import org.opendaylight.controller.cluster.access.concepts.RequestSuccess;
  * Success class for {@link RequestSuccess}es involving a specific local history.
  */
 public final class LocalHistorySuccess extends RequestSuccess<LocalHistoryIdentifier, LocalHistorySuccess> {
-    @Serial
-    private static final long serialVersionUID = 1L;
+    interface SerialForm extends RequestSuccess.SerialForm<LocalHistoryIdentifier, LocalHistorySuccess> {
+        @Override
+        default LocalHistoryIdentifier readTarget(final DataInput in) throws IOException {
+            return LocalHistoryIdentifier.readFrom(in);
+        }
 
-    public LocalHistorySuccess(final LocalHistoryIdentifier target, final long sequence) {
-        super(target, sequence);
+        @Override
+        default LocalHistorySuccess readExternal(final ObjectInput it, final LocalHistoryIdentifier target,
+                final long sequence) {
+            return new LocalHistorySuccess(target, sequence);
+        }
     }
 
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
     private LocalHistorySuccess(final LocalHistorySuccess success, final ABIVersion version) {
         super(success, version);
     }
 
+    public LocalHistorySuccess(final LocalHistoryIdentifier target, final long sequence) {
+        super(target, sequence);
+    }
+
     @Override
     protected LocalHistorySuccess cloneAsVersion(final ABIVersion version) {
         return new LocalHistorySuccess(this, version);
     }
 
     @Override
-    protected AbstractSuccessProxy<LocalHistoryIdentifier, LocalHistorySuccess> externalizableProxy(
-            final ABIVersion version) {
-        return new LocalHistorySuccessProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new HS(this) : new LocalHistorySuccessProxyV1(this);
     }
 }
index 18ea0bd9de0ed48e81d0c6c8e2af477c07ff7134..6f05617613ee7d5719f1dc595731449f4a0e2f1b 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.DataInput;
-import java.io.IOException;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.AbstractSuccessProxy;
 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
 
@@ -18,8 +15,9 @@ import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifie
  *
  * @author Robert Varga
  */
-final class LocalHistorySuccessProxyV1 extends AbstractSuccessProxy<LocalHistoryIdentifier, LocalHistorySuccess> {
-    @Serial
+final class LocalHistorySuccessProxyV1 extends AbstractSuccessProxy<LocalHistoryIdentifier, LocalHistorySuccess>
+        implements LocalHistorySuccess.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -32,14 +30,4 @@ final class LocalHistorySuccessProxyV1 extends AbstractSuccessProxy<LocalHistory
     LocalHistorySuccessProxyV1(final LocalHistorySuccess success) {
         super(success);
     }
-
-    @Override
-    protected LocalHistoryIdentifier readTarget(final DataInput in) throws IOException {
-        return LocalHistoryIdentifier.readFrom(in);
-    }
-
-    @Override
-    protected LocalHistorySuccess createSuccess(final LocalHistoryIdentifier target, final long sequence) {
-        return new LocalHistorySuccess(target, sequence);
-    }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/MTR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/MTR.java
new file mode 100644 (file)
index 0000000..a0c5acf
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link ModifyTransactionRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class MTR implements ModifyTransactionRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private ModifyTransactionRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public MTR() {
+        // for Externalizable
+    }
+
+    MTR(final ModifyTransactionRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public ModifyTransactionRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final ModifyTransactionRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/MTS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/MTS.java
new file mode 100644 (file)
index 0000000..3a46a8a
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link ModifyTransactionSuccess}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class MTS implements ModifyTransactionSuccess.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private ModifyTransactionSuccess message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public MTS() {
+        // for Externalizable
+    }
+
+    MTS(final ModifyTransactionSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public ModifyTransactionSuccess message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final ModifyTransactionSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
index 6f42d0ce56e75287abbd8f743a773503c8360f47..efa8a77f3d400bff643efc40fc432af6f0334ad3 100644 (file)
@@ -11,12 +11,17 @@ import akka.actor.ActorRef;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableList;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+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
@@ -24,7 +29,49 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  */
 public final class ModifyTransactionRequest extends TransactionRequest<ModifyTransactionRequest>
         implements SliceableMessage {
-    @Serial
+    interface SerialForm extends TransactionRequest.SerialForm<ModifyTransactionRequest> {
+
+
+        @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<TransactionModification> 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 "
@@ -33,6 +80,12 @@ public final class ModifyTransactionRequest extends TransactionRequest<ModifyTra
     private final List<TransactionModification> 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<TransactionModification> modifications, final PersistenceProtocol protocol) {
         super(target, sequence, replyTo);
@@ -55,12 +108,12 @@ public final class ModifyTransactionRequest extends TransactionRequest<ModifyTra
     }
 
     @Override
-    protected ModifyTransactionRequestProxyV1 externalizableProxy(final ABIVersion version) {
-        return new ModifyTransactionRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new MTR(this) : new ModifyTransactionRequestProxyV1(this);
     }
 
     @Override
     protected ModifyTransactionRequest cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new ModifyTransactionRequest(this, version);
     }
 }
index 369aa1515bb7fa9ac488c7c92c436f3529db599e..91d8a27c6b2ce530e85e28e5496a9717f96c49cd 100644 (file)
@@ -7,37 +7,17 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import static java.util.Objects.requireNonNull;
-
-import akka.actor.ActorRef;
-import com.google.common.collect.ImmutableList;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
-import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataOutput;
-import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion;
-import org.opendaylight.yangtools.yang.data.impl.schema.ReusableImmutableNormalizedNodeStreamWriter;
-
 /**
  * Externalizable proxy for use with {@link ExistsTransactionRequest}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class ModifyTransactionRequestProxyV1 extends AbstractTransactionRequestProxy<ModifyTransactionRequest> {
-    @Serial
+final class ModifyTransactionRequestProxyV1 extends AbstractTransactionRequestProxy<ModifyTransactionRequest>
+        implements ModifyTransactionRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private List<TransactionModification> modifications;
-    private Optional<PersistenceProtocol> protocol;
-    private transient NormalizedNodeStreamVersion streamVersion;
-
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
     // be able to create instances via reflection.
     @SuppressWarnings("checkstyle:RedundantModifier")
@@ -47,49 +27,5 @@ final class ModifyTransactionRequestProxyV1 extends AbstractTransactionRequestPr
 
     ModifyTransactionRequestProxyV1(final ModifyTransactionRequest request) {
         super(request);
-        modifications = requireNonNull(request.getModifications());
-        protocol = request.getPersistenceProtocol();
-        streamVersion = request.getVersion().getStreamVersion();
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-
-        protocol = Optional.ofNullable(PersistenceProtocol.readFrom(in));
-
-        final int size = in.readInt();
-        if (size != 0) {
-            modifications = new ArrayList<>(size);
-            final NormalizedNodeDataInput nnin = NormalizedNodeDataInput.newDataInput(in);
-            final ReusableImmutableNormalizedNodeStreamWriter writer =
-                    ReusableImmutableNormalizedNodeStreamWriter.create();
-            for (int i = 0; i < size; ++i) {
-                modifications.add(TransactionModification.readFrom(nnin, writer));
-            }
-        } else {
-            modifications = ImmutableList.of();
-        }
-    }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-
-        out.writeByte(PersistenceProtocol.byteValue(protocol.orElse(null)));
-        out.writeInt(modifications.size());
-        if (!modifications.isEmpty()) {
-            try (NormalizedNodeDataOutput nnout = streamVersion.newDataOutput(out)) {
-                for (TransactionModification op : modifications) {
-                    op.writeTo(nnout);
-                }
-            }
-        }
-    }
-
-    @Override
-    protected ModifyTransactionRequest createRequest(final TransactionIdentifier target, final long sequence,
-            final ActorRef replyTo) {
-        return new ModifyTransactionRequest(target, sequence, replyTo, modifications, protocol.orElse(null));
     }
 }
index 42f22439b1d4df92bea3b0c03a84b85d74fce613..c1620a86664f2fe6e68e02bcbc975e304909790f 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -15,7 +16,15 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * Response to a {@link ModifyTransactionRequest} which does not have a {@link PersistenceProtocol}.
  */
 public final class ModifyTransactionSuccess extends TransactionSuccess<ModifyTransactionSuccess> {
-    @Serial
+    interface SerialForm extends TransactionSuccess.SerialForm<ModifyTransactionSuccess> {
+        @Override
+        default ModifyTransactionSuccess readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence) throws IOException {
+            return new ModifyTransactionSuccess(target, sequence);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public ModifyTransactionSuccess(final TransactionIdentifier identifier, final long sequence) {
@@ -27,8 +36,8 @@ public final class ModifyTransactionSuccess extends TransactionSuccess<ModifyTra
     }
 
     @Override
-    protected AbstractTransactionSuccessProxy<ModifyTransactionSuccess> externalizableProxy(final ABIVersion version) {
-        return new ModifyTransactionSuccessProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new MTS(this) : new ModifyTransactionSuccessProxyV1(this);
     }
 
     @Override
index 4ead55671cd32d0fb05c2a1cc1912f8ae62be1fe..8738f997479bf0f9f8493ce26956830cce49f420 100644 (file)
@@ -7,17 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link ModifyTransactionSuccess}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class ModifyTransactionSuccessProxyV1 extends AbstractTransactionSuccessProxy<ModifyTransactionSuccess> {
-    @Serial
+final class ModifyTransactionSuccessProxyV1 extends AbstractTransactionSuccessProxy<ModifyTransactionSuccess>
+        implements ModifyTransactionSuccess.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -30,9 +28,4 @@ final class ModifyTransactionSuccessProxyV1 extends AbstractTransactionSuccessPr
     ModifyTransactionSuccessProxyV1(final ModifyTransactionSuccess success) {
         super(success);
     }
-
-    @Override
-    protected ModifyTransactionSuccess createSuccess(final TransactionIdentifier target, final long sequence) {
-        return new ModifyTransactionSuccess(target, sequence);
-    }
 }
index 881953c01b5dce9b3f9f9232765ca0fa58f1127d..c4353c37fd6bf74a74e4186b9968bac5b6972cc7 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 
 /**
@@ -16,7 +15,7 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  * means that the backend processing has moved and the frontend needs to run rediscovery and retry the request.
  */
 public final class NotLeaderException extends RequestException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public NotLeaderException(final ActorRef me) {
index 7ee5a2f306f1644e75954a6c44196241c97f8a54..0c908078ebbee07789f35dbeb335179c51837518 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 
 /**
@@ -15,7 +14,7 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  * next expected sequence for the target. This is a hard error, as it indicates a Request is missing in the stream.
  */
 public final class OutOfOrderRequestException extends RequestException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public OutOfOrderRequestException(final long expectedRequest) {
index 61715bc42a43b18e478d5075e41924dc7474b87f..b39e09a6a45ac570148b824d67da02c7f984f31c 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 
 /**
@@ -16,7 +15,7 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  * the backend is not the leader and it transitions to being a leader with old stream messages still being present.
  */
 public final class OutOfSequenceEnvelopeException extends RequestException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public OutOfSequenceEnvelopeException(final long expectedEnvelope) {
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/PHR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/PHR.java
new file mode 100644 (file)
index 0000000..e2b3959
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link PurgeLocalHistoryRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class PHR implements PurgeLocalHistoryRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private PurgeLocalHistoryRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public PHR() {
+        // for Externalizable
+    }
+
+    PHR(final PurgeLocalHistoryRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public PurgeLocalHistoryRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final PurgeLocalHistoryRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
index 50f16570264a4bd2aa12505f675e94b7e8c680e6..81c632f715a3703b68e87160e3bbcaeb67d6cdca 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
 
@@ -17,7 +17,15 @@ import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifie
  * {@link DestroyLocalHistoryRequest} and indicates it has removed all state attached to a particular local history.
  */
 public final class PurgeLocalHistoryRequest extends LocalHistoryRequest<PurgeLocalHistoryRequest> {
-    @Serial
+    interface SerialForm extends LocalHistoryRequest.SerialForm<PurgeLocalHistoryRequest> {
+        @Override
+        default PurgeLocalHistoryRequest readExternal(final ObjectInput in, final LocalHistoryIdentifier target,
+                final long sequence, final ActorRef replyTo) {
+            return new PurgeLocalHistoryRequest(target, sequence, replyTo);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public PurgeLocalHistoryRequest(final LocalHistoryIdentifier target, final long sequence, final ActorRef replyTo) {
@@ -29,8 +37,8 @@ public final class PurgeLocalHistoryRequest extends LocalHistoryRequest<PurgeLoc
     }
 
     @Override
-    protected AbstractLocalHistoryRequestProxy<PurgeLocalHistoryRequest> externalizableProxy(final ABIVersion version) {
-        return new PurgeLocalHistoryRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new PHR(this) : new PurgeLocalHistoryRequestProxyV1(this);
     }
 
     @Override
index ff7f4ee4e2f4ab4a618ee74c606c8dbe09762eae..35571fb11d265291de7148c5a74b2d0c974e4f68 100644 (file)
@@ -7,18 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
-
 /**
  * Externalizable proxy for use with {@link PurgeLocalHistoryRequest}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class PurgeLocalHistoryRequestProxyV1 extends AbstractLocalHistoryRequestProxy<PurgeLocalHistoryRequest> {
-    @Serial
+final class PurgeLocalHistoryRequestProxyV1 extends AbstractLocalHistoryRequestProxy<PurgeLocalHistoryRequest>
+        implements PurgeLocalHistoryRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -31,10 +28,4 @@ final class PurgeLocalHistoryRequestProxyV1 extends AbstractLocalHistoryRequestP
     PurgeLocalHistoryRequestProxyV1(final PurgeLocalHistoryRequest request) {
         super(request);
     }
-
-    @Override
-    protected PurgeLocalHistoryRequest createRequest(final LocalHistoryIdentifier target, final long sequence,
-            final ActorRef replyTo) {
-        return new PurgeLocalHistoryRequest(target, sequence, replyTo);
-    }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/RTR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/RTR.java
new file mode 100644 (file)
index 0000000..e342c18
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link ReadTransactionRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class RTR implements ReadTransactionRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private ReadTransactionRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public RTR() {
+        // for Externalizable
+    }
+
+    RTR(final ReadTransactionRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public ReadTransactionRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final ReadTransactionRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/RTS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/RTS.java
new file mode 100644 (file)
index 0000000..bcf09f8
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link ReadTransactionSuccess}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class RTS implements ReadTransactionSuccess.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private ReadTransactionSuccess message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public RTS() {
+        // for Externalizable
+    }
+
+    RTS(final ReadTransactionSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public ReadTransactionSuccess message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final ReadTransactionSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
index c5a550ce05abbc1f3e0ab6cb8f1b2180c2c780d1..00ae65b469e4b92f74eefbfa6cc90858b4f5bb9c 100644 (file)
@@ -8,7 +8,8 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
@@ -18,7 +19,16 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
  * A transaction request to read a particular path exists in the current view of a particular transaction.
  */
 public final class ReadTransactionRequest extends AbstractReadPathTransactionRequest<ReadTransactionRequest> {
-    @Serial
+    interface SerialForm extends AbstractReadPathTransactionRequest.SerialForm<ReadTransactionRequest> {
+        @Override
+        default ReadTransactionRequest readExternal(final ObjectInput in, final TransactionIdentifier target,
+            final long sequence, final ActorRef replyTo, final boolean snapshotOnly, final YangInstanceIdentifier path)
+                throws IOException {
+            return new ReadTransactionRequest(target, sequence, replyTo, path, snapshotOnly);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public ReadTransactionRequest(final @NonNull TransactionIdentifier identifier, final long sequence,
@@ -36,7 +46,7 @@ public final class ReadTransactionRequest extends AbstractReadPathTransactionReq
     }
 
     @Override
-    protected ReadTransactionRequestProxyV1 externalizableProxy(final ABIVersion version) {
-        return new ReadTransactionRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new RTR(this) : new ReadTransactionRequestProxyV1(this);
     }
 }
index 20d1d308f42bfee4da38d90e99d225228e6e7f14..e27869547b05d973d0b5e85cf344abbf95264ce4 100644 (file)
@@ -7,19 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-
 /**
  * Externalizable proxy for use with {@link ReadTransactionRequest}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class ReadTransactionRequestProxyV1 extends AbstractReadPathTransactionRequestProxyV1<ReadTransactionRequest> {
-    @Serial
+final class ReadTransactionRequestProxyV1 extends AbstractReadPathTransactionRequestProxyV1<ReadTransactionRequest>
+        implements ReadTransactionRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -32,10 +28,4 @@ final class ReadTransactionRequestProxyV1 extends AbstractReadPathTransactionReq
     ReadTransactionRequestProxyV1(final ReadTransactionRequest request) {
         super(request);
     }
-
-    @Override
-    ReadTransactionRequest createReadPathRequest(final TransactionIdentifier target, final long sequence,
-            final ActorRef replyTo, final YangInstanceIdentifier path, final boolean snapshotOnly) {
-        return new ReadTransactionRequest(target, sequence, replyTo, path, snapshotOnly);
-    }
 }
index 1e473d2b30435ba8bd1a9a2e05ba8d14518972a9..b65473aa381516f7fafc3d53af00113ea239d161 100644 (file)
@@ -10,12 +10,15 @@ package org.opendaylight.controller.cluster.access.commands;
 import static java.util.Objects.requireNonNull;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 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.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
 
 /**
  * Successful reply to an {@link ReadTransactionRequest}. It indicates presence of requested data via
@@ -23,12 +26,46 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
  */
 public final class ReadTransactionSuccess extends TransactionSuccess<ReadTransactionSuccess>
         implements SliceableMessage {
-    @Serial
+    interface SerialForm extends TransactionSuccess.SerialForm<ReadTransactionSuccess> {
+        @Override
+        default ReadTransactionSuccess readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence) throws IOException {
+            final Optional<NormalizedNode> data;
+            if (in.readBoolean()) {
+                data = Optional.of(NormalizedNodeDataInput.newDataInput(in).readNormalizedNode());
+            } else {
+                data = Optional.empty();
+            }
+            return new ReadTransactionSuccess(target, sequence, data);
+        }
+
+        @Override
+        default void writeExternal(final ObjectOutput out, final ReadTransactionSuccess msg) throws IOException {
+            TransactionSuccess.SerialForm.super.writeExternal(out, msg);
+
+            final var data = msg.getData();
+            if (data.isPresent()) {
+                out.writeBoolean(true);
+                try (var nnout = msg.getVersion().getStreamVersion().newDataOutput(out)) {
+                    nnout.writeNormalizedNode(data.orElseThrow());
+                }
+            } else {
+                out.writeBoolean(false);
+            }
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "interface-based best effort")
     private final Optional<NormalizedNode> data;
 
+    private ReadTransactionSuccess(final ReadTransactionSuccess request, final ABIVersion version) {
+        super(request, version);
+        data = request.data;
+    }
+
     public ReadTransactionSuccess(final TransactionIdentifier identifier, final long sequence,
             final Optional<NormalizedNode> data) {
         super(identifier, sequence);
@@ -40,12 +77,12 @@ public final class ReadTransactionSuccess extends TransactionSuccess<ReadTransac
     }
 
     @Override
-    protected AbstractTransactionSuccessProxy<ReadTransactionSuccess> externalizableProxy(final ABIVersion version) {
-        return new ReadTransactionSuccessProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new RTS(this) : new ReadTransactionSuccessProxyV1(this);
     }
 
     @Override
     protected ReadTransactionSuccess cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new ReadTransactionSuccess(this, version);
     }
 }
index df462cf0c3abb942c37300895c262216802a3b20..9818ada0afd9555a2745c4ba686d351c6ac0ba3e 100644 (file)
@@ -7,30 +7,17 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import java.util.Optional;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
-import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataOutput;
-import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion;
-
 /**
  * Externalizable proxy for use with {@link ReadTransactionSuccess}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class ReadTransactionSuccessProxyV1 extends AbstractTransactionSuccessProxy<ReadTransactionSuccess> {
-    @Serial
+final class ReadTransactionSuccessProxyV1 extends AbstractTransactionSuccessProxy<ReadTransactionSuccess>
+        implements ReadTransactionSuccess.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private Optional<NormalizedNode> data;
-    private transient NormalizedNodeStreamVersion streamVersion;
-
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
     // be able to create instances via reflection.
     @SuppressWarnings("checkstyle:RedundantModifier")
@@ -40,37 +27,5 @@ final class ReadTransactionSuccessProxyV1 extends AbstractTransactionSuccessProx
 
     ReadTransactionSuccessProxyV1(final ReadTransactionSuccess request) {
         super(request);
-        data = request.getData();
-        streamVersion = request.getVersion().getStreamVersion();
-    }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-
-        if (data.isPresent()) {
-            out.writeBoolean(true);
-            try (NormalizedNodeDataOutput nnout = streamVersion.newDataOutput(out)) {
-                nnout.writeNormalizedNode(data.get());
-            }
-        } else {
-            out.writeBoolean(false);
-        }
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-
-        if (in.readBoolean()) {
-            data = Optional.of(NormalizedNodeDataInput.newDataInput(in).readNormalizedNode());
-        } else {
-            data = Optional.empty();
-        }
-    }
-
-    @Override
-    protected ReadTransactionSuccess createSuccess(final TransactionIdentifier target, final long sequence) {
-        return new ReadTransactionSuccess(target, sequence, data);
     }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/STR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/STR.java
new file mode 100644 (file)
index 0000000..aa529ea
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link SkipTransactionsRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class STR implements SkipTransactionsRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private SkipTransactionsRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public STR() {
+        // for Externalizable
+    }
+
+    STR(final SkipTransactionsRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public SkipTransactionsRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final SkipTransactionsRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/STS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/STS.java
new file mode 100644 (file)
index 0000000..c548a4f
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link SkipTransactionsResponse}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class STS implements SkipTransactionsResponse.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private SkipTransactionsResponse message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public STS() {
+        // for Externalizable
+    }
+
+    STS(final SkipTransactionsResponse message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public SkipTransactionsResponse message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final SkipTransactionsResponse message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
index 3b97bb98170c762a7a5d70bf1df0300f30b60510..54fdfc581a7d0b4c595b66853bc9be589c1dce2d 100644 (file)
@@ -11,12 +11,15 @@ import akka.actor.ActorRef;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableList;
 import com.google.common.primitives.UnsignedLong;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Collection;
 import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
+import org.opendaylight.yangtools.concepts.WritableObjects;
 
 /**
  * Request to skip a number of {@link TransactionIdentifier}s within a {code local history}. This request is essentially
@@ -28,7 +31,50 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * explicitly retired and are guaranteed to never be used by the frontend.
  */
 public final class SkipTransactionsRequest extends TransactionRequest<SkipTransactionsRequest> {
-    @Serial
+    interface SerialForm extends TransactionRequest.SerialForm<SkipTransactionsRequest> {
+        @Override
+        default SkipTransactionsRequest readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence, final ActorRef replyTo) throws IOException {
+            final int size = in.readInt();
+            final var builder = ImmutableList.<UnsignedLong>builderWithExpectedSize(size);
+            int idx;
+            if (size % 2 != 0) {
+                builder.add(UnsignedLong.fromLongBits(WritableObjects.readLong(in)));
+                idx = 1;
+            } else {
+                idx = 0;
+            }
+            for (; idx < size; idx += 2) {
+                final byte hdr = WritableObjects.readLongHeader(in);
+                builder.add(UnsignedLong.fromLongBits(WritableObjects.readFirstLong(in, hdr)));
+                builder.add(UnsignedLong.fromLongBits(WritableObjects.readSecondLong(in, hdr)));
+            }
+
+            return new SkipTransactionsRequest(target, sequence, replyTo, builder.build());
+        }
+
+        @Override
+        default void writeExternal(final ObjectOutput out, final SkipTransactionsRequest msg) throws IOException {
+            TransactionRequest.SerialForm.super.writeExternal(out, msg);
+
+            final var others = msg.others;
+            final int size = others.size();
+            out.writeInt(size);
+
+            int idx;
+            if (size % 2 != 0) {
+                WritableObjects.writeLong(out, others.get(0).longValue());
+                idx = 1;
+            } else {
+                idx = 0;
+            }
+            for (; idx < size; idx += 2) {
+                WritableObjects.writeLongs(out, others.get(idx).longValue(), others.get(idx + 1).longValue());
+            }
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // Note: UnsignedLong is arbitrary, yang.common.Uint64 would work just as well, we really want an immutable
@@ -41,6 +87,11 @@ public final class SkipTransactionsRequest extends TransactionRequest<SkipTransa
         this.others = ImmutableList.copyOf(others);
     }
 
+    private SkipTransactionsRequest(final SkipTransactionsRequest request, final ABIVersion version) {
+        super(request, version);
+        others = request.others;
+    }
+
     /**
      * Return this {@link #getTarget()}s sibling {@link TransactionIdentifier}s.
      *
@@ -51,13 +102,13 @@ public final class SkipTransactionsRequest extends TransactionRequest<SkipTransa
     }
 
     @Override
-    protected SkipTransactionsRequestV1 externalizableProxy(final ABIVersion version) {
-        return new SkipTransactionsRequestV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new STR(this) : new SkipTransactionsRequestV1(this);
     }
 
     @Override
     protected SkipTransactionsRequest cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new SkipTransactionsRequest(this, version);
     }
 
     @Override
index 26d660f1d9d5580f46de0d41add9aaf9fe937970..762289c0bc3687067fbd81d3114cf2ec151958f1 100644 (file)
@@ -7,27 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import com.google.common.collect.ImmutableList;
-import com.google.common.primitives.UnsignedLong;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import java.util.List;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-import org.opendaylight.yangtools.concepts.WritableObjects;
-
 /**
  * Externalizable proxy for use with {@link SkipTransactionsRequest}. It implements the initial
  * (Phosphorus SR1) serialization format.
  */
-final class SkipTransactionsRequestV1 extends AbstractTransactionRequestProxy<SkipTransactionsRequest> {
-    @Serial
+final class SkipTransactionsRequestV1 extends AbstractTransactionRequestProxy<SkipTransactionsRequest>
+        implements SkipTransactionsRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = -7493419007644462643L;
 
-    private List<UnsignedLong> others;
-
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
     // be able to create instances via reflection.
     @SuppressWarnings("checkstyle:RedundantModifier")
@@ -37,52 +25,5 @@ final class SkipTransactionsRequestV1 extends AbstractTransactionRequestProxy<Sk
 
     SkipTransactionsRequestV1(final SkipTransactionsRequest request) {
         super(request);
-        others = request.getOthers();
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-
-        final int size = in.readInt();
-        final var builder = ImmutableList.<UnsignedLong>builderWithExpectedSize(size);
-        int idx;
-        if (size % 2 != 0) {
-            builder.add(UnsignedLong.fromLongBits(WritableObjects.readLong(in)));
-            idx = 1;
-        } else {
-            idx = 0;
-        }
-        for (; idx < size; idx += 2) {
-            final byte hdr = WritableObjects.readLongHeader(in);
-            builder.add(UnsignedLong.fromLongBits(WritableObjects.readFirstLong(in, hdr)));
-            builder.add(UnsignedLong.fromLongBits(WritableObjects.readSecondLong(in, hdr)));
-        }
-        others = builder.build();
-    }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-
-        final int size = others.size();
-        out.writeInt(size);
-
-        int idx;
-        if (size % 2 != 0) {
-            WritableObjects.writeLong(out, others.get(0).longValue());
-            idx = 1;
-        } else {
-            idx = 0;
-        }
-        for (; idx < size; idx += 2) {
-            WritableObjects.writeLongs(out, others.get(idx).longValue(), others.get(idx + 1).longValue());
-        }
-    }
-
-    @Override
-    protected SkipTransactionsRequest createRequest(final TransactionIdentifier target, final long sequence,
-            final ActorRef replyToActor) {
-        return new SkipTransactionsRequest(target, sequence, replyToActor, others);
     }
 }
index 6d168d30d69ed9fc0a52bcd9d7659a8cc55f3097..b2fbc7142154a22b3e0edac019db294c2a870427 100644 (file)
@@ -7,29 +7,41 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
 /**
  * Successful reply to a {@link SkipTransactionsRequest}.
  */
+// FIXME: rename to SkipTransactionsSuccess
 public final class SkipTransactionsResponse extends TransactionSuccess<SkipTransactionsResponse> {
-    @Serial
+    interface SerialForm extends TransactionSuccess.SerialForm<SkipTransactionsResponse> {
+        @Override
+        default SkipTransactionsResponse readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence) {
+            return new SkipTransactionsResponse(target, sequence);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private SkipTransactionsResponse(final SkipTransactionsResponse success, final ABIVersion version) {
+        super(success, version);
+    }
+
     public SkipTransactionsResponse(final TransactionIdentifier identifier, final long sequence) {
         super(identifier, sequence);
     }
 
     @Override
-    protected AbstractTransactionSuccessProxy<SkipTransactionsResponse> externalizableProxy(
-            final ABIVersion version) {
-        return new SkipTransactionsResponseProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new STS(this) : new SkipTransactionsResponseProxyV1(this);
     }
 
     @Override
     protected SkipTransactionsResponse cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new SkipTransactionsResponse(this, version);
     }
 }
index a1bf23de6da7686dc7bf3ad2e3f18140aafc4acc..7e08536f6019b59556f2edced0ca1915e7664308 100644 (file)
@@ -7,15 +7,13 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link SkipTransactionsResponse}. It implements the initial (Phosphorus SR1)
  * serialization format.
  */
-final class SkipTransactionsResponseProxyV1 extends AbstractTransactionSuccessProxy<SkipTransactionsResponse> {
-    @Serial
+final class SkipTransactionsResponseProxyV1 extends AbstractTransactionSuccessProxy<SkipTransactionsResponse>
+        implements SkipTransactionsResponse.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -28,9 +26,4 @@ final class SkipTransactionsResponseProxyV1 extends AbstractTransactionSuccessPr
     SkipTransactionsResponseProxyV1(final SkipTransactionsResponse success) {
         super(success);
     }
-
-    @Override
-    protected SkipTransactionsResponse createSuccess(final TransactionIdentifier target, final long sequence) {
-        return new SkipTransactionsResponse(target, sequence);
-    }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TAR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TAR.java
new file mode 100644 (file)
index 0000000..98f63b7
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link TransactionAbortRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class TAR implements TransactionAbortRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionAbortRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TAR() {
+        // for Externalizable
+    }
+
+    TAR(final TransactionAbortRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public TransactionAbortRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final TransactionAbortRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TAS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TAS.java
new file mode 100644 (file)
index 0000000..c34323b
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link TransactionAbortSuccess}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class TAS implements TransactionAbortSuccess.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionAbortSuccess message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TAS() {
+        // for Externalizable
+    }
+
+    TAS(final TransactionAbortSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public TransactionAbortSuccess message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final TransactionAbortSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TCCS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TCCS.java
new file mode 100644 (file)
index 0000000..ab094b3
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link TransactionCanCommitSuccess}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class TCCS implements TransactionCanCommitSuccess.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionCanCommitSuccess message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TCCS() {
+        // for Externalizable
+    }
+
+    TCCS(final TransactionCanCommitSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public TransactionCanCommitSuccess message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final TransactionCanCommitSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TCS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TCS.java
new file mode 100644 (file)
index 0000000..5e0265d
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link TransactionCommitSuccess}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class TCS implements TransactionCommitSuccess.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionCommitSuccess message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TCS() {
+        // for Externalizable
+    }
+
+    TCS(final TransactionCommitSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public TransactionCommitSuccess message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final TransactionCommitSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TDCR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TDCR.java
new file mode 100644 (file)
index 0000000..01c2733
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link TransactionDoCommitRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class TDCR implements TransactionDoCommitRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionDoCommitRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TDCR() {
+        // for Externalizable
+    }
+
+    TDCR(final TransactionDoCommitRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public TransactionDoCommitRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final TransactionDoCommitRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TF.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TF.java
new file mode 100644 (file)
index 0000000..6e26fc3
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link TransactionFailure}. It implements the Chlorine SR2 serialization format.
+ */
+final class TF implements TransactionFailure.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionFailure message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TF() {
+        // for Externalizable
+    }
+
+    TF(final TransactionFailure message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public TransactionFailure message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final TransactionFailure message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPCR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPCR.java
new file mode 100644 (file)
index 0000000..0bf4ae5
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link TransactionPreCommitRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class TPCR implements TransactionPreCommitRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionPreCommitRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TPCR() {
+        // for Externalizable
+    }
+
+    TPCR(final TransactionPreCommitRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public TransactionPreCommitRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final TransactionPreCommitRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPCS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPCS.java
new file mode 100644 (file)
index 0000000..28c0e95
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link TransactionPreCommitSuccess}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class TPCS implements TransactionPreCommitSuccess.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionPreCommitSuccess message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TPCS() {
+        // for Externalizable
+    }
+
+    TPCS(final TransactionPreCommitSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public TransactionPreCommitSuccess message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final TransactionPreCommitSuccess message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPR.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPR.java
new file mode 100644 (file)
index 0000000..a80e1f6
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link TransactionPurgeRequest}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class TPR implements TransactionPurgeRequest.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionPurgeRequest message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TPR() {
+        // for Externalizable
+    }
+
+    TPR(final TransactionPurgeRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public TransactionPurgeRequest message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final TransactionPurgeRequest message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPS.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/commands/TPS.java
new file mode 100644 (file)
index 0000000..cff3891
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.commands;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Externalizable proxy for use with {@link TransactionPurgeResponse}. It implements the Chlorine SR2 serialization
+ * format.
+ */
+final class TPS implements TransactionPurgeResponse.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionPurgeResponse message;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TPS() {
+        // for Externalizable
+    }
+
+    TPS(final TransactionPurgeResponse message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public TransactionPurgeResponse message() {
+        return verifyNotNull(message);
+    }
+
+    @Override
+    public void setMessage(final TransactionPurgeResponse message) {
+        this.message = requireNonNull(message);
+    }
+
+    @Override
+    public Object readResolve() {
+        return message();
+    }
+}
index d43d188de415144661ab7de8371bf8c76f93f495..6ad73ef427afa9f19e855cd6abd855934bda2a65 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -16,20 +16,32 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * A transaction request to perform the abort step of the three-phase commit protocol.
  */
 public final class TransactionAbortRequest extends TransactionRequest<TransactionAbortRequest> {
-    @Serial
+    interface SerialForm extends TransactionRequest.SerialForm<TransactionAbortRequest> {
+        @Override
+        default TransactionAbortRequest readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence, final ActorRef replyTo) {
+            return new TransactionAbortRequest(target, sequence, replyTo);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private TransactionAbortRequest(final TransactionAbortRequest request, final ABIVersion version) {
+        super(request, version);
+    }
+
     public TransactionAbortRequest(final TransactionIdentifier target, final long sequence, final ActorRef replyTo) {
         super(target, sequence, replyTo);
     }
 
     @Override
-    protected TransactionAbortRequestProxyV1 externalizableProxy(final ABIVersion version) {
-        return new TransactionAbortRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new TAR(this) : new TransactionAbortRequestProxyV1(this);
     }
 
     @Override
     protected TransactionAbortRequest cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new TransactionAbortRequest(this, version);
     }
 }
index b4f80f64e41fed7698e5c3a18b35a27f76364c62..87def66318e99905b4646562ce60d5dc84686549 100644 (file)
@@ -7,18 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link TransactionAbortRequest}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class TransactionAbortRequestProxyV1 extends AbstractTransactionRequestProxy<TransactionAbortRequest> {
-    @Serial
+final class TransactionAbortRequestProxyV1 extends AbstractTransactionRequestProxy<TransactionAbortRequest>
+        implements TransactionAbortRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -31,10 +28,4 @@ final class TransactionAbortRequestProxyV1 extends AbstractTransactionRequestPro
     TransactionAbortRequestProxyV1(final TransactionAbortRequest request) {
         super(request);
     }
-
-    @Override
-    protected TransactionAbortRequest createRequest(final TransactionIdentifier target, final long sequence,
-            final ActorRef replyTo) {
-        return new TransactionAbortRequest(target, sequence, replyTo);
-    }
 }
index 44de3f69fe17498ba6345661919e0506f8b8b793..9f2c4c967b82655376801750169c7052e6dd908e 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -18,20 +18,32 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * @author Robert Varga
  */
 public final class TransactionAbortSuccess extends TransactionSuccess<TransactionAbortSuccess> {
-    @Serial
+    interface SerialForm extends TransactionSuccess.SerialForm<TransactionAbortSuccess> {
+        @Override
+        default TransactionAbortSuccess readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence) {
+            return new TransactionAbortSuccess(target, sequence);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private TransactionAbortSuccess(final TransactionAbortSuccess success, final ABIVersion version) {
+        super(success, version);
+    }
+
     public TransactionAbortSuccess(final TransactionIdentifier identifier, final long sequence) {
         super(identifier, sequence);
     }
 
     @Override
-    protected AbstractTransactionSuccessProxy<TransactionAbortSuccess> externalizableProxy(final ABIVersion version) {
-        return new TransactionAbortSuccessProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new TAS(this) : new TransactionAbortSuccessProxyV1(this);
     }
 
     @Override
     protected TransactionAbortSuccess cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new TransactionAbortSuccess(this, version);
     }
 }
index c04cadc977670d5c6d5dd45ba43661c3c2a936bc..9d057ada5e63293df59a0355e966ebfbdd63f428 100644 (file)
@@ -7,17 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link TransactionAbortSuccess}. It implements the initial (Boron)
  * serialization format.
  *
  * @author Robert Varga
  */
-final class TransactionAbortSuccessProxyV1 extends AbstractTransactionSuccessProxy<TransactionAbortSuccess> {
-    @Serial
+final class TransactionAbortSuccessProxyV1 extends AbstractTransactionSuccessProxy<TransactionAbortSuccess>
+        implements TransactionAbortSuccess.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -30,9 +28,4 @@ final class TransactionAbortSuccessProxyV1 extends AbstractTransactionSuccessPro
     TransactionAbortSuccessProxyV1(final TransactionAbortSuccess success) {
         super(success);
     }
-
-    @Override
-    protected TransactionAbortSuccess createSuccess(final TransactionIdentifier target, final long sequence) {
-        return new TransactionAbortSuccess(target, sequence);
-    }
 }
index 720305dc42d4a8dade120359cbcfd4970673b5df..5e9e74f81bdb70248f12fc6c7ebcb0db54764384 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -18,21 +18,32 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * @author Robert Varga
  */
 public final class TransactionCanCommitSuccess extends TransactionSuccess<TransactionCanCommitSuccess> {
-    @Serial
+    interface SerialForm extends TransactionSuccess.SerialForm<TransactionCanCommitSuccess> {
+        @Override
+        default TransactionCanCommitSuccess readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence) {
+            return new TransactionCanCommitSuccess(target, sequence);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private TransactionCanCommitSuccess(final TransactionCanCommitSuccess success, final ABIVersion version) {
+        super(success, version);
+    }
+
     public TransactionCanCommitSuccess(final TransactionIdentifier identifier, final long sequence) {
         super(identifier, sequence);
     }
 
     @Override
-    protected AbstractTransactionSuccessProxy<TransactionCanCommitSuccess> externalizableProxy(
-            final ABIVersion version) {
-        return new TransactionCanCommitSuccessProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new TCCS(this) : new TransactionCanCommitSuccessProxyV1(this);
     }
 
     @Override
     protected TransactionCanCommitSuccess cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new TransactionCanCommitSuccess(this, version);
     }
 }
index b187ce5247408088dd7bb089662a9ca3cfb97fd3..0d731c86ff9705c4585746b9c42560b2c369c7e0 100644 (file)
@@ -7,20 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link TransactionCanCommitSuccess}. It implements the initial (Boron)
  * serialization format.
  *
  * @author Robert Varga
  */
-final class TransactionCanCommitSuccessProxyV1 extends AbstractTransactionSuccessProxy<TransactionCanCommitSuccess> {
-    @Serial
+final class TransactionCanCommitSuccessProxyV1 extends AbstractTransactionSuccessProxy<TransactionCanCommitSuccess>
+        implements TransactionCanCommitSuccess.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -33,19 +28,4 @@ final class TransactionCanCommitSuccessProxyV1 extends AbstractTransactionSucces
     TransactionCanCommitSuccessProxyV1(final TransactionCanCommitSuccess success) {
         super(success);
     }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-    }
-
-    @Override
-    protected TransactionCanCommitSuccess createSuccess(final TransactionIdentifier target, final long sequence) {
-        return new TransactionCanCommitSuccess(target, sequence);
-    }
 }
index 8ba0b476adddef8862eb0c13cc179382967811bc..a91fe5c9bfa5ef20b51190aaa3ad42681366063e 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -18,20 +18,32 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * @author Robert Varga
  */
 public final class TransactionCommitSuccess extends TransactionSuccess<TransactionCommitSuccess> {
-    @Serial
+    interface SerialForm extends TransactionSuccess.SerialForm<TransactionCommitSuccess> {
+        @Override
+        default TransactionCommitSuccess readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence) {
+            return new TransactionCommitSuccess(target, sequence);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private TransactionCommitSuccess(final TransactionCommitSuccess success, final ABIVersion version) {
+        super(success, version);
+    }
+
     public TransactionCommitSuccess(final TransactionIdentifier identifier, final long sequence) {
         super(identifier, sequence);
     }
 
     @Override
-    protected AbstractTransactionSuccessProxy<TransactionCommitSuccess> externalizableProxy(final ABIVersion version) {
-        return new TransactionCommitSuccessProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new TCS(this) : new TransactionCommitSuccessProxyV1(this);
     }
 
     @Override
     protected TransactionCommitSuccess cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new TransactionCommitSuccess(this, version);
     }
 }
index 42a8151db9bdceb2640c7d592b577e6f95f849c4..ad2f1cb6c4236d074ae75d83c68a535aebce4dc3 100644 (file)
@@ -7,17 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link TransactionCommitSuccess}. It implements the initial (Boron)
  * serialization format.
  *
  * @author Robert Varga
  */
-final class TransactionCommitSuccessProxyV1 extends AbstractTransactionSuccessProxy<TransactionCommitSuccess> {
-    @Serial
+final class TransactionCommitSuccessProxyV1 extends AbstractTransactionSuccessProxy<TransactionCommitSuccess>
+        implements TransactionCommitSuccess.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -30,9 +28,4 @@ final class TransactionCommitSuccessProxyV1 extends AbstractTransactionSuccessPr
     TransactionCommitSuccessProxyV1(final TransactionCommitSuccess success) {
         super(success);
     }
-
-    @Override
-    protected TransactionCommitSuccess createSuccess(final TransactionIdentifier target, final long sequence) {
-        return new TransactionCommitSuccess(target, sequence);
-    }
 }
index 92ede4f1d885104ea5bd8f8ebef3263ffc56f022..9ba1f1d48fd4290c1162a2553aaa7a7182053cae 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -16,20 +16,32 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * A transaction request to perform the final, doCommit, step of the three-phase commit protocol.
  */
 public final class TransactionDoCommitRequest extends TransactionRequest<TransactionDoCommitRequest> {
-    @Serial
+    interface SerialForm extends TransactionRequest.SerialForm<TransactionDoCommitRequest> {
+        @Override
+        default TransactionDoCommitRequest readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence, final ActorRef replyTo) {
+            return new TransactionDoCommitRequest(target, sequence, replyTo);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private TransactionDoCommitRequest(final TransactionDoCommitRequest request, final ABIVersion version) {
+        super(request, version);
+    }
+
     public TransactionDoCommitRequest(final TransactionIdentifier target, final long sequence, final ActorRef replyTo) {
         super(target, sequence, replyTo);
     }
 
     @Override
-    protected TransactionDoCommitRequestProxyV1 externalizableProxy(final ABIVersion version) {
-        return new TransactionDoCommitRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new TDCR(this) : new TransactionDoCommitRequestProxyV1(this);
     }
 
     @Override
     protected TransactionDoCommitRequest cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new TransactionDoCommitRequest(this, version);
     }
 }
index c510e3f071e814b85abd6fab73d875209def9b78..ea9cfdb0410a7e0ab503bd7f7f44e211278204a6 100644 (file)
@@ -7,18 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link TransactionDoCommitRequest}. It implements the initial (Boron) serialization
  * format.
  *
  * @author Robert Varga
  */
-final class TransactionDoCommitRequestProxyV1 extends AbstractTransactionRequestProxy<TransactionDoCommitRequest> {
-    @Serial
+final class TransactionDoCommitRequestProxyV1 extends AbstractTransactionRequestProxy<TransactionDoCommitRequest>
+        implements TransactionDoCommitRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -31,10 +28,4 @@ final class TransactionDoCommitRequestProxyV1 extends AbstractTransactionRequest
     TransactionDoCommitRequestProxyV1(final TransactionDoCommitRequest request) {
         super(request);
     }
-
-    @Override
-    protected TransactionDoCommitRequest createRequest(final TransactionIdentifier target, final long sequence,
-            final ActorRef replyTo) {
-        return new TransactionDoCommitRequest(target, sequence, replyTo);
-    }
 }
index 86240ddfbce331753971121b3dd06e554b435748..af8509601a98848fe294b0d8a43269ffbf1c2852 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.DataInput;
+import java.io.IOException;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 import org.opendaylight.controller.cluster.access.concepts.RequestFailure;
@@ -17,20 +18,37 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * Generic {@link RequestFailure} involving a {@link TransactionRequest}.
  */
 public final class TransactionFailure extends RequestFailure<TransactionIdentifier, TransactionFailure> {
-    @Serial
+    interface SerialForm extends RequestFailure.SerialForm<TransactionIdentifier, TransactionFailure> {
+        @Override
+        default TransactionIdentifier readTarget(final DataInput in) throws IOException {
+            return TransactionIdentifier.readFrom(in);
+        }
+
+        @Override
+        default TransactionFailure createFailure(final TransactionIdentifier target, final long sequence,
+                final RequestException cause) {
+            return new TransactionFailure(target, sequence, cause);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private TransactionFailure(final TransactionFailure failure, final ABIVersion version) {
+        super(failure, version);
+    }
+
     TransactionFailure(final TransactionIdentifier target, final long sequence, final RequestException cause) {
         super(target, sequence, cause);
     }
 
     @Override
     protected TransactionFailure cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new TransactionFailure(this, version);
     }
 
     @Override
-    protected TransactionFailureProxyV1 externalizableProxy(final ABIVersion version) {
-        return new TransactionFailureProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new TF(this) : new TransactionFailureProxyV1(this);
     }
 }
index 70d1e30e51f3ca85bd44e5488093482c8db8a4cc..335308b05cc7743b977ed79ebcbdb172fbe752f7 100644 (file)
@@ -7,11 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.DataInput;
-import java.io.IOException;
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.AbstractRequestFailureProxy;
-import org.opendaylight.controller.cluster.access.concepts.RequestException;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
 /**
@@ -20,8 +16,9 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  *
  * @author Robert Varga
  */
-final class TransactionFailureProxyV1 extends AbstractRequestFailureProxy<TransactionIdentifier, TransactionFailure> {
-    @Serial
+final class TransactionFailureProxyV1 extends AbstractRequestFailureProxy<TransactionIdentifier, TransactionFailure>
+        implements TransactionFailure.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -34,15 +31,4 @@ final class TransactionFailureProxyV1 extends AbstractRequestFailureProxy<Transa
     TransactionFailureProxyV1(final TransactionFailure failure) {
         super(failure);
     }
-
-    @Override
-    protected TransactionFailure createFailure(final TransactionIdentifier target, final long sequence,
-            final RequestException cause) {
-        return new TransactionFailure(target, sequence, cause);
-    }
-
-    @Override
-    protected TransactionIdentifier readTarget(final DataInput in) throws IOException {
-        return TransactionIdentifier.readFrom(in);
-    }
 }
index 3828628089d4d6caf63692007cc72335c1359cea..406f659b965ffdc41acdf1eb600b0a1e9c8b7813 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -16,21 +16,33 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * A transaction request to perform the second, preCommit, step of the three-phase commit protocol.
  */
 public final class TransactionPreCommitRequest extends TransactionRequest<TransactionPreCommitRequest> {
-    @Serial
+    interface SerialForm extends TransactionRequest.SerialForm<TransactionPreCommitRequest> {
+        @Override
+        default TransactionPreCommitRequest readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence, final ActorRef replyTo) {
+            return new TransactionPreCommitRequest(target, sequence, replyTo);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private TransactionPreCommitRequest(final TransactionPreCommitRequest request, final ABIVersion version) {
+        super(request, version);
+    }
+
     public TransactionPreCommitRequest(final TransactionIdentifier target, final long sequence,
             final ActorRef replyTo) {
         super(target, sequence, replyTo);
     }
 
     @Override
-    protected TransactionPreCommitRequestProxyV1 externalizableProxy(final ABIVersion version) {
-        return new TransactionPreCommitRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new TPCR(this) : new TransactionPreCommitRequestProxyV1(this);
     }
 
     @Override
     protected TransactionPreCommitRequest cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new TransactionPreCommitRequest(this, version);
     }
 }
index 2b56cc352bec54353b20e0953871c8dcbcfa682c..59fefb66dc39389f5c1c076945e474fc07dee292 100644 (file)
@@ -7,18 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link TransactionPreCommitRequest}. It implements the initial (Boron)
  * serialization format.
  *
  * @author Robert Varga
  */
-final class TransactionPreCommitRequestProxyV1 extends AbstractTransactionRequestProxy<TransactionPreCommitRequest> {
-    @Serial
+final class TransactionPreCommitRequestProxyV1 extends AbstractTransactionRequestProxy<TransactionPreCommitRequest>
+        implements TransactionPreCommitRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -31,10 +28,4 @@ final class TransactionPreCommitRequestProxyV1 extends AbstractTransactionReques
     TransactionPreCommitRequestProxyV1(final TransactionPreCommitRequest request) {
         super(request);
     }
-
-    @Override
-    protected TransactionPreCommitRequest createRequest(final TransactionIdentifier target, final long sequence,
-            final ActorRef replyTo) {
-        return new TransactionPreCommitRequest(target, sequence, replyTo);
-    }
 }
index a349d72e8b364a8c4c100f42dd7b0f2f1a034eb5..635573ba51d739116325fb7c1ff70395cf1909a6 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -17,21 +18,32 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * @author Robert Varga
  */
 public final class TransactionPreCommitSuccess extends TransactionSuccess<TransactionPreCommitSuccess> {
-    @Serial
+    interface SerialForm extends TransactionSuccess.SerialForm<TransactionPreCommitSuccess> {
+        @Override
+        default TransactionPreCommitSuccess readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence) throws IOException {
+            return new TransactionPreCommitSuccess(target, sequence);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private TransactionPreCommitSuccess(final TransactionPreCommitSuccess success, final ABIVersion version) {
+        super(success, version);
+    }
+
     public TransactionPreCommitSuccess(final TransactionIdentifier identifier, final long sequence) {
         super(identifier, sequence);
     }
 
     @Override
-    protected AbstractTransactionSuccessProxy<TransactionPreCommitSuccess> externalizableProxy(
-            final ABIVersion version) {
-        return new TransactionPreCommitSuccessProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new TPCS(this) : new TransactionPreCommitSuccessProxyV1(this);
     }
 
     @Override
     protected TransactionPreCommitSuccess cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new TransactionPreCommitSuccess(this, version);
     }
 }
index 4e71077f8352780e90be32a3f70d89a00ac767db..e421f785ff07cd84a1e58f2307c85f1d961f752d 100644 (file)
@@ -7,17 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link TransactionPreCommitSuccess}. It implements the initial (Boron)
  * serialization format.
  *
  * @author Robert Varga
  */
-final class TransactionPreCommitSuccessProxyV1 extends AbstractTransactionSuccessProxy<TransactionPreCommitSuccess> {
-    @Serial
+final class TransactionPreCommitSuccessProxyV1 extends AbstractTransactionSuccessProxy<TransactionPreCommitSuccess>
+        implements TransactionPreCommitSuccess.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -30,9 +28,4 @@ final class TransactionPreCommitSuccessProxyV1 extends AbstractTransactionSucces
     TransactionPreCommitSuccessProxyV1(final TransactionPreCommitSuccess success) {
         super(success);
     }
-
-    @Override
-    protected TransactionPreCommitSuccess createSuccess(final TransactionIdentifier target, final long sequence) {
-        return new TransactionPreCommitSuccess(target, sequence);
-    }
 }
index a374a891db30664e503493b743d9e2bfd4a255ac..dd26df2529f7db0490877c94d02b3e0e55be63f0 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
@@ -18,20 +18,32 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * to the transaction and responds with a {@link TransactionPurgeResponse}.
  */
 public final class TransactionPurgeRequest extends TransactionRequest<TransactionPurgeRequest> {
-    @Serial
+    interface SerialForm extends TransactionRequest.SerialForm<TransactionPurgeRequest> {
+        @Override
+        default TransactionPurgeRequest readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence, final ActorRef replyTo) {
+            return new TransactionPurgeRequest(target, sequence, replyTo);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private TransactionPurgeRequest(final TransactionPurgeRequest request, final ABIVersion version) {
+        super(request, version);
+    }
+
     public TransactionPurgeRequest(final TransactionIdentifier target, final long sequence, final ActorRef replyTo) {
         super(target, sequence, replyTo);
     }
 
     @Override
-    protected TransactionPurgeRequestProxyV1 externalizableProxy(final ABIVersion version) {
-        return new TransactionPurgeRequestProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new TPR(this) : new TransactionPurgeRequestProxyV1(this);
     }
 
     @Override
     protected TransactionPurgeRequest cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new TransactionPurgeRequest(this, version);
     }
 }
\ No newline at end of file
index a6be95d9f96388b63abb7b84da3efff428f997fd..529cc090f846dbb55483f7b1d461f96852011796 100644 (file)
@@ -7,18 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import akka.actor.ActorRef;
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link TransactionPurgeRequest}. It implements the initial (Boron)
  * serialization format.
  *
  * @author Robert Varga
  */
-final class TransactionPurgeRequestProxyV1 extends AbstractTransactionRequestProxy<TransactionPurgeRequest> {
-    @Serial
+final class TransactionPurgeRequestProxyV1 extends AbstractTransactionRequestProxy<TransactionPurgeRequest>
+        implements TransactionPurgeRequest.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -31,10 +28,4 @@ final class TransactionPurgeRequestProxyV1 extends AbstractTransactionRequestPro
     TransactionPurgeRequestProxyV1(final TransactionPurgeRequest request) {
         super(request);
     }
-
-    @Override
-    protected TransactionPurgeRequest createRequest(final TransactionIdentifier target, final long sequence,
-            final ActorRef replyTo) {
-        return new TransactionPurgeRequest(target, sequence, replyTo);
-    }
 }
index 1d3a74ab05a59953310b378733e803a6132109dc..5b650e60f91af9a816c4be6c8fc069f30619b15b 100644 (file)
@@ -7,31 +7,41 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.ObjectInput;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
 
 /**
  * Successful reply to a {@link TransactionPurgeRequest}.
- *
- * @author Robert Varga
  */
+// FIXME: rename to TransactionPurgeSuccess
 public final class TransactionPurgeResponse extends TransactionSuccess<TransactionPurgeResponse> {
-    @Serial
+    interface SerialForm extends TransactionSuccess.SerialForm<TransactionPurgeResponse> {
+        @Override
+        default TransactionPurgeResponse readExternal(final ObjectInput in, final TransactionIdentifier target,
+                final long sequence) {
+            return new TransactionPurgeResponse(target, sequence);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
+    private TransactionPurgeResponse(final TransactionPurgeResponse success, final ABIVersion version) {
+        super(success, version);
+    }
+
     public TransactionPurgeResponse(final TransactionIdentifier identifier, final long sequence) {
         super(identifier, sequence);
     }
 
     @Override
-    protected AbstractTransactionSuccessProxy<TransactionPurgeResponse> externalizableProxy(
-            final ABIVersion version) {
-        return new TransactionPurgeResponseProxyV1(this);
+    protected SerialForm externalizableProxy(final ABIVersion version) {
+        return ABIVersion.MAGNESIUM.lt(version) ? new TPS(this) : new TransactionPurgeResponseProxyV1(this);
     }
 
     @Override
     protected TransactionPurgeResponse cloneAsVersion(final ABIVersion version) {
-        return this;
+        return new TransactionPurgeResponse(this, version);
     }
 }
index f51dc606fa96f1d11a2ecedbe3fbab9b0df62253..3875614187745f942cf0912f48802686f1a662be 100644 (file)
@@ -7,17 +7,15 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
-import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
-
 /**
  * Externalizable proxy for use with {@link TransactionPurgeResponse}. It implements the initial (Boron)
  * serialization format.
  *
  * @author Robert Varga
  */
-final class TransactionPurgeResponseProxyV1 extends AbstractTransactionSuccessProxy<TransactionPurgeResponse> {
-    @Serial
+final class TransactionPurgeResponseProxyV1 extends AbstractTransactionSuccessProxy<TransactionPurgeResponse>
+        implements TransactionPurgeResponse.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -30,9 +28,4 @@ final class TransactionPurgeResponseProxyV1 extends AbstractTransactionSuccessPr
     TransactionPurgeResponseProxyV1(final TransactionPurgeResponse success) {
         super(success);
     }
-
-    @Override
-    protected TransactionPurgeResponse createSuccess(final TransactionIdentifier target, final long sequence) {
-        return new TransactionPurgeResponse(target, sequence);
-    }
 }
index fb12edeacdd8fdadb744c9bc79b8356005ae97b0..15d98f91507990ddbcd499d28934a4330f93fb9d 100644 (file)
@@ -8,7 +8,8 @@
 package org.opendaylight.controller.cluster.access.commands;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.DataInput;
+import java.io.IOException;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.Request;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
@@ -21,7 +22,15 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  * @param <T> Message type
  */
 public abstract class TransactionRequest<T extends TransactionRequest<T>> extends Request<TransactionIdentifier, T> {
-    @Serial
+    protected interface SerialForm<T extends TransactionRequest<T>>
+            extends Request.SerialForm<TransactionIdentifier, T> {
+        @Override
+        default TransactionIdentifier readTarget(final DataInput in) throws IOException {
+            return TransactionIdentifier.readFrom(in);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     TransactionRequest(final TransactionIdentifier identifier, final long sequence, final ActorRef replyTo) {
@@ -38,5 +47,5 @@ public abstract class TransactionRequest<T extends TransactionRequest<T>> extend
     }
 
     @Override
-    protected abstract AbstractTransactionRequestProxy<T> externalizableProxy(ABIVersion version);
+    protected abstract SerialForm<T> externalizableProxy(ABIVersion version);
 }
index f70b750813dca867a12257b3fd5923ff9cd3324a..689b4d5ee1443faadc57d93fe1f3d3f8ad8585fc 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
+import java.io.DataInput;
+import java.io.IOException;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.controller.cluster.access.concepts.RequestSuccess;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
@@ -20,7 +21,14 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier
  */
 public abstract class TransactionSuccess<T extends TransactionSuccess<T>>
         extends RequestSuccess<TransactionIdentifier, T> {
-    @Serial
+    interface SerialForm<T extends TransactionSuccess<T>> extends RequestSuccess.SerialForm<TransactionIdentifier, T> {
+        @Override
+        default TransactionIdentifier readTarget(final DataInput in) throws IOException {
+            return TransactionIdentifier.readFrom(in);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     TransactionSuccess(final TransactionIdentifier identifier, final long sequence) {
@@ -32,5 +40,5 @@ public abstract class TransactionSuccess<T extends TransactionSuccess<T>>
     }
 
     @Override
-    protected abstract AbstractTransactionSuccessProxy<T> externalizableProxy(ABIVersion version);
+    protected abstract SerialForm<T> externalizableProxy(ABIVersion version);
 }
index b7b2228e0f7e40e9935c7dffa2523b93ef11b5d1..c688df3c90f5ede0d33791a7686706bdccb5efb2 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import java.io.Serial;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 
 /**
@@ -15,7 +14,7 @@ import org.opendaylight.controller.cluster.access.concepts.RequestException;
  * typically happens when the linear history ID is newer than the highest observed {@link CreateLocalHistoryRequest}.
  */
 public final class UnknownHistoryException extends RequestException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public UnknownHistoryException(final Long lastSeenHistory) {
index c4d100a560afaf388b99649945e7c9d4fd64add1..a97a3f0aadc7fc456df96a0bbaaa3fa3cbd943cd 100644 (file)
@@ -7,51 +7,36 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import org.opendaylight.yangtools.concepts.WritableObjects;
-
-abstract class AbstractEnvelopeProxy<T extends Message<?, ?>> implements Externalizable {
-    @Serial
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+abstract class AbstractEnvelopeProxy<T extends Message<?, ?>, E extends Envelope<T>>
+        implements Envelope.SerialForm<T, E> {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private T message;
-    private long sessionId;
-    private long txSequence;
+    private E envelope;
 
     AbstractEnvelopeProxy() {
         // for Externalizable
     }
 
-    AbstractEnvelopeProxy(final Envelope<T> envelope) {
-        message = envelope.getMessage();
-        txSequence = envelope.getTxSequence();
-        sessionId = envelope.getSessionId();
+    AbstractEnvelopeProxy(final E envelope) {
+        this.envelope = requireNonNull(envelope);
     }
 
     @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        WritableObjects.writeLongs(out, sessionId, txSequence);
-        out.writeObject(message);
+    public final E envelope() {
+        return verifyNotNull(envelope);
     }
 
-    @SuppressWarnings("unchecked")
     @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        final byte header = WritableObjects.readLongHeader(in);
-        sessionId = WritableObjects.readFirstLong(in, header);
-        txSequence = WritableObjects.readSecondLong(in, header);
-        message = (T) in.readObject();
+    public final void setEnvelope(final E envelope) {
+        this.envelope = requireNonNull(envelope);
     }
 
-    @SuppressWarnings("checkstyle:hiddenField")
-    abstract Envelope<T> createEnvelope(T wrappedNessage, long sessionId, long txSequence);
-
-    @Serial
-    final Object readResolve() {
-        return createEnvelope(message, sessionId, txSequence);
+    @Override
+    public final Object readResolve() {
+        return envelope();
     }
 }
index 1cc091bdb28af6f2a5acdfa7c9b53a4b006f46ec..8b0912ff63670b23804681a003529907e6dc7cf3 100644 (file)
@@ -8,16 +8,10 @@
 package org.opendaylight.controller.cluster.access.concepts;
 
 import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
 
-import java.io.DataInput;
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
-import org.opendaylight.yangtools.concepts.WritableObjects;
 
 /**
  * Abstract Externalizable proxy for use with {@link Message} subclasses.
@@ -27,40 +21,33 @@ import org.opendaylight.yangtools.concepts.WritableObjects;
  * @param <T> Target identifier type
  * @param <C> Message class
  */
-abstract class AbstractMessageProxy<T extends WritableIdentifier, C extends Message<T, C>> implements Externalizable {
-    @Serial
+abstract class AbstractMessageProxy<T extends WritableIdentifier, C extends Message<T, C>>
+        implements Message.SerialForm<T, C> {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private T target;
-    private long sequence;
+    private C message;
 
     protected AbstractMessageProxy() {
         // For Externalizable
     }
 
     AbstractMessageProxy(final @NonNull C message) {
-        this.target = message.getTarget();
-        this.sequence = message.getSequence();
+        this.message = requireNonNull(message);
     }
 
     @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        target.writeTo(out);
-        WritableObjects.writeLong(out, sequence);
+    public final C message() {
+        return verifyNotNull(message);
     }
 
     @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        target = verifyNotNull(readTarget(in));
-        sequence = WritableObjects.readLong(in);
+    public final void setMessage(final C message) {
+        this.message = requireNonNull(message);
     }
 
-    @Serial
-    protected final Object readResolve() {
-        return verifyNotNull(createMessage(target, sequence));
+    @Override
+    public final Object readResolve() {
+        return message();
     }
-
-    protected abstract @NonNull T readTarget(@NonNull DataInput in) throws IOException;
-
-    abstract @NonNull C createMessage(@NonNull T msgTarget, long msgSequence);
 }
index e715c94f011d89e7497c6e21bf5edff855099070..8089856ed296b04179a5bf26bdd2f9b4b3a19d14 100644 (file)
@@ -7,10 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
 
@@ -20,38 +16,15 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  * @param <T> Target identifier type
  */
 public abstract class AbstractRequestFailureProxy<T extends WritableIdentifier, C extends RequestFailure<T, C>>
-        extends AbstractResponseProxy<T, C> {
-    @Serial
+        extends AbstractResponseProxy<T, C> implements RequestFailure.SerialForm<T, C> {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private RequestException cause;
-
     protected AbstractRequestFailureProxy() {
         // For Externalizable
     }
 
     protected AbstractRequestFailureProxy(final @NonNull C failure) {
         super(failure);
-        this.cause = failure.getCause();
-    }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeObject(cause);
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        cause = (RequestException) in.readObject();
-    }
-
-    @Override
-    final C createResponse(final T target, final long sequence) {
-        return createFailure(target, sequence, cause);
     }
-
-    protected abstract @NonNull C createFailure(@NonNull T target, long sequence,
-            @NonNull RequestException failureCause);
-}
+}
\ No newline at end of file
index 762c9728d5f5c9ceadc513576bf30b35cfa9d334..3ce1193e40cb7887e223579ccb89946fc000a652 100644 (file)
@@ -7,13 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import akka.actor.ActorRef;
-import akka.serialization.JavaSerializer;
-import akka.serialization.Serialization;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
 
@@ -23,37 +16,15 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  * @param <T> Target identifier type
  */
 public abstract class AbstractRequestProxy<T extends WritableIdentifier, C extends Request<T, C>>
-        extends AbstractMessageProxy<T, C> {
-    @Serial
+        extends AbstractMessageProxy<T, C> implements Request.SerialForm<T, C> {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private ActorRef replyTo;
-
     protected AbstractRequestProxy() {
         // For Externalizable
     }
 
     protected AbstractRequestProxy(final @NonNull C request) {
         super(request);
-        this.replyTo = request.getReplyTo();
-    }
-
-    @Override
-    public void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeObject(Serialization.serializedActorPath(replyTo));
-    }
-
-    @Override
-    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        replyTo = JavaSerializer.currentSystem().value().provider().resolveActorRef((String) in.readObject());
-    }
-
-    @Override
-    final C createMessage(final T target, final long sequence) {
-        return createRequest(target, sequence, replyTo);
     }
-
-    protected abstract @NonNull C createRequest(@NonNull T target, long sequence, @NonNull ActorRef replyToActor);
 }
index 7c35a3fd53081c47dd8eb821398733e7f6c56496..12bbe79a7b8d5841e17881fc46c8e728ee80ca04 100644 (file)
@@ -7,44 +7,16 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serial;
-import org.opendaylight.yangtools.concepts.WritableObjects;
-
-abstract class AbstractResponseEnvelopeProxy<T extends Response<?, ?>> extends AbstractEnvelopeProxy<T> {
-    @Serial
+abstract class AbstractResponseEnvelopeProxy<T extends Response<?, ?>, E extends ResponseEnvelope<T>>
+        extends AbstractEnvelopeProxy<T, E> {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    private long executionTimeNanos;
-
     AbstractResponseEnvelopeProxy() {
         // for Externalizable
     }
 
-    AbstractResponseEnvelopeProxy(final ResponseEnvelope<T> envelope) {
+    AbstractResponseEnvelopeProxy(final E envelope) {
         super(envelope);
-        this.executionTimeNanos = envelope.getExecutionTimeNanos();
     }
-
-    @Override
-    public final void writeExternal(final ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        WritableObjects.writeLong(out, executionTimeNanos);
-    }
-
-    @Override
-    public final void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        executionTimeNanos = WritableObjects.readLong(in);
-    }
-
-    @Override
-    final ResponseEnvelope<T> createEnvelope(final T message, final long sessionId, final long txSequence) {
-        return createEnvelope(message, sessionId, txSequence, executionTimeNanos);
-    }
-
-    @SuppressWarnings("checkstyle:hiddenField")
-    abstract ResponseEnvelope<T> createEnvelope(T message, long sessionId, long txSequence, long executionTimeNanos);
 }
index 818410dbb3921747b6f1dd691d307add02d9303e..4e9f81e0cdb7881790aebcea09240e4435eb8b2a 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
 
@@ -21,7 +20,7 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  */
 abstract class AbstractResponseProxy<T extends WritableIdentifier, C extends Response<T, C>>
         extends AbstractMessageProxy<T, C> {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     protected AbstractResponseProxy() {
@@ -31,11 +30,4 @@ abstract class AbstractResponseProxy<T extends WritableIdentifier, C extends Res
     AbstractResponseProxy(final @NonNull C response) {
         super(response);
     }
-
-    @Override
-    final C createMessage(final T target, final long sequence) {
-        return createResponse(target, sequence);
-    }
-
-    abstract @NonNull C createResponse(@NonNull T target, long sequence);
 }
index 4e31019c7730648eba66458ac2dd1a431fb67a64..bed6e8947b56114be576a2af1cf19d4cc7a74508 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
 
@@ -18,7 +17,7 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  */
 public abstract class AbstractSuccessProxy<T extends WritableIdentifier, C extends RequestSuccess<T, C>>
         extends AbstractResponseProxy<T, C> {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     protected AbstractSuccessProxy() {
@@ -28,11 +27,4 @@ public abstract class AbstractSuccessProxy<T extends WritableIdentifier, C exten
     protected AbstractSuccessProxy(final @NonNull C success) {
         super(success);
     }
-
-    @Override
-    final C createResponse(final T target, final long sequence) {
-        return createSuccess(target, sequence);
-    }
-
-    protected abstract @NonNull C createSuccess(@NonNull T target, long sequence);
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/CI.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/CI.java
new file mode 100644 (file)
index 0000000..2186d03
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.concepts;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Serialization proxy for {@link ClientIdentifier}.
+ */
+final class CI implements ClientIdentifier.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private ClientIdentifier identifier;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public CI() {
+        // for Externalizable
+    }
+
+    CI(final ClientIdentifier identifier) {
+        this.identifier = requireNonNull(identifier);
+    }
+
+    @Override
+    public ClientIdentifier identifier() {
+        return verifyNotNull(identifier);
+    }
+
+    @Override
+    public void setIdentifier(final ClientIdentifier identifier) {
+        this.identifier = requireNonNull(identifier);
+    }
+
+    @Override
+    public Object readResolve() {
+        return identifier();
+    }
+}
index d62b59384562e85b9bc9bdbb8db5b1976aae15e6..fc8a2a4954ee9e51dbf64eb18a9e476caac310bc 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.MoreObjects;
@@ -16,7 +17,6 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.cds.types.rev191024.ClientGeneration;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
@@ -26,16 +26,34 @@ import org.opendaylight.yangtools.yang.common.Uint64;
 /**
  * A cluster-wide unique identifier of a frontend instance. This identifier discerns between individual incarnations
  * of a particular frontend.
- *
- * @author Robert Varga
  */
 public final class ClientIdentifier implements WritableIdentifier {
-    private static final class Proxy implements Externalizable {
-        @Serial
+    interface SerialForm extends Externalizable {
+        @NonNull ClientIdentifier identifier();
+
+        void setIdentifier(@NonNull ClientIdentifier identifier);
+
+        @java.io.Serial
+        Object readResolve();
+
+        @Override
+        default void readExternal(final ObjectInput in) throws IOException {
+            setIdentifier(new ClientIdentifier(FrontendIdentifier.readFrom(in), WritableObjects.readLong(in)));
+        }
+
+        @Override
+        default void writeExternal(final ObjectOutput out) throws IOException {
+            final var id = identifier();
+            id.getFrontendId().writeTo(out);
+            WritableObjects.writeLong(out, id.getGeneration());
+        }
+    }
+
+    private static final class Proxy implements SerialForm {
+        @java.io.Serial
         private static final long serialVersionUID = 1L;
 
-        private FrontendIdentifier frontendId;
-        private long generation;
+        private ClientIdentifier identifier;
 
         // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
         // be able to create instances via reflection.
@@ -44,30 +62,27 @@ public final class ClientIdentifier implements WritableIdentifier {
             // Needed for Externalizable
         }
 
-        Proxy(final FrontendIdentifier frontendId, final long generation) {
-            this.frontendId = requireNonNull(frontendId);
-            this.generation = generation;
+        Proxy(final ClientIdentifier identifier) {
+            this.identifier = requireNonNull(identifier);
         }
 
         @Override
-        public void writeExternal(final ObjectOutput out) throws IOException {
-            frontendId.writeTo(out);
-            WritableObjects.writeLong(out, generation);
+        public ClientIdentifier identifier() {
+            return verifyNotNull(identifier);
         }
 
         @Override
-        public void readExternal(final ObjectInput in) throws IOException {
-            frontendId = FrontendIdentifier.readFrom(in);
-            generation = WritableObjects.readLong(in);
+        public void setIdentifier(final ClientIdentifier identifier) {
+            this.identifier = requireNonNull(identifier);
         }
 
-        @Serial
-        private Object readResolve() {
-            return new ClientIdentifier(frontendId, generation);
+        @Override
+        public Object readResolve() {
+            return identifier();
         }
     }
 
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull FrontendIdentifier frontendId;
@@ -125,8 +140,8 @@ public final class ClientIdentifier implements WritableIdentifier {
             .toString();
     }
 
-    @Serial
+    @java.io.Serial
     private Object writeReplace() {
-        return new Proxy(frontendId, generation);
+        return new Proxy(this);
     }
 }
index 44cf7171c7f902828b6d0c569a64e93431b5e537..7d39f48e0ccac61e95f813a4d0ea86f62a94db46 100644 (file)
@@ -10,13 +10,50 @@ package org.opendaylight.controller.cluster.access.concepts;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.MoreObjects;
-import java.io.Serial;
+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.WritableObjects;
 
 public abstract class Envelope<T extends Message<?, ?>> implements Immutable, Serializable {
-    @Serial
+    interface SerialForm<T extends Message<?, ?>, E extends Envelope<T>> extends Externalizable {
+
+        @NonNull E envelope();
+
+        void setEnvelope(@NonNull E envelope);
+
+        @java.io.Serial
+        Object readResolve();
+
+        @Override
+        default void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
+            final byte header = WritableObjects.readLongHeader(in);
+            final var sessionId = WritableObjects.readFirstLong(in, header);
+            final var txSequence = WritableObjects.readSecondLong(in, header);
+            @SuppressWarnings("unchecked")
+            final var message = (T) in.readObject();
+            setEnvelope(readExternal(in, sessionId, txSequence, message));
+        }
+
+        E readExternal(ObjectInput in, long sessionId, long txSequence, T message) throws IOException;
+
+        @Override
+        default void writeExternal(final ObjectOutput out) throws IOException {
+            writeExternal(out, envelope());
+        }
+
+        default void writeExternal(final ObjectOutput out, final @NonNull E envelope) throws IOException {
+            WritableObjects.writeLongs(out, envelope.getSessionId(), envelope.getTxSequence());
+            out.writeObject(envelope.getMessage());
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull T message;
@@ -62,10 +99,12 @@ public abstract class Envelope<T extends Message<?, ?>> implements Immutable, Se
                 .add("txSequence", Long.toHexString(txSequence)).add("message", message).toString();
     }
 
-    @Serial
+    @java.io.Serial
     final Object writeReplace() {
-        return createProxy();
+        return ABIVersion.MAGNESIUM.lt(message.getVersion()) ? createProxy() : legacyProxy();
     }
 
-    abstract AbstractEnvelopeProxy<T> createProxy();
+    abstract @NonNull SerialForm<T, ?> createProxy();
+
+    abstract @NonNull AbstractEnvelopeProxy<T, ?> legacyProxy();
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FE.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FE.java
new file mode 100644 (file)
index 0000000..e80a38d
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.concepts;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Serialization proxy for {@link FailureEnvelope}.
+ */
+final class FE implements FailureEnvelope.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private FailureEnvelope envelope;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public FE() {
+        // for Externalizable
+    }
+
+    FE(final FailureEnvelope envelope) {
+        this.envelope = requireNonNull(envelope);
+    }
+
+    @Override
+    public FailureEnvelope envelope() {
+        return verifyNotNull(envelope);
+    }
+
+    @Override
+    public void setEnvelope(final FailureEnvelope envelope) {
+        this.envelope = requireNonNull(envelope);
+    }
+
+    @Override
+    public Object readResolve() {
+        return envelope();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FI.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FI.java
new file mode 100644 (file)
index 0000000..4640c3f
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.concepts;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Serialization proxy for {@link FrontendIdentifier}.
+ */
+final class FI implements FrontendIdentifier.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private FrontendIdentifier identifier;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public FI() {
+        // for Externalizable
+    }
+
+    FI(final FrontendIdentifier identifier) {
+        this.identifier = requireNonNull(identifier);
+    }
+
+    @Override
+    public FrontendIdentifier identifier() {
+        return verifyNotNull(identifier);
+    }
+
+    @Override
+    public void setIdentifier(final FrontendIdentifier identifier) {
+        this.identifier = requireNonNull(identifier);
+    }
+
+    @Override
+    public Object readResolve() {
+        return identifier();
+    }
+}
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FT.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/FT.java
new file mode 100644 (file)
index 0000000..60c45fe
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.concepts;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Serialization proxy for {@link FrontendType}.
+ */
+final class FT implements FrontendType.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private FrontendType type;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public FT() {
+        // for Externalizable
+    }
+
+    FT(final FrontendType type) {
+        this.type = requireNonNull(type);
+    }
+
+    @Override
+    public FrontendType type() {
+        return verifyNotNull(type);
+    }
+
+    @Override
+    public void setType(final FrontendType type) {
+        this.type = requireNonNull(type);
+    }
+
+    @Override
+    public Object readResolve() {
+        return type();
+    }
+}
index c2daa7420335f2440697c509ce5ddb23d960c17a..4de13ac8f812205078d438d9af31dce3ddb9b164 100644 (file)
@@ -7,10 +7,18 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
+import java.io.ObjectInput;
 
 public final class FailureEnvelope extends ResponseEnvelope<RequestFailure<?, ?>> {
-    @Serial
+    interface SerialForm extends ResponseEnvelope.SerialForm<RequestFailure<?, ?>, FailureEnvelope> {
+        @Override
+        default FailureEnvelope readExternal(final ObjectInput in, final long sessionId, final long txSequence,
+                final RequestFailure<?, ?> message, final long executionTimeNanos) {
+            return new FailureEnvelope(message, sessionId, txSequence, executionTimeNanos);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public FailureEnvelope(final RequestFailure<?, ?> message, final long sessionId, final long txSequence,
@@ -19,7 +27,12 @@ public final class FailureEnvelope extends ResponseEnvelope<RequestFailure<?, ?>
     }
 
     @Override
-    FailureEnvelopeProxy createProxy() {
+    FE createProxy() {
+        return new FE(this);
+    }
+
+    @Override
+    FailureEnvelopeProxy legacyProxy() {
         return new FailureEnvelopeProxy(this);
     }
 }
index 65c2f43b7e57b0d772b892bbe30d8c433c2e28d9..98ae8be089d5876c9825cf08f088b22060d5d8e7 100644 (file)
@@ -7,10 +7,9 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
-
-final class FailureEnvelopeProxy extends AbstractResponseEnvelopeProxy<RequestFailure<?, ?>> {
-    @Serial
+final class FailureEnvelopeProxy extends AbstractResponseEnvelopeProxy<RequestFailure<?, ?>, FailureEnvelope>
+        implements FailureEnvelope.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to be
@@ -23,10 +22,4 @@ final class FailureEnvelopeProxy extends AbstractResponseEnvelopeProxy<RequestFa
     FailureEnvelopeProxy(final FailureEnvelope envelope) {
         super(envelope);
     }
-
-    @Override
-    ResponseEnvelope<RequestFailure<?, ?>> createEnvelope(final RequestFailure<?, ?> message, final long sessionId,
-            final long txSequence, final long executionTimeNanos) {
-        return new FailureEnvelope(message, sessionId, txSequence, executionTimeNanos);
-    }
 }
index 5afaa115b02ba7059e5aa793134057f38533ab2a..933aa16c79cbea78ba87f7120f02b9ecebc2dd53 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import java.io.DataInput;
@@ -15,7 +16,6 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.Serial;
 import java.util.Objects;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
@@ -24,12 +24,32 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  * A cluster-wide unique identifier of a frontend type located at a cluster member.
  */
 public final class FrontendIdentifier implements WritableIdentifier {
-    private static final class Proxy implements Externalizable {
-        @Serial
+    interface SerialForm extends Externalizable {
+        @NonNull FrontendIdentifier identifier();
+
+        void setIdentifier(@NonNull FrontendIdentifier identifier);
+
+        @java.io.Serial
+        Object readResolve();
+
+        @Override
+        default void writeExternal(final ObjectOutput out) throws IOException {
+            final var id = identifier();
+            id.memberName.writeTo(out);
+            id.clientType.writeTo(out);
+        }
+
+        @Override
+        default void readExternal(final ObjectInput in) throws IOException {
+            setIdentifier(new FrontendIdentifier(MemberName.readFrom(in), FrontendType.readFrom(in)));
+        }
+    }
+
+    private static final class Proxy implements SerialForm {
+        @java.io.Serial
         private static final long serialVersionUID = 1L;
 
-        private MemberName memberName;
-        private FrontendType clientType;
+        private FrontendIdentifier identifier;
 
         // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
         // be able to create instances via reflection.
@@ -38,30 +58,27 @@ public final class FrontendIdentifier implements WritableIdentifier {
             // Needed for Externalizable
         }
 
-        Proxy(final MemberName memberName, final FrontendType clientType) {
-            this.memberName = requireNonNull(memberName);
-            this.clientType = requireNonNull(clientType);
+        Proxy(final FrontendIdentifier identifier) {
+            this.identifier = requireNonNull(identifier);
         }
 
         @Override
-        public void writeExternal(final ObjectOutput out) throws IOException {
-            memberName.writeTo(out);
-            clientType.writeTo(out);
+        public FrontendIdentifier identifier() {
+            return verifyNotNull(identifier);
         }
 
         @Override
-        public void readExternal(final ObjectInput in) throws IOException {
-            memberName = MemberName.readFrom(in);
-            clientType = FrontendType.readFrom(in);
+        public void setIdentifier(final FrontendIdentifier identifier) {
+            this.identifier = requireNonNull(identifier);
         }
 
-        @Serial
-        private Object readResolve() {
-            return new FrontendIdentifier(memberName, clientType);
+        @Override
+        public Object readResolve() {
+            return identifier();
         }
     }
 
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final MemberName memberName;
@@ -116,8 +133,8 @@ public final class FrontendIdentifier implements WritableIdentifier {
         return toPersistentId();
     }
 
-    @Serial
+    @java.io.Serial
     private Object writeReplace() {
-        return new Proxy(memberName, clientType);
+        return new Proxy(this);
     }
 }
index b36cbbe4031c11b1ad8207e3f9a5a0339b78a1bb..3a25df7dc48447136740fda5624404409863270d 100644 (file)
@@ -20,7 +20,6 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.Serial;
 import java.nio.charset.StandardCharsets;
 import java.util.regex.Pattern;
 import org.eclipse.jdt.annotation.NonNull;
@@ -33,11 +32,35 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  * discerned.
  */
 public final class FrontendType implements Comparable<FrontendType>, WritableIdentifier {
-    private static final class Proxy implements Externalizable {
-        @Serial
+    interface SerialForm extends Externalizable {
+        @NonNull FrontendType type();
+
+        void setType(@NonNull FrontendType type);
+
+        @java.io.Serial
+        Object readResolve();
+
+        @Override
+        default void writeExternal(final ObjectOutput out) throws IOException {
+            final var serialized = type().getSerialized();
+            out.writeInt(serialized.length);
+            out.write(serialized);
+        }
+
+        @Override
+        default void readExternal(final ObjectInput in) throws IOException {
+            final var serialized = new byte[in.readInt()];
+            in.readFully(serialized);
+            // TODO: consider caching instances here
+            setType(new FrontendType(new String(serialized, StandardCharsets.UTF_8), serialized));
+        }
+    }
+
+    private static final class Proxy implements SerialForm {
+        @java.io.Serial
         private static final long serialVersionUID = 1L;
 
-        private byte[] serialized;
+        private FrontendType type;
 
         // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
         // be able to create instances via reflection.
@@ -46,33 +69,30 @@ public final class FrontendType implements Comparable<FrontendType>, WritableIde
             // For Externalizable
         }
 
-        Proxy(final byte[] serialized) {
-            this.serialized = requireNonNull(serialized);
+        Proxy(final FrontendType type) {
+            this.type = requireNonNull(type);
         }
 
         @Override
-        public void writeExternal(final ObjectOutput out) throws IOException {
-            out.writeInt(serialized.length);
-            out.write(serialized);
+        public FrontendType type() {
+            return verifyNotNull(type);
         }
 
         @Override
-        public void readExternal(final ObjectInput in) throws IOException {
-            serialized = new byte[in.readInt()];
-            in.readFully(serialized);
+        public void setType(final FrontendType type) {
+            this.type = requireNonNull(type);
         }
 
-        @Serial
-        private Object readResolve() {
-            // TODO: consider caching instances here
-            return new FrontendType(new String(serialized, StandardCharsets.UTF_8), serialized);
+        @Override
+        public Object readResolve() {
+            return type();
         }
     }
 
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
     private static final String SIMPLE_STRING_REGEX = "^[a-zA-Z0-9-_.*+:=,!~';]+$";
     private static final Pattern SIMPLE_STRING_PATTERN = Pattern.compile(SIMPLE_STRING_REGEX);
-    @Serial
-    private static final long serialVersionUID = 1L;
 
     private final @NonNull String name;
 
@@ -158,8 +178,8 @@ public final class FrontendType implements Comparable<FrontendType>, WritableIde
         return local;
     }
 
-    @Serial
+    @java.io.Serial
     Object writeReplace() {
-        return new Proxy(getSerialized());
+        return new Proxy(this);
     }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/HI.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/HI.java
new file mode 100644 (file)
index 0000000..a0d4795
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.concepts;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Serialization proxy for {@link LocalHistoryIdentifier}.
+ */
+final class HI implements LocalHistoryIdentifier.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private LocalHistoryIdentifier identifier;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public HI() {
+        // for Externalizable
+    }
+
+    HI(final LocalHistoryIdentifier identifier) {
+        this.identifier = requireNonNull(identifier);
+    }
+
+    @Override
+    public LocalHistoryIdentifier identifier() {
+        return verifyNotNull(identifier);
+    }
+
+    @Override
+    public void setIdentifier(final LocalHistoryIdentifier identifier) {
+        this.identifier = requireNonNull(identifier);
+    }
+
+    @Override
+    public Object readResolve() {
+        return identifier();
+    }
+}
index e6050e76c5055f5517d1fef7674a27b269147121..0e70edc76fb10d7c63e34f032722c4b5afbb2dfb 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.MoreObjects;
@@ -16,7 +17,6 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
 import org.opendaylight.yangtools.concepts.WritableObjects;
@@ -28,22 +28,47 @@ import org.opendaylight.yangtools.concepts.WritableObjects;
  * - an unsigned long cookie, assigned by the client and meaningless on the backend, which just reflects it back
  */
 public final class LocalHistoryIdentifier implements WritableIdentifier {
-    /*
-     * Implementation note: cookie is currently required only for module-based sharding, which is implemented as part
-     *                      of normal DataBroker interfaces. For DOMDataTreeProducer cookie will always be zero, hence
-     *                      we may end up not needing cookie at all.
+    /**
+     * Serialized form of {@link LocalHistoryIdentifier}.
      *
-     *                      We use WritableObjects.writeLongs() to output historyId and cookie (in that order). If we
-     *                      end up not needing the cookie at all, we can switch to writeLong() and use zero flags for
-     *                      compatibility.
+     * @implNote
+     *     cookie is currently required only for module-based sharding, which is implemented as part of normal
+     *     DataBroker interfaces. For DOMDataTreeProducer cookie will always be zero, hence we may end up not needing
+     *     cookie at all.
+     *     We use WritableObjects.writeLongs() to output historyId and cookie (in that order). If we end up not needing
+     *     the cookie at all, we can switch to writeLong() and use zero flags for compatibility.
      */
-    private static final class Proxy implements Externalizable {
-        @Serial
+    interface SerialForm extends Externalizable {
+        @NonNull LocalHistoryIdentifier identifier();
+
+        void setIdentifier(@NonNull LocalHistoryIdentifier identifier);
+
+        @java.io.Serial
+        Object readResolve();
+
+        @Override
+        default void writeExternal(final ObjectOutput out) throws IOException {
+            final var id = identifier();
+            id.getClientId().writeTo(out);
+            WritableObjects.writeLongs(out, id.getHistoryId(), id.getCookie());
+        }
+
+        @Override
+        default void readExternal(final ObjectInput in) throws IOException {
+            final var clientId = ClientIdentifier.readFrom(in);
+
+            final byte header = WritableObjects.readLongHeader(in);
+            final var historyId = WritableObjects.readFirstLong(in, header);
+            final var cookie = WritableObjects.readSecondLong(in, header);
+            setIdentifier(new LocalHistoryIdentifier(clientId, historyId, cookie));
+        }
+    }
+
+    private static final class Proxy implements SerialForm {
+        @java.io.Serial
         private static final long serialVersionUID = 1L;
 
-        private ClientIdentifier clientId;
-        private long historyId;
-        private long cookie;
+        private LocalHistoryIdentifier identifier;
 
         // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
         // be able to create instances via reflection.
@@ -52,34 +77,27 @@ public final class LocalHistoryIdentifier implements WritableIdentifier {
             // For Externalizable
         }
 
-        Proxy(final ClientIdentifier frontendId, final long historyId, final long cookie) {
-            clientId = requireNonNull(frontendId);
-            this.historyId = historyId;
-            this.cookie = cookie;
+        Proxy(final LocalHistoryIdentifier identifier) {
+            this.identifier = requireNonNull(identifier);
         }
 
         @Override
-        public void writeExternal(final ObjectOutput out) throws IOException {
-            clientId.writeTo(out);
-            WritableObjects.writeLongs(out, historyId, cookie);
+        public LocalHistoryIdentifier identifier() {
+            return verifyNotNull(identifier);
         }
 
         @Override
-        public void readExternal(final ObjectInput in) throws IOException {
-            clientId = ClientIdentifier.readFrom(in);
-
-            final byte header = WritableObjects.readLongHeader(in);
-            historyId = WritableObjects.readFirstLong(in, header);
-            cookie = WritableObjects.readSecondLong(in, header);
+        public void setIdentifier(final LocalHistoryIdentifier identifier) {
+            this.identifier = requireNonNull(identifier);
         }
 
-        @Serial
-        private Object readResolve() {
-            return new LocalHistoryIdentifier(clientId, historyId, cookie);
+        @Override
+        public Object readResolve() {
+            return identifier();
         }
     }
 
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull ClientIdentifier clientId;
@@ -149,8 +167,8 @@ public final class LocalHistoryIdentifier implements WritableIdentifier {
                 .add("cookie", Long.toUnsignedString(cookie, 16)).toString();
     }
 
-    @Serial
+    @java.io.Serial
     private Object writeReplace() {
-        return new Proxy(clientId, historyId, cookie);
+        return new Proxy(this);
     }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/MN.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/MN.java
new file mode 100644 (file)
index 0000000..83ef1e5
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.concepts;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Serialization proxy for {@link MemberName}.
+ */
+final class MN implements MemberName.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private MemberName name;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public MN() {
+        // for Externalizable
+    }
+
+    MN(final MemberName name) {
+        this.name = requireNonNull(name);
+    }
+
+    @Override
+    public MemberName name() {
+        return verifyNotNull(name);
+    }
+
+    @Override
+    public void setName(final MemberName name) {
+        this.name = requireNonNull(name);
+    }
+
+    @Override
+    public Object readResolve() {
+        return name();
+    }
+}
index f26df831836cc7852cf31f9fd8a826199ffa70b1..41a91360757c1f4fa99010af842652ce1a8d3eea 100644 (file)
@@ -20,7 +20,6 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.Serial;
 import java.nio.charset.StandardCharsets;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
@@ -29,11 +28,35 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  * Type-safe encapsulation of a cluster member name.
  */
 public final class MemberName implements Comparable<MemberName>, WritableIdentifier {
-    private static final class Proxy implements Externalizable {
-        @Serial
+    interface SerialForm extends Externalizable {
+        @NonNull MemberName name();
+
+        void setName(@NonNull MemberName name);
+
+        @java.io.Serial
+        Object readResolve();
+
+        @Override
+        default void writeExternal(final ObjectOutput out) throws IOException {
+            final var serialized = name().getSerialized();
+            out.writeInt(serialized.length);
+            out.write(serialized);
+        }
+
+        @Override
+        default void readExternal(final ObjectInput in) throws IOException {
+            final var serialized = new byte[in.readInt()];
+            in.readFully(serialized);
+            // TODO: consider caching instances here
+            setName(new MemberName(new String(serialized, StandardCharsets.UTF_8), serialized));
+        }
+    }
+
+    private static final class Proxy implements SerialForm {
+        @java.io.Serial
         private static final long serialVersionUID = 1L;
 
-        private byte[] serialized;
+        private MemberName name;
 
         // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
         // be able to create instances via reflection.
@@ -42,30 +65,27 @@ public final class MemberName implements Comparable<MemberName>, WritableIdentif
             // For Externalizable
         }
 
-        Proxy(final byte[] serialized) {
-            this.serialized = requireNonNull(serialized);
+        Proxy(final MemberName name) {
+            this.name = requireNonNull(name);
         }
 
         @Override
-        public void writeExternal(final ObjectOutput out) throws IOException {
-            out.writeInt(serialized.length);
-            out.write(serialized);
+        public MemberName name() {
+            return verifyNotNull(name);
         }
 
         @Override
-        public void readExternal(final ObjectInput in) throws IOException {
-            serialized = new byte[in.readInt()];
-            in.readFully(serialized);
+        public void setName(final MemberName name) {
+            this.name = requireNonNull(name);
         }
 
-        @Serial
-        private Object readResolve() {
-            // TODO: consider caching instances here
-            return new MemberName(new String(serialized, StandardCharsets.UTF_8), serialized);
+        @Override
+        public Object readResolve() {
+            return name();
         }
     }
 
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull String name;
@@ -141,8 +161,8 @@ public final class MemberName implements Comparable<MemberName>, WritableIdentif
         return local;
     }
 
-    @Serial
+    @java.io.Serial
     Object writeReplace() {
-        return new Proxy(getSerialized());
+        return new Proxy(this);
     }
 }
index 6ee547fc93e75a8acf80a4b0e2f5c4f8ace4be55..86c91ef9553bd421085d079687d049d442e64ae4 100644 (file)
@@ -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 <T> Target identifier type
  * @param <C> Message type
  */
-public abstract class Message<T extends WritableIdentifier, C extends Message<T, C>> implements Immutable,
-        Serializable {
-    @Serial
+public abstract class Message<T extends WritableIdentifier, C extends Message<T, C>>
+        implements Immutable, Serializable {
+    /**
+     * Externalizable proxy for use with {@link Message} subclasses.
+     *
+     * @param <T> Target identifier type
+     * @param <C> Message class
+     */
+    protected interface SerialForm<T extends WritableIdentifier, C extends Message<T, C>> 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<T extends WritableIdentifier, C extends Message<T,
      * @param reqVersion Requested ABI version
      * @return Proxy for this object
      */
-    abstract @NonNull AbstractMessageProxy<T, C> externalizableProxy(@NonNull ABIVersion reqVersion);
+    protected abstract @NonNull SerialForm<T, C> externalizableProxy(@NonNull ABIVersion reqVersion);
 
-    @Serial
+    @java.io.Serial
     protected final Object writeReplace() {
         return externalizableProxy(version);
     }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/RE.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/RE.java
new file mode 100644 (file)
index 0000000..455e00e
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.concepts;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Serialization proxy for {@link RequestEnvelope}.
+ */
+final class RE implements RequestEnvelope.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private RequestEnvelope envelope;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public RE() {
+        // for Externalizable
+    }
+
+    RE(final RequestEnvelope envelope) {
+        this.envelope = requireNonNull(envelope);
+    }
+
+    @Override
+    public RequestEnvelope envelope() {
+        return verifyNotNull(envelope);
+    }
+
+    @Override
+    public void setEnvelope(final RequestEnvelope envelope) {
+        this.envelope = requireNonNull(envelope);
+    }
+
+    @Override
+    public Object readResolve() {
+        return envelope();
+    }
+}
index d39617cf77a59202bee91f2a1299afb109f94173..97ce498bda202b9cf9f2e2b79ab0b65146ebdd0f 100644 (file)
@@ -10,8 +10,12 @@ package org.opendaylight.controller.cluster.access.concepts;
 import static java.util.Objects.requireNonNull;
 
 import akka.actor.ActorRef;
+import akka.serialization.JavaSerializer;
+import akka.serialization.Serialization;
 import com.google.common.base.MoreObjects.ToStringHelper;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
@@ -24,7 +28,25 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  * @param <C> Message type
  */
 public abstract class Request<T extends WritableIdentifier, C extends Request<T, C>> extends Message<T, C> {
-    @Serial
+    protected interface SerialForm<T extends WritableIdentifier, C extends Request<T, C>>
+            extends Message.SerialForm<T, C> {
+        @Override
+        default C readExternal(final ObjectInput in, final T target, final long sequence)
+                throws ClassNotFoundException, IOException {
+            return readExternal(in, target, sequence,
+                JavaSerializer.currentSystem().value().provider().resolveActorRef((String) in.readObject()));
+        }
+
+        @NonNull C readExternal(@NonNull ObjectInput in, @NonNull T target, long sequence, @NonNull ActorRef replyTo)
+            throws IOException;
+
+        @Override
+        default void writeExternal(final ObjectOutput out, final C msg) throws IOException {
+            out.writeObject(Serialization.serializedActorPath(msg.getReplyTo()));
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull ActorRef replyTo;
@@ -62,5 +84,5 @@ public abstract class Request<T extends WritableIdentifier, C extends Request<T,
     }
 
     @Override
-    protected abstract AbstractRequestProxy<T, C> externalizableProxy(ABIVersion version);
+    protected abstract SerialForm<T, C> externalizableProxy(ABIVersion version);
 }
index 4dac0b0330d595fdbf7ae5daac0c7f7008257c20..5648846fd93792178bb57eaf5ec307e7a889e3f3 100644 (file)
@@ -8,10 +8,18 @@
 package org.opendaylight.controller.cluster.access.concepts;
 
 import akka.actor.ActorRef;
-import java.io.Serial;
+import java.io.ObjectInput;
 
 public final class RequestEnvelope extends Envelope<Request<?, ?>> {
-    @Serial
+    interface SerialForm extends Envelope.SerialForm<Request<?, ?>, RequestEnvelope> {
+        @Override
+        default RequestEnvelope readExternal(final ObjectInput in, final long sessionId, final long txSequence,
+                final Request<?, ?> message) {
+            return new RequestEnvelope(message, sessionId, txSequence);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public RequestEnvelope(final Request<?, ?> message, final long sessionId, final long txSequence) {
@@ -19,7 +27,12 @@ public final class RequestEnvelope extends Envelope<Request<?, ?>> {
     }
 
     @Override
-    RequestEnvelopeProxy createProxy() {
+    RE createProxy() {
+        return new RE(this);
+    }
+
+    @Override
+    RequestEnvelopeProxy legacyProxy() {
         return new RequestEnvelopeProxy(this);
     }
 
index 21b99807af77c36f59c3390c68bf240f5a02b599..ce9b1f72fe7b0e0e36b78d6b83870d4c4440a96c 100644 (file)
@@ -7,10 +7,9 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
-
-final class RequestEnvelopeProxy extends AbstractEnvelopeProxy<Request<?, ?>> {
-    @Serial
+final class RequestEnvelopeProxy extends AbstractEnvelopeProxy<Request<?, ?>, RequestEnvelope>
+        implements RequestEnvelope.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -23,9 +22,4 @@ final class RequestEnvelopeProxy extends AbstractEnvelopeProxy<Request<?, ?>> {
     RequestEnvelopeProxy(final RequestEnvelope envelope) {
         super(envelope);
     }
-
-    @Override
-    RequestEnvelope createEnvelope(final Request<?, ?> message, final long sessionId, final long txSequence) {
-        return new RequestEnvelope(message, sessionId, txSequence);
-    }
 }
index 41bfd13dd20f9d35adf9ef5c9cf7642e43c29e6b..d1120c61ef468f8060cc6b67261b895f5bda5c04 100644 (file)
@@ -9,14 +9,13 @@ package org.opendaylight.controller.cluster.access.concepts;
 
 import static java.util.Objects.requireNonNull;
 
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 
 /**
  * A failure cause behind a {@link RequestFailure} to process a {@link Request}.
  */
 public abstract class RequestException extends Exception {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     protected RequestException(final @NonNull String message) {
index c30269f63e14b86ad3a1906346835db09b4586d2..7204912669cabf88596be24a5e82e385a4e1dcaf 100644 (file)
@@ -10,7 +10,9 @@ package org.opendaylight.controller.cluster.access.concepts;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.MoreObjects.ToStringHelper;
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
@@ -23,7 +25,28 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  */
 public abstract class RequestFailure<T extends WritableIdentifier, C extends RequestFailure<T, C>>
         extends Response<T, C> {
-    @Serial
+    /**
+     * Externalizable proxy for use with {@link RequestFailure} subclasses.
+     *
+     * @param <T> Target identifier type
+     */
+    protected interface SerialForm<T extends WritableIdentifier, C extends RequestFailure<T, C>>
+            extends Message.SerialForm<T, C> {
+        @Override
+        default C readExternal(final ObjectInput in, final T target, final long sequence)
+                throws IOException, ClassNotFoundException {
+            return createFailure(target, sequence, (RequestException) in.readObject());
+        }
+
+        @Override
+        default void writeExternal(final ObjectOutput out, final C msg) throws IOException {
+            out.writeObject(msg.getCause());
+        }
+
+        @NonNull C createFailure(@NonNull T target, long sequence, @NonNull RequestException failureCause);
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull RequestException cause;
@@ -63,5 +86,5 @@ public abstract class RequestFailure<T extends WritableIdentifier, C extends Req
     }
 
     @Override
-    protected abstract AbstractRequestFailureProxy<T, C> externalizableProxy(ABIVersion version);
+    protected abstract SerialForm<T, C> externalizableProxy(ABIVersion version);
 }
index 7542c4cb3640578a0149fc8b43864ca762238f00..f7e59ed1e6597019c43a04826fc5f006fbfea7d9 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
+import java.io.IOException;
+import java.io.ObjectOutput;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
@@ -17,19 +18,24 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  *
  * @param <T> Target identifier type
  */
-public abstract class RequestSuccess<T extends WritableIdentifier, C extends RequestSuccess<T, C>> extends
-        Response<T, C> {
-    @Serial
+public abstract class RequestSuccess<T extends WritableIdentifier, C extends RequestSuccess<T, C>>
+        extends Response<T, C> {
+    protected interface SerialForm<T extends WritableIdentifier, C extends RequestSuccess<T, C>>
+            extends Response.SerialForm<T, C> {
+        @Override
+        default void writeExternal(final ObjectOutput out, final C msg) throws IOException {
+            // Defaults to no-op
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
-    protected RequestSuccess(final @NonNull C success,  final @NonNull ABIVersion version) {
+    protected RequestSuccess(final @NonNull C success, final @NonNull ABIVersion version) {
         super(success, version);
     }
 
     protected RequestSuccess(final @NonNull T target, final long sequence) {
         super(target, sequence);
     }
-
-    @Override
-    protected abstract AbstractSuccessProxy<T, C> externalizableProxy(ABIVersion version);
 }
index 7f74e39683f947593163814f8b65a134b08228e4..a41fa01db99d2a9c1701be940ce52115a43b2eb4 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
@@ -21,7 +20,12 @@ import org.opendaylight.yangtools.concepts.WritableIdentifier;
  * @param <C> Message type
  */
 public abstract class Response<T extends WritableIdentifier, C extends Response<T, C>> extends Message<T, C> {
-    @Serial
+    protected interface SerialForm<T extends WritableIdentifier, C extends Response<T, C>>
+            extends Message.SerialForm<T, C> {
+
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     Response(final @NonNull T target, final long sequence) {
@@ -31,7 +35,4 @@ public abstract class Response<T extends WritableIdentifier, C extends Response<
     Response(final @NonNull C response, final @NonNull ABIVersion version) {
         super(response, version);
     }
-
-    @Override
-    abstract AbstractResponseProxy<T, C> externalizableProxy(ABIVersion version);
 }
index 90fe7beb11e72a92111f4eeea323aaa8c48b9516..50d1e7434ce1c845fb9c5948f0759b41d526fb88 100644 (file)
@@ -7,18 +7,39 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import com.google.common.base.Preconditions;
-import java.io.Serial;
+import static com.google.common.base.Preconditions.checkArgument;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.concepts.WritableObjects;
 
 public abstract class ResponseEnvelope<T extends Response<?, ?>> extends Envelope<T> {
-    @Serial
+    interface SerialForm<T extends Response<?, ?>, E extends ResponseEnvelope<T>> extends Envelope.SerialForm<T, E> {
+        @Override
+        default void writeExternal(final ObjectOutput out, final @NonNull E envelope) throws IOException {
+            Envelope.SerialForm.super.writeExternal(out, envelope);
+            WritableObjects.writeLong(out, envelope.getExecutionTimeNanos());
+        }
+
+        @Override
+        default E readExternal(final ObjectInput in, final long sessionId, final long txSequence, final T message)
+                throws IOException {
+            return readExternal(in, sessionId, txSequence, message, WritableObjects.readLong(in));
+        }
+
+        E readExternal(ObjectInput in, long sessionId, long txSequence, T message, long executionTimeNanos);
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final long executionTimeNanos;
 
     ResponseEnvelope(final T message, final long sessionId, final long txSequence, final long executionTimeNanos) {
         super(message, sessionId, txSequence);
-        Preconditions.checkArgument(executionTimeNanos >= 0);
+        checkArgument(executionTimeNanos >= 0, "Negative executionTime");
         this.executionTimeNanos = executionTimeNanos;
     }
 
@@ -31,7 +52,4 @@ public abstract class ResponseEnvelope<T extends Response<?, ?>> extends Envelop
     public final long getExecutionTimeNanos() {
         return executionTimeNanos;
     }
-
-    @Override
-    abstract AbstractResponseEnvelopeProxy<T> createProxy();
 }
index cc0c6d0e16cdb48d7cdbaafe8c94df629e11f492..3f1f71d17e830beaa572a054421df84841003480 100644 (file)
@@ -7,14 +7,12 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
-
 /**
  * General error raised when the recipient of a {@link Request} determines that the request contains
  * a {@link ClientIdentifier} which corresponds to an outdated generation.
  */
 public final class RetiredGenerationException extends RequestException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public RetiredGenerationException(final long originatingGeneration, final long newGeneration) {
index 713c413e5297550a998ce5a1c31d3405eb1d960d..3f886a85102c5813bed14fb3a84b11791dfaa4ef 100644 (file)
@@ -11,13 +11,12 @@ import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.Strings;
-import java.io.Serial;
 
 /**
  * General error raised when the recipient of a {@link Request} fails to process a request.
  */
 public final class RuntimeRequestException extends RequestException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public RuntimeRequestException(final String message, final Throwable cause) {
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/SE.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/SE.java
new file mode 100644 (file)
index 0000000..59615a4
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.concepts;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+import java.io.ObjectInput;
+
+/**
+ * Serialization proxy for {@link SuccessEnvelope}.
+ */
+final class SE implements SuccessEnvelope.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private SuccessEnvelope envelope;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public SE() {
+        // for Externalizable
+    }
+
+    SE(final SuccessEnvelope envelope) {
+        this.envelope = requireNonNull(envelope);
+    }
+
+    @Override
+    public SuccessEnvelope envelope() {
+        return verifyNotNull(envelope);
+    }
+
+    @Override
+    public void setEnvelope(final SuccessEnvelope envelope) {
+        this.envelope = requireNonNull(envelope);
+    }
+
+    @Override
+    public SuccessEnvelope readExternal(final ObjectInput in, final long sessionId, final long txSequence,
+            final RequestSuccess<?, ?> message, final long executionTimeNanos) {
+        return new SuccessEnvelope(message, sessionId, txSequence, executionTimeNanos);
+    }
+
+    @Override
+    public Object readResolve() {
+        return envelope();
+    }
+}
index bf35c4931f00d402acbd6071b66ce1379618c5ad..0c6ed7a1123de42e6251b7d139864f8351081210 100644 (file)
@@ -7,10 +7,18 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
+import java.io.ObjectInput;
 
 public final class SuccessEnvelope extends ResponseEnvelope<RequestSuccess<?, ?>> {
-    @Serial
+    interface SerialForm extends ResponseEnvelope.SerialForm<RequestSuccess<?, ?>, SuccessEnvelope> {
+        @Override
+        default SuccessEnvelope readExternal(final ObjectInput in, final long sessionId, final long txSequence,
+                final RequestSuccess<?, ?> message, final long executionTimeNanos) {
+            return new SuccessEnvelope(message, sessionId, txSequence, executionTimeNanos);
+        }
+    }
+
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public SuccessEnvelope(final RequestSuccess<?, ?> message, final long sessionId, final long txSequence,
@@ -19,7 +27,13 @@ public final class SuccessEnvelope extends ResponseEnvelope<RequestSuccess<?, ?>
     }
 
     @Override
-    SuccessEnvelopeProxy createProxy() {
+    SE createProxy() {
+        return new SE(this);
+    }
+
+    @Override
+    SuccessEnvelopeProxy legacyProxy() {
         return new SuccessEnvelopeProxy(this);
     }
+
 }
index 76adbb193f02e082072235808eaaa7d9a475f956..20b46fcb50132ade8ea88282623d623544d2acbb 100644 (file)
@@ -7,10 +7,9 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
-
-final class SuccessEnvelopeProxy extends AbstractResponseEnvelopeProxy<RequestSuccess<?, ?>> {
-    @Serial
+final class SuccessEnvelopeProxy extends AbstractResponseEnvelopeProxy<RequestSuccess<?, ?>, SuccessEnvelope>
+        implements SuccessEnvelope.SerialForm {
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
@@ -23,10 +22,4 @@ final class SuccessEnvelopeProxy extends AbstractResponseEnvelopeProxy<RequestSu
     SuccessEnvelopeProxy(final SuccessEnvelope envelope) {
         super(envelope);
     }
-
-    @Override
-    ResponseEnvelope<RequestSuccess<?, ?>> createEnvelope(final RequestSuccess<?, ?> message, final long sessionId,
-            final long txSequence, final long executionTimeNanos) {
-        return new SuccessEnvelope(message, sessionId, txSequence, executionTimeNanos);
-    }
 }
diff --git a/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/TI.java b/opendaylight/md-sal/cds-access-api/src/main/java/org/opendaylight/controller/cluster/access/concepts/TI.java
new file mode 100644 (file)
index 0000000..653f4fc
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.access.concepts;
+
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Serialization proxy for {@link TransactionIdentifier}.
+ */
+final class TI implements TransactionIdentifier.SerialForm {
+    @java.io.Serial
+    private static final long serialVersionUID = 1L;
+
+    private TransactionIdentifier identifier;
+
+    @SuppressWarnings("checkstyle:RedundantModifier")
+    public TI() {
+        // for Externalizable
+    }
+
+    TI(final TransactionIdentifier identifier) {
+        this.identifier = requireNonNull(identifier);
+    }
+
+    @Override
+    public TransactionIdentifier identifier() {
+        return verifyNotNull(identifier);
+    }
+
+    @Override
+    public void setIdentifier(final TransactionIdentifier identifier) {
+        this.identifier = requireNonNull(identifier);
+    }
+
+    @Override
+    public Object readResolve() {
+        return identifier();
+    }
+}
index 29edfe8fda05861a6af1a44b274924b273a89210..b03e2cd5c34e0a2ddf468e49c4e8b16376f35f4b 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import java.io.DataInput;
@@ -15,7 +16,6 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.Serial;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
 import org.opendaylight.yangtools.concepts.WritableObjects;
@@ -24,12 +24,32 @@ import org.opendaylight.yangtools.concepts.WritableObjects;
  * Globally-unique identifier of a transaction.
  */
 public final class TransactionIdentifier implements WritableIdentifier {
-    private static final class Proxy implements Externalizable {
-        @Serial
+    interface SerialForm extends Externalizable {
+        @NonNull TransactionIdentifier identifier();
+
+        void setIdentifier(@NonNull TransactionIdentifier identifier);
+
+        @java.io.Serial
+        Object readResolve();
+
+        @Override
+        default void readExternal(final ObjectInput in) throws IOException {
+            setIdentifier(new TransactionIdentifier(LocalHistoryIdentifier.readFrom(in), WritableObjects.readLong(in)));
+        }
+
+        @Override
+        default void writeExternal(final ObjectOutput out) throws IOException {
+            final var id = identifier();
+            id.getHistoryId().writeTo(out);
+            WritableObjects.writeLong(out, id.getTransactionId());
+        }
+    }
+
+    private static final class Proxy implements SerialForm {
+        @java.io.Serial
         private static final long serialVersionUID = 1L;
 
-        private LocalHistoryIdentifier historyId;
-        private long transactionId;
+        private TransactionIdentifier identifier;
 
         // checkstyle flags the public modifier as redundant however it is explicitly needed for Java serialization to
         // be able to create instances via reflection.
@@ -38,30 +58,27 @@ public final class TransactionIdentifier implements WritableIdentifier {
             // For Externalizable
         }
 
-        Proxy(final LocalHistoryIdentifier historyId, final long transactionId) {
-            this.historyId = requireNonNull(historyId);
-            this.transactionId = transactionId;
+        Proxy(final TransactionIdentifier identifier) {
+            this.identifier = requireNonNull(identifier);
         }
 
         @Override
-        public void writeExternal(final ObjectOutput out) throws IOException {
-            historyId.writeTo(out);
-            WritableObjects.writeLong(out, transactionId);
+        public @NonNull TransactionIdentifier identifier() {
+            return verifyNotNull(identifier);
         }
 
         @Override
-        public void readExternal(final ObjectInput in) throws IOException {
-            historyId = LocalHistoryIdentifier.readFrom(in);
-            transactionId = WritableObjects.readLong(in);
+        public void setIdentifier(final TransactionIdentifier identifier) {
+            this.identifier = requireNonNull(identifier);
         }
 
-        @Serial
-        private Object readResolve() {
-            return new TransactionIdentifier(historyId, transactionId);
+        @Override
+        public Object readResolve() {
+            return identifier();
         }
     }
 
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     private final @NonNull LocalHistoryIdentifier historyId;
@@ -120,8 +137,8 @@ public final class TransactionIdentifier implements WritableIdentifier {
         return toShortString();
     }
 
-    @Serial
+    @java.io.Serial
     private Object writeReplace() {
-        return new Proxy(historyId, transactionId);
+        return new Proxy(this);
     }
 }
index 134a0a94f26b1b3f1964d2486a01ae0fc6609887..1de266d2851d2f14975f86f64f5a4b20971fefd4 100644 (file)
@@ -7,14 +7,12 @@
  */
 package org.opendaylight.controller.cluster.access.concepts;
 
-import java.io.Serial;
-
 /**
  * General error raised when the recipient of a {@link Request} determines that it does not know how to handle
  * the request.
  */
 public final class UnsupportedRequestException extends RequestException {
-    @Serial
+    @java.io.Serial
     private static final long serialVersionUID = 1L;
 
     public UnsupportedRequestException(final Request<?, ?> request) {
index 82d51e86a7eef966011650c5500b6abd4cc4cb5f..3f51399aba58796edfc64a7552c2fe04642866ff 100644 (file)
@@ -74,8 +74,13 @@ public class ConnectClientSuccessTest extends AbstractRequestSuccessTest<Connect
 
     @Test
     public void cloneAsVersionTest() {
-        final ConnectClientSuccess clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getAlternates(), clone.getAlternates());
+        assertEquals(OBJECT.getBackend(), clone.getBackend());
+        assertEquals(OBJECT.getDataTree(), clone.getDataTree());
+        assertEquals(OBJECT.getMaxMessages(), clone.getMaxMessages());
     }
 
     @Test
index f7777b3049963d5d0c6d09c4eb93cb1b92f47d49..9713794ef5e14114a9056d882d5c60b036cb3c61 100644 (file)
@@ -32,7 +32,10 @@ public class ExistsTransactionSuccessTest extends AbstractTransactionSuccessTest
 
     @Test
     public void cloneAsVersionTest() {
-        assertEquals(OBJECT, OBJECT.cloneAsVersion(ABIVersion.BORON));
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getExists(), clone.getExists());
     }
 
     @Test
index 54b63eeaa38d8b0d11e464f2d1820be6f9b65f93..ecec96df1483ba75564346b4bdf76a23bfe29f08 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.Assert.assertEquals;
 
 import org.junit.Test;
 import org.opendaylight.controller.cluster.access.ABIVersion;
@@ -21,7 +21,9 @@ public class LocalHistoryFailureTest extends AbstractRequestFailureTest<LocalHis
 
     @Test
     public void cloneAsVersionTest() {
-        final LocalHistoryFailure clone = OBJECT.cloneAsVersion(ABIVersion.current());
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getCause(), clone.getCause());
     }
 }
\ No newline at end of file
index ce1b0d98b7756a9ed01f078e99f1356e67cb5269..f6d72cc7d038ad5eaa92f1a5c7173258663e62de 100644 (file)
@@ -45,7 +45,11 @@ public class ModifyTransactionRequestEmptyTest extends AbstractTransactionReques
 
     @Test
     public void cloneAsVersionTest() {
-        assertEquals(OBJECT, OBJECT.cloneAsVersion(ABIVersion.BORON));
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getReplyTo(), clone.getReplyTo());
+        assertEquals(OBJECT.getPersistenceProtocol(), clone.getPersistenceProtocol());
     }
 
     @Override
index ad85c0f3ff53921823c8fba95699da480b9fc4e4..0d282fe60f79c5cf9a91eec869caeaca6966d801 100644 (file)
@@ -59,7 +59,12 @@ public class ModifyTransactionRequestTest extends AbstractTransactionRequestTest
 
     @Test
     public void cloneAsVersionTest() {
-        assertEquals(OBJECT, OBJECT.cloneAsVersion(ABIVersion.BORON));
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getReplyTo(), clone.getReplyTo());
+        assertEquals(OBJECT.getModifications(), clone.getModifications());
+        assertEquals(OBJECT.getPersistenceProtocol(), clone.getPersistenceProtocol());
     }
 
     @Override
index c0eced7a7764eece5a23115cbd4953308b69d9b9..4ab7740356f3cde4ff0058fecd17487ed124cbfa 100644 (file)
@@ -28,8 +28,10 @@ public class ReadTransactionSuccessNoDataTest extends AbstractTransactionSuccess
 
     @Test
     public void cloneAsVersionTest() {
-        final ReadTransactionSuccess clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getData(), clone.getData());
     }
 
     @Override
index e9193f8d8d69b75b96773e52faa4db937c377448..08d5b6571b0518461fa335c8e18d825e33d37107 100644 (file)
@@ -35,8 +35,10 @@ public class ReadTransactionSuccessTest extends AbstractTransactionSuccessTest<R
 
     @Test
     public void cloneAsVersionTest() {
-        final ReadTransactionSuccess clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getData(), clone.getData());
     }
 
     @Override
index 51bd58b3f8508d0dfbe000121e06d0d9e91d636b..92bc357814003f3d4cb60c93fdb11ca5958dd293 100644 (file)
@@ -24,7 +24,10 @@ public class SkipTransactionsRequestTest extends AbstractTransactionRequestTest<
 
     @Test
     public void cloneAsVersionTest() {
-        assertEquals(OBJECT, OBJECT.cloneAsVersion(ABIVersion.BORON));
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getReplyTo(), clone.getReplyTo());
     }
 
     @Override
index c4c3f0767e5167d337f94a027e632c048f64a353..67048c1c8d0712effc70251110a32d793fa03346 100644 (file)
@@ -21,7 +21,8 @@ public class SkipTransactionsResponseTest extends AbstractTransactionSuccessTest
 
     @Test
     public void cloneAsVersionTest() {
-        final SkipTransactionsResponse clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
     }
 }
\ No newline at end of file
index cf7ab56a9f0dcfcacc0d8dcea812464c7072ddb9..f5aefd7d6b1d277a97c955c227b2ddef59463c3f 100644 (file)
@@ -22,7 +22,10 @@ public class TransactionAbortRequestTest extends AbstractTransactionRequestTest<
 
     @Test
     public void cloneAsVersionTest() {
-        assertEquals(OBJECT, OBJECT.cloneAsVersion(ABIVersion.BORON));
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getReplyTo(), clone.getReplyTo());
     }
 
     @Override
index ee2a7198908073379b9336f37c144616fa8df5fa..eace872e18f79431601171cddefb2277def1111f 100644 (file)
@@ -21,7 +21,8 @@ public class TransactionAbortSuccessTest extends AbstractTransactionSuccessTest<
 
     @Test
     public void cloneAsVersionTest() {
-        final TransactionAbortSuccess clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
     }
 }
\ No newline at end of file
index 5d073f5a405b08da173a65406533e88c8e3fc1a4..1ffe0c0bbee148ae21ce8fac27104ce03994d183 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.Assert.assertEquals;
 
 import org.junit.Test;
 import org.opendaylight.controller.cluster.access.ABIVersion;
@@ -22,7 +22,8 @@ public class TransactionCanCommitSuccessTest extends AbstractTransactionSuccessT
 
     @Test
     public void cloneAsVersionTest() {
-        final TransactionCanCommitSuccess clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
     }
 }
\ No newline at end of file
index f4ac48225fffcf2c0854136e6851571ae2957cd9..de5719f815b5bacf1047f4aa18335c0fbdcc5a5b 100644 (file)
@@ -21,7 +21,8 @@ public class TransactionCommitSuccessTest extends AbstractTransactionSuccessTest
 
     @Test
     public void cloneAsVersionTest() {
-        final TransactionCommitSuccess clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
     }
 }
index 8e52cc976fd3052d5ea24252bc3639279cce6e8f..122ce4ce10943b294abc9a5eb1b2b0d00ab5d37e 100644 (file)
@@ -22,7 +22,10 @@ public class TransactionDoCommitRequestTest extends AbstractTransactionRequestTe
 
     @Test
     public void cloneAsVersionTest() {
-        assertEquals(OBJECT, OBJECT.cloneAsVersion(ABIVersion.BORON));
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getReplyTo(), clone.getReplyTo());
     }
 
     @Override
index ab50f4ad297de05a09480ea1d3c4447b6386394d..893883e2d70de5e017a65ef2ab5479f21698652e 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.controller.cluster.access.commands;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.Assert.assertEquals;
 
 import org.junit.Test;
 import org.opendaylight.controller.cluster.access.ABIVersion;
@@ -21,7 +21,9 @@ public class TransactionFailureTest extends AbstractRequestFailureTest<Transacti
 
     @Test
     public void cloneAsVersionTest() {
-        final TransactionFailure clone = OBJECT.cloneAsVersion(ABIVersion.current());
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getCause(), clone.getCause());
     }
 }
\ No newline at end of file
index e9dd25c0363c9a253fe189affc9f39c08eaa7717..8170986b71a1763c41a1fa42d05de258b8676732 100644 (file)
@@ -22,7 +22,10 @@ public class TransactionPreCommitRequestTest extends AbstractTransactionRequestT
 
     @Test
     public void cloneAsVersionTest() {
-        assertEquals(OBJECT, OBJECT.cloneAsVersion(ABIVersion.BORON));
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getReplyTo(), clone.getReplyTo());
     }
 
     @Override
index 505036f830057b1891432c7ca3d698c4787dc76b..bc12bb419f75010b4b9cfea5b7d5b91d6debdc3d 100644 (file)
@@ -22,7 +22,8 @@ public class TransactionPreCommitSuccessTest extends AbstractTransactionSuccessT
 
     @Test
     public void cloneAsVersionTest() {
-        final TransactionPreCommitSuccess clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
     }
 }
\ No newline at end of file
index 087b515816de56d221c67f3cdbaec3324670090b..507a0f1d0024906a48205d450abe83bcc810e211 100644 (file)
@@ -22,7 +22,10 @@ public class TransactionPurgeRequestTest extends AbstractTransactionRequestTest<
 
     @Test
     public void cloneAsVersionTest() {
-        assertEquals(OBJECT, OBJECT.cloneAsVersion(ABIVersion.BORON));
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
+        assertEquals(OBJECT.getReplyTo(), clone.getReplyTo());
     }
 
     @Override
index e44f8521cde3ea99708d98f67c8866f6da7afdee..e482244547bc1f3acf5ec902afdf2ce7c78b6ecf 100644 (file)
@@ -21,7 +21,8 @@ public class TransactionPurgeResponseTest extends AbstractTransactionSuccessTest
 
     @Test
     public void cloneAsVersionTest() {
-        final TransactionPurgeResponse clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
-        assertEquals(OBJECT, clone);
+        final var clone = OBJECT.cloneAsVersion(ABIVersion.BORON);
+        assertEquals(OBJECT.getSequence(), clone.getSequence());
+        assertEquals(OBJECT.getTarget(), clone.getTarget());
     }
 }
\ No newline at end of file
index 5bf162f059d0d8a603558ed417c8a2f23b8e5362..97015e9aff9ed7b07c912d41d8732499d8550c47 100644 (file)
@@ -11,7 +11,6 @@ import static org.junit.Assert.assertEquals;
 
 import java.io.DataInput;
 import java.io.IOException;
-import java.io.Serial;
 import org.apache.commons.lang.SerializationUtils;
 import org.opendaylight.controller.cluster.access.ABIVersion;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
@@ -35,7 +34,7 @@ public class FailureEnvelopeTest extends AbstractEnvelopeTest<FailureEnvelope> {
     }
 
     private static class MockRequestFailureProxy extends AbstractRequestFailureProxy<WritableIdentifier, MockFailure> {
-        @Serial
+        @java.io.Serial
         private static final long serialVersionUID = 5015515628523887221L;
 
         @SuppressWarnings("checkstyle:RedundantModifier")
@@ -48,19 +47,19 @@ public class FailureEnvelopeTest extends AbstractEnvelopeTest<FailureEnvelope> {
         }
 
         @Override
-        protected MockFailure createFailure(final WritableIdentifier target, final long sequence,
-                                            final RequestException failureCause) {
+        public MockFailure createFailure(final WritableIdentifier target, final long sequence,
+                final RequestException failureCause) {
             return new MockFailure(target, failureCause, sequence);
         }
 
         @Override
-        protected WritableIdentifier readTarget(final DataInput in) throws IOException {
+        public WritableIdentifier readTarget(final DataInput in) throws IOException {
             return TransactionIdentifier.readFrom(in);
         }
     }
 
     private static class MockFailure extends RequestFailure<WritableIdentifier, MockFailure> {
-        @Serial
+        @java.io.Serial
         private static final long serialVersionUID = 1L;
 
         MockFailure(final WritableIdentifier target, final RequestException cause, final long sequence) {
index b40aefb663ae11b80472cba459f0dbeb6d3a4f97..cb8794cdb5c88ba30fbc670a0d7ba7163bc87258 100644 (file)
@@ -64,7 +64,7 @@ public class TransmittingTransmitQueueTest extends AbstractTransmitQueueTest<Tra
     @Override
     protected TransmitQueue.Transmitting createQueue() {
         doReturn(false).when(mockMessageSlicer).slice(any());
-        backendInfo = new BackendInfo(probe.ref(), "test", 0L, ABIVersion.BORON, 3);
+        backendInfo = new BackendInfo(probe.ref(), "test", 0L, ABIVersion.current(), 3);
         return new TransmitQueue.Transmitting(new TransmitQueue.Halted(0), 0, backendInfo, now(), mockMessageSlicer);
     }