/** * Construct a new instance from the given UUID and UuidRepresentation * * @param uuid the UUID * @param uuidRepresentation the UUID representation * @since 3.9 */ public BsonBinary(final UUID uuid, final UuidRepresentation uuidRepresentation) { if (uuid == null) { throw new IllegalArgumentException("uuid may not be null"); } if (uuidRepresentation == null) { throw new IllegalArgumentException("uuidRepresentation may not be null"); } this.data = UuidHelper.encodeUuidToBinary(uuid, uuidRepresentation); this.type = uuidRepresentation == UuidRepresentation.STANDARD ? BsonBinarySubType.UUID_STANDARD.getValue() : BsonBinarySubType.UUID_LEGACY.getValue(); }
public static UUID decodeBinaryToUuid(final byte[] data, final byte type, final UuidRepresentation uuidRepresentation) { if (data.length != 16) { throw new BsonSerializationException(String.format("Expected length to be 16, not %d.", data.length)); } if (type == BsonBinarySubType.UUID_LEGACY.getValue()) { switch(uuidRepresentation) { case C_SHARP_LEGACY: reverseByteArray(data, 0, 4); reverseByteArray(data, 4, 2); reverseByteArray(data, 6, 2); break; case JAVA_LEGACY: reverseByteArray(data, 0, 8); reverseByteArray(data, 8, 8); break; case PYTHON_LEGACY: case STANDARD: break; default: throw new BSONException("Unexpected UUID representation"); } } return new UUID(readLongFromArrayBigEndian(data, 0), readLongFromArrayBigEndian(data, 8)); }
public static byte[] encodeUuidToBinary(final UUID uuid, final UuidRepresentation uuidRepresentation) { byte[] binaryData = new byte[16]; writeLongToArrayBigEndian(binaryData, 0, uuid.getMostSignificantBits()); writeLongToArrayBigEndian(binaryData, 8, uuid.getLeastSignificantBits()); switch(uuidRepresentation) { case C_SHARP_LEGACY: reverseByteArray(binaryData, 0, 4); reverseByteArray(binaryData, 4, 2); reverseByteArray(binaryData, 6, 2); break; case JAVA_LEGACY: reverseByteArray(binaryData, 0, 8); reverseByteArray(binaryData, 8, 8); break; case PYTHON_LEGACY: case STANDARD: break; default: throw new BSONException("Unexpected UUID representation"); } return binaryData; }
/** * Returns the binary as a UUID. The binary type must be 4. * * @return the uuid * @since 3.9 */ public UUID asUuid() { if (!BsonBinarySubType.isUuid(type)) { throw new BsonInvalidOperationException("type must be a UUID subtype."); } if (type != BsonBinarySubType.UUID_STANDARD.getValue()) { throw new BsonInvalidOperationException("uuidRepresentation must be set to return the correct UUID."); } return UuidHelper.decodeBinaryToUuid(this.data.clone(), this.type, UuidRepresentation.STANDARD); }
@Override public UUID decode(final BsonReader reader, final DecoderContext decoderContext) { byte subType = reader.peekBinarySubType(); if (subType != BsonBinarySubType.UUID_LEGACY.getValue() && subType != BsonBinarySubType.UUID_STANDARD.getValue()) { throw new BSONException("Unexpected BsonBinarySubType"); } byte[] bytes = reader.readBinaryData().getData(); return UuidHelper.decodeBinaryToUuid(bytes, subType, decoderUuidRepresentation); }
/** * Returns the binary as a UUID. * * @param uuidRepresentation the UUID representation * @return the uuid * @since 3.9 */ public UUID asUuid(final UuidRepresentation uuidRepresentation) { Assertions.notNull("uuidRepresentation", uuidRepresentation); final byte uuidType = uuidRepresentation == UuidRepresentation.STANDARD ? BsonBinarySubType.UUID_STANDARD.getValue() : BsonBinarySubType.UUID_LEGACY.getValue(); if (type != uuidType) { throw new BsonInvalidOperationException("uuidRepresentation does not match current uuidRepresentation."); } return UuidHelper.decodeBinaryToUuid(data.clone(), type, uuidRepresentation); }
@Override public void encode(final BsonWriter writer, final UUID value, final EncoderContext encoderContext) { byte[] binaryData = UuidHelper.encodeUuidToBinary(value, encoderUuidRepresentation); // changed the default subtype to STANDARD since 3.0 if (encoderUuidRepresentation == UuidRepresentation.STANDARD) { writer.writeBinaryData(new BsonBinary(BsonBinarySubType.UUID_STANDARD, binaryData)); } else { writer.writeBinaryData(new BsonBinary(BsonBinarySubType.UUID_LEGACY, binaryData)); } }