Skip to content

Commit c5886fb

Browse files
committed
Ensure BasicDBObject equals/hashCode works with UUID values (#688)
JAVA-4051
1 parent 33d6017 commit c5886fb

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

driver-core/src/main/com/mongodb/BasicDBObject.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
import org.bson.BsonBinaryWriter;
2222
import org.bson.BsonDocument;
2323
import org.bson.BsonDocumentWrapper;
24+
import org.bson.UuidRepresentation;
2425
import org.bson.codecs.Decoder;
2526
import org.bson.codecs.DecoderContext;
2627
import org.bson.codecs.Encoder;
2728
import org.bson.codecs.EncoderContext;
2829
import org.bson.codecs.configuration.CodecRegistry;
2930
import org.bson.conversions.Bson;
31+
import org.bson.internal.CodecRegistryHelper;
3032
import org.bson.io.BasicOutputBuffer;
3133
import org.bson.io.OutputBuffer;
3234
import org.bson.json.JsonMode;
@@ -220,10 +222,15 @@ public int hashCode() {
220222
return Arrays.hashCode(toBson(canonicalizeBSONObject(this)));
221223
}
222224

225+
/**
226+
* Convert the object to its BSON representation, using the {@code STANDARD} representation for UUID. This is safe to do in the context
227+
* of this class because currently this method is only used for equality and hash code, and is not passed to any other parts of the
228+
* library.
229+
*/
223230
private static byte[] toBson(final DBObject dbObject) {
224231
OutputBuffer outputBuffer = new BasicOutputBuffer();
225-
DBObjectCodec.getDefaultRegistry().get(DBObject.class).encode(new BsonBinaryWriter(outputBuffer), dbObject,
226-
EncoderContext.builder().build());
232+
CodecRegistryHelper.createRegistry(DBObjectCodec.getDefaultRegistry(), UuidRepresentation.STANDARD)
233+
.get(DBObject.class).encode(new BsonBinaryWriter(outputBuffer), dbObject, EncoderContext.builder().build());
227234
return outputBuffer.toByteArray();
228235
}
229236

driver-core/src/test/unit/com/mongodb/BasicDBObjectTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.HashMap;
3131
import java.util.Map;
3232
import java.util.TreeMap;
33+
import java.util.UUID;
3334

3435
import static java.util.Arrays.asList;
3536
import static org.hamcrest.CoreMatchers.not;
@@ -218,6 +219,15 @@ public void testEqualsAndHashCode() {
218219
assertEquality(new BasicDBObject("a", first), new BasicBSONObject("a", third));
219220
}
220221

222+
@Test
223+
public void testUuid() {
224+
UUID uuid = UUID.randomUUID();
225+
BasicDBObject dbo1 = new BasicDBObject("_id", uuid);
226+
BasicDBObject dbo2 = new BasicDBObject("_id", uuid);
227+
228+
assertEquality(dbo1, dbo2);
229+
}
230+
221231
void assertEquality(final BSONObject x, final BSONObject y) {
222232
assertEquals(x, y);
223233
assertEquals(y, x);

0 commit comments

Comments
 (0)