diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java index 997a08cef..a8e1dabdc 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java @@ -36,8 +36,10 @@ import org.springframework.data.convert.WritingConverter; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalToStringConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.BigIntegerToStringConverter; +import org.springframework.data.mongodb.core.convert.MongoConverters.BinaryToUUIDConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigIntegerConverter; +import org.springframework.data.mongodb.core.convert.MongoConverters.UUIDToBinaryConverter; import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes; import org.springframework.util.Assert; @@ -89,6 +91,8 @@ public class CustomConversions { this.converters.add(StringToBigDecimalConverter.INSTANCE); this.converters.add(BigIntegerToStringConverter.INSTANCE); this.converters.add(StringToBigIntegerConverter.INSTANCE); + this.converters.add(UUIDToBinaryConverter.INSTANCE); + this.converters.add(BinaryToUUIDConverter.INSTANCE); this.converters.addAll(converters); for (Object c : this.converters) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java index 50ddc2491..14696c332 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,18 +15,18 @@ */ package org.springframework.data.mongodb.core.convert; +import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.UUID; -<<<<<<< HEAD -======= import org.bson.BSON; import org.bson.types.Binary; ->>>>>>> d1396e2... DATAMONGO-391 - Move to SLF4J for logging. import org.bson.types.ObjectId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.convert.converter.Converter; +import org.springframework.data.mapping.model.MappingException; import org.springframework.util.StringUtils; /** @@ -126,8 +126,6 @@ abstract class MongoConverters { return StringUtils.hasText(source) ? new BigInteger(source) : null; } } -<<<<<<< HEAD -======= /** * Custom {@link Converter} to convert {@link UUID}s into {@link Binary}s. @@ -176,5 +174,4 @@ abstract class MongoConverters { } } } ->>>>>>> d1396e2... DATAMONGO-391 - Move to SLF4J for logging. } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java index ac31a9986..8a670c88a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoSimpleTypes.java @@ -21,6 +21,7 @@ import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; +import org.bson.types.Binary; import org.bson.types.CodeWScope; import org.bson.types.ObjectId; import org.springframework.data.mapping.model.SimpleTypeHolder; @@ -50,6 +51,7 @@ public abstract class MongoSimpleTypes { simpleTypes.add(CodeWScope.class); simpleTypes.add(DBObject.class); simpleTypes.add(Pattern.class); + simpleTypes.add(Binary.class); MONGO_SIMPLE_TYPES = Collections.unmodifiableSet(simpleTypes); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java index 8049d5fa1..4dbf8079b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/CustomConversionsUnitTests.java @@ -3,14 +3,17 @@ package org.springframework.data.mongodb.core.convert; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import java.text.DateFormat; +import java.text.Format; import java.util.Arrays; import java.util.Locale; import java.util.UUID; +import org.bson.types.Binary; import org.bson.types.ObjectId; import org.junit.Test; import org.springframework.core.convert.converter.Converter; -import org.springframework.core.convert.support.ConversionServiceFactory; +import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.convert.support.GenericConversionService; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigIntegerConverter; @@ -27,13 +30,13 @@ public class CustomConversionsUnitTests { @SuppressWarnings("unchecked") public void findsBasicReadAndWriteConversions() { - CustomConversions conversions = new CustomConversions(Arrays.asList(UuidToStringConverter.INSTANCE, - StringToUUIDConverter.INSTANCE)); + CustomConversions conversions = new CustomConversions(Arrays.asList(FormatToStringConverter.INSTANCE, + StringToFormatConverter.INSTANCE)); - assertThat(conversions.getCustomWriteTarget(UUID.class, null), is(typeCompatibleWith(String.class))); + assertThat(conversions.getCustomWriteTarget(Format.class, null), is(typeCompatibleWith(String.class))); assertThat(conversions.getCustomWriteTarget(String.class, null), is(nullValue())); - assertThat(conversions.hasCustomReadTarget(String.class, UUID.class), is(true)); + assertThat(conversions.hasCustomReadTarget(String.class, Format.class), is(true)); assertThat(conversions.hasCustomReadTarget(String.class, Locale.class), is(false)); } @@ -51,7 +54,7 @@ public class CustomConversionsUnitTests { @Test public void considersTypesWeRegisteredConvertersForAsSimple() { - CustomConversions conversions = new CustomConversions(Arrays.asList(UuidToStringConverter.INSTANCE)); + CustomConversions conversions = new CustomConversions(Arrays.asList(FormatToStringConverter.INSTANCE)); assertThat(conversions.isSimpleType(UUID.class), is(true)); } @@ -95,14 +98,13 @@ public class CustomConversionsUnitTests { @Test public void populatesConversionServiceCorrectly() { - @SuppressWarnings("deprecation") - GenericConversionService conversionService = ConversionServiceFactory.createDefaultConversionService(); + GenericConversionService conversionService = new DefaultConversionService(); assertThat(conversionService.canConvert(String.class, UUID.class), is(false)); - CustomConversions conversions = new CustomConversions(Arrays.asList(StringToUUIDConverter.INSTANCE)); + CustomConversions conversions = new CustomConversions(Arrays.asList(StringToFormatConverter.INSTANCE)); conversions.registerConvertersIn(conversionService); - assertThat(conversionService.canConvert(String.class, UUID.class), is(true)); + assertThat(conversionService.canConvert(String.class, Format.class), is(true)); } /** @@ -110,8 +112,8 @@ public class CustomConversionsUnitTests { */ @Test public void doesNotConsiderTypeSimpleIfOnlyReadConverterIsRegistered() { - CustomConversions conversions = new CustomConversions(Arrays.asList(StringToUUIDConverter.INSTANCE)); - assertThat(conversions.isSimpleType(UUID.class), is(false)); + CustomConversions conversions = new CustomConversions(Arrays.asList(StringToFormatConverter.INSTANCE)); + assertThat(conversions.isSimpleType(Format.class), is(false)); } /** @@ -140,18 +142,38 @@ public class CustomConversionsUnitTests { assertThat(conversions.getCustomWriteTarget(String.class), is(nullValue())); } - enum UuidToStringConverter implements Converter { + /** + * @see DATAMONGO-390 + */ + @Test + public void considersBinaryASimpleType() { + + CustomConversions conversions = new CustomConversions(); + assertThat(conversions.isSimpleType(Binary.class), is(true)); + } + + /** + * @see DATAMONGO-390 + */ + @Test + public void convertsUUIDsToBinaryByDefault() { + + CustomConversions conversions = new CustomConversions(); + assertThat(conversions.hasCustomWriteTarget(UUID.class), is(true)); + } + + enum FormatToStringConverter implements Converter { INSTANCE; - public String convert(UUID source) { + public String convert(Format source) { return source.toString(); } } - enum StringToUUIDConverter implements Converter { + enum StringToFormatConverter implements Converter { INSTANCE; - public UUID convert(String source) { - return UUID.fromString(source); + public Format convert(String source) { + return DateFormat.getInstance(); } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java index d9120ebfe..dcc53c9eb 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MongoConvertersUnitTests.java @@ -19,11 +19,15 @@ import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import java.math.BigDecimal; +import java.util.UUID; +import org.bson.BSON; +import org.bson.types.Binary; import org.junit.Test; -import org.springframework.data.mongodb.core.convert.MongoConverters; import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalToStringConverter; +import org.springframework.data.mongodb.core.convert.MongoConverters.BinaryToUUIDConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter; +import org.springframework.data.mongodb.core.convert.MongoConverters.UUIDToBinaryConverter; /** * Unit tests for {@link MongoConverters}. @@ -42,4 +46,20 @@ public class MongoConvertersUnitTests { BigDecimal reference = StringToBigDecimalConverter.INSTANCE.convert(value); assertThat(reference, is(bigDecimal)); } + + /** + * @see DATAMONGO-390 + */ + @Test + public void convertsUUIDToBinaryCorrectly() { + + UUID uuid = UUID.randomUUID(); + Binary binary = UUIDToBinaryConverter.INSTANCE.convert(uuid); + + assertThat(binary, is(notNullValue())); + assertThat(binary.getType(), is(BSON.B_UUID)); + + UUID result = BinaryToUUIDConverter.INSTANCE.convert(binary); + assertThat(result, is(uuid)); + } }