+ CommitTransactionPayload() {
+
+ }
+
+ public static @NonNull CommitTransactionPayload create(final TransactionIdentifier transactionId,
+ final DataTreeCandidate candidate, final PayloadVersion version, final int initialSerializedBufferCapacity)
+ throws IOException {
+ final ChunkedOutputStream cos = new ChunkedOutputStream(initialSerializedBufferCapacity);
+ try (DataOutputStream dos = new DataOutputStream(cos)) {
+ transactionId.writeTo(dos);
+ DataTreeCandidateInputOutput.writeDataTreeCandidate(dos, version, candidate);
+ }
+
+ final Variant<byte[], ChunkedByteArray> source = cos.toVariant();
+ LOG.debug("Initial buffer capacity {}, actual serialized size {}", initialSerializedBufferCapacity, cos.size());
+ return source.isFirst() ? new Simple(source.getFirst()) : new Chunked(source.getSecond());
+ }
+
+ @VisibleForTesting
+ public static @NonNull CommitTransactionPayload create(final TransactionIdentifier transactionId,
+ final DataTreeCandidate candidate, final PayloadVersion version) throws IOException {
+ return create(transactionId, candidate, version, 512);
+ }
+
+ @VisibleForTesting
+ public static @NonNull CommitTransactionPayload create(final TransactionIdentifier transactionId,
+ final DataTreeCandidate candidate) throws IOException {
+ return create(transactionId, candidate, PayloadVersion.current());
+ }
+
+ public @NonNull Entry<TransactionIdentifier, DataTreeCandidateWithVersion> getCandidate() throws IOException {
+ Entry<TransactionIdentifier, DataTreeCandidateWithVersion> localCandidate = candidate;
+ if (localCandidate == null) {
+ synchronized (this) {
+ localCandidate = candidate;
+ if (localCandidate == null) {
+ candidate = localCandidate = getCandidate(ReusableImmutableNormalizedNodeStreamWriter.create());
+ }
+ }