Skip to content

Commit 4429971

Browse files
committed
DATACMNS-390 - Added UUIDToBinaryConverter to be able to handle UUIDs by default.
1 parent 065a50b commit 4429971

File tree

5 files changed

+70
-25
lines changed

5 files changed

+70
-25
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java

+4
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@
3636
import org.springframework.data.mapping.model.SimpleTypeHolder;
3737
import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalToStringConverter;
3838
import org.springframework.data.mongodb.core.convert.MongoConverters.BigIntegerToStringConverter;
39+
import org.springframework.data.mongodb.core.convert.MongoConverters.BinaryToUUIDConverter;
3940
import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter;
4041
import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigIntegerConverter;
42+
import org.springframework.data.mongodb.core.convert.MongoConverters.UUIDToBinaryConverter;
4143
import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes;
4244
import org.springframework.util.Assert;
4345

@@ -89,6 +91,8 @@ public CustomConversions(List<?> converters) {
8991
this.converters.add(StringToBigDecimalConverter.INSTANCE);
9092
this.converters.add(BigIntegerToStringConverter.INSTANCE);
9193
this.converters.add(StringToBigIntegerConverter.INSTANCE);
94+
this.converters.add(UUIDToBinaryConverter.INSTANCE);
95+
this.converters.add(BinaryToUUIDConverter.INSTANCE);
9296
this.converters.addAll(converters);
9397

9498
for (Object c : this.converters) {

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2011 the original author or authors.
2+
* Copyright 2011-2012 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,18 +15,18 @@
1515
*/
1616
package org.springframework.data.mongodb.core.convert;
1717

18+
import java.io.UnsupportedEncodingException;
1819
import java.math.BigDecimal;
1920
import java.math.BigInteger;
21+
import java.util.UUID;
2022

21-
<<<<<<< HEAD
22-
=======
2323
import org.bson.BSON;
2424
import org.bson.types.Binary;
25-
>>>>>>> d1396e2... DATAMONGO-391 - Move to SLF4J for logging.
2625
import org.bson.types.ObjectId;
2726
import org.slf4j.Logger;
2827
import org.slf4j.LoggerFactory;
2928
import org.springframework.core.convert.converter.Converter;
29+
import org.springframework.data.mapping.model.MappingException;
3030
import org.springframework.util.StringUtils;
3131

3232
/**
@@ -126,8 +126,6 @@ public BigInteger convert(String source) {
126126
return StringUtils.hasText(source) ? new BigInteger(source) : null;
127127
}
128128
}
129-
<<<<<<< HEAD
130-
=======
131129

132130
/**
133131
* Custom {@link Converter} to convert {@link UUID}s into {@link Binary}s.
@@ -176,5 +174,4 @@ public UUID convert(Binary source) {
176174
}
177175
}
178176
}
179-
>>>>>>> d1396e2... DATAMONGO-391 - Move to SLF4J for logging.
180177
}

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Set;
2222
import java.util.regex.Pattern;
2323

24+
import org.bson.types.Binary;
2425
import org.bson.types.CodeWScope;
2526
import org.bson.types.ObjectId;
2627
import org.springframework.data.mapping.model.SimpleTypeHolder;
@@ -50,6 +51,7 @@ public abstract class MongoSimpleTypes {
5051
simpleTypes.add(CodeWScope.class);
5152
simpleTypes.add(DBObject.class);
5253
simpleTypes.add(Pattern.class);
54+
simpleTypes.add(Binary.class);
5355
MONGO_SIMPLE_TYPES = Collections.unmodifiableSet(simpleTypes);
5456
}
5557

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java

+39-17
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
import static org.hamcrest.Matchers.*;
44
import static org.junit.Assert.*;
55

6+
import java.text.DateFormat;
7+
import java.text.Format;
68
import java.util.Arrays;
79
import java.util.Locale;
810
import java.util.UUID;
911

12+
import org.bson.types.Binary;
1013
import org.bson.types.ObjectId;
1114
import org.junit.Test;
1215
import org.springframework.core.convert.converter.Converter;
13-
import org.springframework.core.convert.support.ConversionServiceFactory;
16+
import org.springframework.core.convert.support.DefaultConversionService;
1417
import org.springframework.core.convert.support.GenericConversionService;
1518
import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigIntegerConverter;
1619

@@ -27,13 +30,13 @@ public class CustomConversionsUnitTests {
2730
@SuppressWarnings("unchecked")
2831
public void findsBasicReadAndWriteConversions() {
2932

30-
CustomConversions conversions = new CustomConversions(Arrays.asList(UuidToStringConverter.INSTANCE,
31-
StringToUUIDConverter.INSTANCE));
33+
CustomConversions conversions = new CustomConversions(Arrays.asList(FormatToStringConverter.INSTANCE,
34+
StringToFormatConverter.INSTANCE));
3235

33-
assertThat(conversions.getCustomWriteTarget(UUID.class, null), is(typeCompatibleWith(String.class)));
36+
assertThat(conversions.getCustomWriteTarget(Format.class, null), is(typeCompatibleWith(String.class)));
3437
assertThat(conversions.getCustomWriteTarget(String.class, null), is(nullValue()));
3538

36-
assertThat(conversions.hasCustomReadTarget(String.class, UUID.class), is(true));
39+
assertThat(conversions.hasCustomReadTarget(String.class, Format.class), is(true));
3740
assertThat(conversions.hasCustomReadTarget(String.class, Locale.class), is(false));
3841
}
3942

@@ -51,7 +54,7 @@ public void considersSubtypesCorrectly() {
5154
@Test
5255
public void considersTypesWeRegisteredConvertersForAsSimple() {
5356

54-
CustomConversions conversions = new CustomConversions(Arrays.asList(UuidToStringConverter.INSTANCE));
57+
CustomConversions conversions = new CustomConversions(Arrays.asList(FormatToStringConverter.INSTANCE));
5558
assertThat(conversions.isSimpleType(UUID.class), is(true));
5659
}
5760

@@ -95,23 +98,22 @@ public void considersDBRefsToBeSimpleTypes() {
9598
@Test
9699
public void populatesConversionServiceCorrectly() {
97100

98-
@SuppressWarnings("deprecation")
99-
GenericConversionService conversionService = ConversionServiceFactory.createDefaultConversionService();
101+
GenericConversionService conversionService = new DefaultConversionService();
100102
assertThat(conversionService.canConvert(String.class, UUID.class), is(false));
101103

102-
CustomConversions conversions = new CustomConversions(Arrays.asList(StringToUUIDConverter.INSTANCE));
104+
CustomConversions conversions = new CustomConversions(Arrays.asList(StringToFormatConverter.INSTANCE));
103105
conversions.registerConvertersIn(conversionService);
104106

105-
assertThat(conversionService.canConvert(String.class, UUID.class), is(true));
107+
assertThat(conversionService.canConvert(String.class, Format.class), is(true));
106108
}
107109

108110
/**
109111
* @see DATAMONGO-259
110112
*/
111113
@Test
112114
public void doesNotConsiderTypeSimpleIfOnlyReadConverterIsRegistered() {
113-
CustomConversions conversions = new CustomConversions(Arrays.asList(StringToUUIDConverter.INSTANCE));
114-
assertThat(conversions.isSimpleType(UUID.class), is(false));
115+
CustomConversions conversions = new CustomConversions(Arrays.asList(StringToFormatConverter.INSTANCE));
116+
assertThat(conversions.isSimpleType(Format.class), is(false));
115117
}
116118

117119
/**
@@ -140,18 +142,38 @@ public void doesNotHaveConverterForStringToBigIntegerByDefault() {
140142
assertThat(conversions.getCustomWriteTarget(String.class), is(nullValue()));
141143
}
142144

143-
enum UuidToStringConverter implements Converter<UUID, String> {
145+
/**
146+
* @see DATAMONGO-390
147+
*/
148+
@Test
149+
public void considersBinaryASimpleType() {
150+
151+
CustomConversions conversions = new CustomConversions();
152+
assertThat(conversions.isSimpleType(Binary.class), is(true));
153+
}
154+
155+
/**
156+
* @see DATAMONGO-390
157+
*/
158+
@Test
159+
public void convertsUUIDsToBinaryByDefault() {
160+
161+
CustomConversions conversions = new CustomConversions();
162+
assertThat(conversions.hasCustomWriteTarget(UUID.class), is(true));
163+
}
164+
165+
enum FormatToStringConverter implements Converter<Format, String> {
144166
INSTANCE;
145167

146-
public String convert(UUID source) {
168+
public String convert(Format source) {
147169
return source.toString();
148170
}
149171
}
150172

151-
enum StringToUUIDConverter implements Converter<String, UUID> {
173+
enum StringToFormatConverter implements Converter<String, Format> {
152174
INSTANCE;
153-
public UUID convert(String source) {
154-
return UUID.fromString(source);
175+
public Format convert(String source) {
176+
return DateFormat.getInstance();
155177
}
156178
}
157179

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java

+21-1
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@
1919
import static org.junit.Assert.*;
2020

2121
import java.math.BigDecimal;
22+
import java.util.UUID;
2223

24+
import org.bson.BSON;
25+
import org.bson.types.Binary;
2326
import org.junit.Test;
24-
import org.springframework.data.mongodb.core.convert.MongoConverters;
2527
import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalToStringConverter;
28+
import org.springframework.data.mongodb.core.convert.MongoConverters.BinaryToUUIDConverter;
2629
import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter;
30+
import org.springframework.data.mongodb.core.convert.MongoConverters.UUIDToBinaryConverter;
2731

2832
/**
2933
* Unit tests for {@link MongoConverters}.
@@ -42,4 +46,20 @@ public void convertsBigDecimalToStringAndBackCorrectly() {
4246
BigDecimal reference = StringToBigDecimalConverter.INSTANCE.convert(value);
4347
assertThat(reference, is(bigDecimal));
4448
}
49+
50+
/**
51+
* @see DATAMONGO-390
52+
*/
53+
@Test
54+
public void convertsUUIDToBinaryCorrectly() {
55+
56+
UUID uuid = UUID.randomUUID();
57+
Binary binary = UUIDToBinaryConverter.INSTANCE.convert(uuid);
58+
59+
assertThat(binary, is(notNullValue()));
60+
assertThat(binary.getType(), is(BSON.B_UUID));
61+
62+
UUID result = BinaryToUUIDConverter.INSTANCE.convert(binary);
63+
assertThat(result, is(uuid));
64+
}
4565
}

0 commit comments

Comments
 (0)