2424import com .mongodb .connection .ClusterConnectionMode ;
2525import com .mongodb .internal .TimeoutContext ;
2626import com .mongodb .internal .connection .MessageSequences .EmptyMessageSequences ;
27- import com .mongodb .internal .operation .ClientBulkWriteOperation .ClientBulkWriteCommand ;
2827import com .mongodb .internal .session .SessionContext ;
2928import com .mongodb .lang .Nullable ;
3029import org .bson .BsonArray ;
5756import static com .mongodb .connection .ServerType .STANDALONE ;
5857import static com .mongodb .internal .connection .BsonWriterHelper .appendElementsToDocument ;
5958import static com .mongodb .internal .connection .BsonWriterHelper .backpatchLength ;
60- import static com .mongodb .internal .connection .BsonWriterHelper .writeOpsAndNsInfo ;
59+ import static com .mongodb .internal .connection .BsonWriterHelper .writeDocumentsOfDualMessageSequences ;
6160import static com .mongodb .internal .connection .BsonWriterHelper .writePayload ;
6261import static com .mongodb .internal .connection .ByteBufBsonDocument .createList ;
6362import static com .mongodb .internal .connection .ByteBufBsonDocument .createOne ;
@@ -81,11 +80,11 @@ public final class CommandMessage extends RequestMessage {
8180 private final MessageSequences sequences ;
8281 private final boolean responseExpected ;
8382 /**
84- * {@code null} iff either {@link #sequences} is not of the {@link ClientBulkWriteCommand.OpsAndNsInfo } type,
83+ * {@code null} iff either {@link #sequences} is not of the {@link DualMessageSequences } type,
8584 * or it is of that type, but it has not been {@linkplain #encodeMessageBodyWithMetadata(ByteBufferBsonOutput, OperationContext) encoded}.
8685 */
8786 @ Nullable
88- private Boolean opsAndNsInfoRequireResponse ;
87+ private Boolean dualMessageSequencesRequireResponse ;
8988 private final ClusterConnectionMode clusterConnectionMode ;
9089 private final ServerApi serverApi ;
9190
@@ -122,7 +121,7 @@ public final class CommandMessage extends RequestMessage {
122121 this .commandFieldNameValidator = commandFieldNameValidator ;
123122 this .readPreference = readPreference ;
124123 this .responseExpected = responseExpected ;
125- opsAndNsInfoRequireResponse = null ;
124+ dualMessageSequencesRequireResponse = null ;
126125 this .exhaustAllowed = exhaustAllowed ;
127126 this .sequences = sequences ;
128127 this .clusterConnectionMode = notNull ("clusterConnectionMode" , clusterConnectionMode );
@@ -206,12 +205,11 @@ boolean isResponseExpected() {
206205 if (responseExpected ) {
207206 return true ;
208207 } else {
209- if (sequences instanceof ValidatableSplittablePayload ) {
210- ValidatableSplittablePayload validatableSplittablePayload = (ValidatableSplittablePayload ) sequences ;
211- SplittablePayload payload = validatableSplittablePayload .getSplittablePayload ();
208+ if (sequences instanceof SplittablePayload ) {
209+ SplittablePayload payload = (SplittablePayload ) sequences ;
212210 return payload .isOrdered () && payload .hasAnotherSplit ();
213- } else if (sequences instanceof ClientBulkWriteCommand . OpsAndNsInfo ) {
214- return assertNotNull (opsAndNsInfoRequireResponse );
211+ } else if (sequences instanceof DualMessageSequences ) {
212+ return assertNotNull (dualMessageSequencesRequireResponse );
215213 } else if (!(sequences instanceof EmptyMessageSequences )) {
216214 fail (sequences .toString ());
217215 }
@@ -233,38 +231,34 @@ protected EncodingMetadata encodeMessageBodyWithMetadata(final ByteBufferBsonOut
233231 bsonOutput .writeByte (0 ); // payload type
234232 commandStartPosition = bsonOutput .getPosition ();
235233 ArrayList <BsonElement > extraElements = getExtraElements (operationContext );
236- // `OpsAndNsInfo ` requires validation only if no response is expected, otherwise we must rely on the server validation
237- boolean validateDocumentSizeLimits = !(sequences instanceof ClientBulkWriteCommand . OpsAndNsInfo ) || !responseExpected ;
234+ // `DualMessageSequences ` requires validation only if no response is expected, otherwise we must rely on the server validation
235+ boolean validateDocumentSizeLimits = !(sequences instanceof DualMessageSequences ) || !responseExpected ;
238236
239237 int commandDocumentSizeInBytes = writeDocument (command , bsonOutput , commandFieldNameValidator , validateDocumentSizeLimits );
240- if (sequences instanceof ValidatableSplittablePayload ) {
238+ if (sequences instanceof SplittablePayload ) {
241239 appendElementsToDocument (bsonOutput , commandStartPosition , extraElements );
242- ValidatableSplittablePayload validatableSplittablePayload = (ValidatableSplittablePayload ) sequences ;
243- SplittablePayload payload = validatableSplittablePayload .getSplittablePayload ();
240+ SplittablePayload payload = (SplittablePayload ) sequences ;
244241 writeOpMsgSectionWithPayloadType1 (bsonOutput , payload .getPayloadName (), () -> {
245242 writePayload (
246- new BsonBinaryWriter (bsonOutput , validatableSplittablePayload .getFieldNameValidator ()),
243+ new BsonBinaryWriter (bsonOutput , payload .getFieldNameValidator ()),
247244 bsonOutput , getSettings (), messageStartPosition , payload , getSettings ().getMaxDocumentSize ()
248245 );
249246 return null ;
250247 });
251- } else if (sequences instanceof ClientBulkWriteCommand . OpsAndNsInfo ) {
252- ClientBulkWriteCommand . OpsAndNsInfo opsAndNsInfo = (ClientBulkWriteCommand . OpsAndNsInfo ) sequences ;
248+ } else if (sequences instanceof DualMessageSequences ) {
249+ DualMessageSequences dualMessageSequences = (DualMessageSequences ) sequences ;
253250 try (ByteBufferBsonOutput .Branch bsonOutputBranch2 = bsonOutput .branch ();
254251 ByteBufferBsonOutput .Branch bsonOutputBranch1 = bsonOutput .branch ()) {
255- ClientBulkWriteCommand . OpsAndNsInfo . EncodeResult opsAndNsInfoEncodeResult = writeOpMsgSectionWithPayloadType1 (
256- bsonOutputBranch1 , "ops" , () ->
257- writeOpMsgSectionWithPayloadType1 (bsonOutputBranch2 , "nsInfo" , () ->
258- writeOpsAndNsInfo (
259- opsAndNsInfo , commandDocumentSizeInBytes , bsonOutputBranch1 ,
252+ DualMessageSequences . EncodeDocumentsResult encodeDocumentsResult = writeOpMsgSectionWithPayloadType1 (
253+ bsonOutputBranch1 , dualMessageSequences . getFirstSequenceId () , () ->
254+ writeOpMsgSectionWithPayloadType1 (bsonOutputBranch2 , dualMessageSequences . getSecondSequenceId () , () ->
255+ writeDocumentsOfDualMessageSequences (
256+ dualMessageSequences , commandDocumentSizeInBytes , bsonOutputBranch1 ,
260257 bsonOutputBranch2 , getSettings (), validateDocumentSizeLimits )
261258 )
262259 );
263- opsAndNsInfoRequireResponse = opsAndNsInfoEncodeResult .isServerResponseRequired ();
264- Long txnNumber = opsAndNsInfoEncodeResult .getTxnNumber ();
265- if (txnNumber != null ) {
266- extraElements .add (new BsonElement (TXN_NUMBER_KEY , new BsonInt64 (txnNumber )));
267- }
260+ dualMessageSequencesRequireResponse = encodeDocumentsResult .isServerResponseRequired ();
261+ extraElements .addAll (encodeDocumentsResult .getExtraElements ());
268262 appendElementsToDocument (bsonOutput , commandStartPosition , extraElements );
269263 }
270264 } else if (sequences instanceof EmptyMessageSequences ) {
@@ -391,6 +385,11 @@ private void addReadConcernDocument(final List<BsonElement> extraElements, final
391385 }
392386 }
393387
388+ /**
389+ * @param sequenceId The identifier of the sequence contained in the {@code OP_MSG} section to be written.
390+ * @param writeDocumentsAction The action that writes the documents of the sequence.
391+ * @see <a href="https://github.com/mongodb/specifications/blob/master/source/message/OP_MSG.md">OP_MSG</a>
392+ */
394393 private <R > R writeOpMsgSectionWithPayloadType1 (
395394 final ByteBufferBsonOutput bsonOutput ,
396395 final String sequenceId ,
0 commit comments