DATADOC-209 - MappingMongoConverter handles collections of enums correctly now.

This commit is contained in:
Oliver Gierke
2011-07-22 17:52:48 +02:00
parent 101064769c
commit e1daf36ed8
2 changed files with 82 additions and 6 deletions

View File

@@ -535,7 +535,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
Class<?> elementType = element.getClass();
if (conversions.isSimpleType(elementType)) {
dbList.add(element);
dbList.add(getPotentiallyConvertedSimpleWrite(element));
} else if (element instanceof Collection || elementType.isArray()) {
dbList.add(createCollectionDBObject(componentType, asCollection(element)));
} else {
@@ -601,16 +601,55 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
* @param dbObject
*/
private void writeSimpleInternal(String key, Object value, DBObject dbObject) {
dbObject.put(key, getPotentiallyConvertedSimpleWrite(value));
}
/**
* Checks whether we have a custom conversion registered for the given value into an arbitrary simple Mongo type.
* Returns the converted value if so. If not, we perform special enum handling or simply return the value as is.
*
* @param value
* @return
*/
private Object getPotentiallyConvertedSimpleWrite(Object value) {
if (value == null) {
return null;
}
Class<?> customTarget = conversions.getCustomWriteTarget(value.getClass(), null);
Object valueToSet = null;
if (customTarget != null) {
valueToSet = conversionService.convert(value, customTarget);
return conversionService.convert(value, customTarget);
} else {
valueToSet = value.getClass().isEnum() ? ((Enum<?>) value).name() : value;
return value.getClass().isEnum() ? ((Enum<?>) value).name() : value;
}
dbObject.put(key, valueToSet);
}
/**
* Checks whether we have a custom conversion for the given simple object. Converts the given value if so, applies
* {@link Enum} handling or returns the value as is.
*
* @param value
* @param target must not be {@literal null}.
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
private Object getPotentiallyConvertedSimpleRead(Object value, Class<?> target) {
if (value == null) {
return null;
}
if (conversions.hasCustomReadTarget(value.getClass(), target)) {
return conversionService.convert(value, target);
}
if (target.isEnum()) {
return Enum.valueOf((Class<Enum>) target, value.toString());
}
return value;
}
protected DBRef createDBRef(Object target, org.springframework.data.mongodb.core.mapping.DBRef dbref) {
@@ -686,7 +725,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
} else if (dbObjItem instanceof DBObject) {
items.add(read(prop.getComponentType(), (DBObject) dbObjItem));
} else {
items.add(dbObjItem);
items.add(getPotentiallyConvertedSimpleRead(dbObjItem, prop.getComponentType()));
}
}

View File

@@ -196,6 +196,25 @@ public class MappingMongoConverterUnitTests {
assertThat(result.get("sampleEnum").toString(), is("FIRST"));
}
/**
* @see DATADOC-209
*/
@Test
public void writesEnumCollectionCorrectly() {
ClassWithEnumProperty value = new ClassWithEnumProperty();
value.enums = Arrays.asList(SampleEnum.FIRST);
DBObject result = new BasicDBObject();
converter.write(value, result);
assertThat(result.get("enums"), is(BasicDBList.class));
BasicDBList enums = (BasicDBList) result.get("enums");
assertThat(enums.size(), is(1));
assertThat((String) enums.get(0), is("FIRST"));
}
/**
* @see DATADOC-136
*/
@@ -207,6 +226,23 @@ public class MappingMongoConverterUnitTests {
assertThat(result.sampleEnum, is(SampleEnum.FIRST));
}
/**
* @see DATADOC-209
*/
@Test
public void readsEnumCollectionsCorrectly() {
BasicDBList enums = new BasicDBList();
enums.add("FIRST");
DBObject dbObject = new BasicDBObject("enums", enums);
ClassWithEnumProperty result = converter.read(ClassWithEnumProperty.class, dbObject);
assertThat(result.enums, is(List.class));
assertThat(result.enums.size(), is(1));
assertThat(result.enums, hasItem(SampleEnum.FIRST));
}
/**
* @see DATADOC-144
*/
@@ -415,6 +451,7 @@ public class MappingMongoConverterUnitTests {
class ClassWithEnumProperty {
SampleEnum sampleEnum;
List<SampleEnum> enums;
}
enum SampleEnum {