From ce0539a3dc454d2c7b79f3d74b4e0a7f0b142855 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Fri, 8 Jul 2011 13:04:25 +0200 Subject: [PATCH] DATADOC-192 - MappingMongoConverter handles collections correctly now. Replaced hard coded List creation with delegate to Spring's CollectionFactory. Although the List should get converted before setting the value we can prevent that additional step by looking up the correct collection type upfront. --- .../mongodb/convert/MappingMongoConverter.java | 12 ++++++------ .../MappingMongoConverterUnitTests.java | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/convert/MappingMongoConverter.java index f5311db19..f3cd2bb6b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/convert/MappingMongoConverter.java @@ -644,6 +644,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App } + @SuppressWarnings("unchecked") protected Object getValueInternal(MongoPersistentProperty prop, DBObject dbo, StandardEvaluationContext ctx, String spelExpr) { Object o; @@ -674,8 +675,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App // It's empty return Array.newInstance(prop.getComponentType(), 0); } else if (prop.isCollection() && sourceValue instanceof BasicDBList) { + BasicDBList dbObjList = (BasicDBList) sourceValue; - List items = new ArrayList(); + Collection items = CollectionFactory.createCollection(propertyType, dbObjList.size()); + for (int i = 0; i < dbObjList.size(); i++) { Object dbObjItem = dbObjList.get(i); if (dbObjItem instanceof DBRef) { @@ -686,11 +689,8 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App items.add(dbObjItem); } } - List itemsToReturn = new ArrayList(); - for (Object obj : items) { - itemsToReturn.add(obj); - } - return itemsToReturn; + + return items; } Class toType = findTypeToBeUsed((DBObject) sourceValue); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/convert/MappingMongoConverterUnitTests.java index 590a5d1e8..900b606e6 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/convert/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/convert/MappingMongoConverterUnitTests.java @@ -29,6 +29,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; + import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Test; @@ -363,6 +365,20 @@ public class MappingMongoConverterUnitTests { assertThat(typedOuterString.size(), is(1)); } + /** + * @see DATADOC-192 + */ + @Test + public void readsEmptySetsCorrectly() { + + Person person = new Person(); + person.addresses = Collections.emptySet(); + + DBObject dbObject = new BasicDBObject(); + converter.write(person, dbObject); + converter.read(Person.class, dbObject); + } + class ClassWithEnumProperty { SampleEnum sampleEnum; @@ -386,6 +402,8 @@ public class MappingMongoConverterUnitTests { @Field("foo") String firstname; + + Set
addresses; } class ClassWithMapProperty {