Skip to content

Commit 07f0f3e

Browse files
committed
Decrement the level of BsonWriter after checking _id in
IdHoldingBsonWriter.writeEndArray JAVA-3622
1 parent 0ef0b35 commit 07f0f3e

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

driver-core/src/main/com/mongodb/internal/connection/IdHoldingBsonWriter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,14 @@ public void writeStartArray(final String name) {
127127

128128
@Override
129129
public void writeEndArray() {
130-
super.writeEndArray();
131-
132130
if (isWritingId()) {
133131
getIdBsonWriter().writeEndArray();
134132
if (getIdBsonWriter().getCurrentLevel() == 0) {
135133
getIdBsonWriter().writeEndDocument();
136134
id = new RawBsonDocument(getBytes()).get(ID_FIELD_NAME);
137135
}
138136
}
137+
super.writeEndArray();
139138
}
140139

141140
@Override

driver-core/src/test/unit/com/mongodb/internal/connection/IdHoldingBsonWriterSpecification.groovy

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616

1717
package com.mongodb.internal.connection
1818

19+
import org.bson.BsonArray
1920
import org.bson.BsonBinaryReader
2021
import org.bson.BsonBinaryWriter
2122
import org.bson.BsonDocument
23+
import org.bson.BsonObjectId
2224
import org.bson.codecs.BsonDocumentCodec
2325
import org.bson.codecs.DecoderContext
2426
import org.bson.codecs.EncoderContext
@@ -72,6 +74,20 @@ class IdHoldingBsonWriterSpecification extends Specification {
7274
id << getBsonValues()
7375
}
7476

77+
def 'serialize document with list of documents that contain an _id field'() {
78+
def bsonBinaryWriter = new BsonBinaryWriter(new BasicOutputBuffer())
79+
def idTrackingBsonWriter = new IdHoldingBsonWriter(bsonBinaryWriter)
80+
def document = new BsonDocument('_id', new BsonObjectId())
81+
.append('items', new BsonArray(Collections.singletonList(new BsonDocument('_id', new BsonObjectId()))))
82+
83+
when:
84+
new BsonDocumentCodec().encode(idTrackingBsonWriter, document, EncoderContext.builder().build())
85+
def encodedDocument = getEncodedDocument(bsonBinaryWriter.getBsonOutput())
86+
87+
then:
88+
encodedDocument == document
89+
}
90+
7591
private static BsonDocument getEncodedDocument(BsonOutput buffer) {
7692
new BsonDocumentCodec().decode(new BsonBinaryReader(buffer.getByteBuffers().get(0).asNIO()),
7793
DecoderContext.builder().build())

0 commit comments

Comments
 (0)