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.
This commit is contained in:
Oliver Gierke
2011-07-08 13:04:25 +02:00
parent 4b4c35b904
commit ce0539a3dc
2 changed files with 24 additions and 6 deletions

View File

@@ -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<Object> items = new ArrayList<Object>();
Collection<Object> 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<Object> itemsToReturn = new ArrayList<Object>();
for (Object obj : items) {
itemsToReturn.add(obj);
}
return itemsToReturn;
return items;
}
Class<?> toType = findTypeToBeUsed((DBObject) sourceValue);

View File

@@ -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<Address> addresses;
}
class ClassWithMapProperty {