implemented collection/map converter conditional matching checks; updated SpEL to reflect this behavior

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4483 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
Keith Donald
2011-06-07 20:00:28 +00:00
parent cfd8d7dac4
commit f40c101d6d
22 changed files with 239 additions and 71 deletions
@@ -45,7 +45,7 @@ final class ArrayToArrayConverter implements ConditionalGenericConverter {
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
return this.helperConverter.matches(sourceType, targetType);
}
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -49,7 +49,23 @@ final class ArrayToCollectionConverter implements ConditionalGenericConverter {
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
if (targetType.getElementTypeDescriptor() == null) {
// yes
return true;
}
boolean canConvert = conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor());
if (canConvert) {
// yes
return true;
} else {
if (sourceType.getElementTypeDescriptor().getType().isAssignableFrom(targetType.getElementTypeDescriptor().getType())) {
// maybe;
return true;
} else {
// no;
return false;
}
}
}
@SuppressWarnings("unchecked")
@@ -45,7 +45,7 @@ final class ArrayToObjectConverter implements ConditionalGenericConverter {
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
return this.helperConverter.matches(sourceType, targetType);
}
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -45,7 +45,7 @@ final class ArrayToStringConverter implements ConditionalGenericConverter {
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
return this.helperConverter.matches(sourceType, targetType);
}
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -49,7 +49,23 @@ final class CollectionToArrayConverter implements ConditionalGenericConverter {
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
if (sourceType.getElementTypeDescriptor() == null) {
// maybe
return true;
}
boolean canConvert = conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor());
if (canConvert) {
// yes
return true;
} else {
if (sourceType.getElementTypeDescriptor().getType().isAssignableFrom(targetType.getElementTypeDescriptor().getType())) {
// maybe;
return true;
} else {
// no;
return false;
}
}
}
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -66,4 +82,4 @@ final class CollectionToArrayConverter implements ConditionalGenericConverter {
return array;
}
}
}
@@ -49,7 +49,27 @@ final class CollectionToCollectionConverter implements ConditionalGenericConvert
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
if (targetType.getElementTypeDescriptor() == null) {
// yes
return true;
}
if (sourceType.getElementTypeDescriptor() == null) {
// maybe
return true;
}
boolean canConvert = conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor());
if (canConvert) {
// yes
return true;
} else {
if (sourceType.getElementTypeDescriptor().getType().isAssignableFrom(targetType.getElementTypeDescriptor().getType())) {
// maybe;
return true;
} else {
// no;
return false;
}
}
}
@SuppressWarnings("unchecked")
@@ -72,4 +92,4 @@ final class CollectionToCollectionConverter implements ConditionalGenericConvert
return target;
}
}
}
@@ -43,7 +43,23 @@ final class CollectionToObjectConverter implements ConditionalGenericConverter {
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
if (sourceType.getElementTypeDescriptor() == null) {
// maybe
return true;
}
boolean canConvert = conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType);
if (canConvert) {
// yes
return true;
} else {
if (sourceType.getElementTypeDescriptor().getType().isAssignableFrom(targetType.getType())) {
// maybe;
return true;
} else {
// no;
return false;
}
}
}
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -45,7 +45,23 @@ final class CollectionToStringConverter implements ConditionalGenericConverter {
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
if (sourceType.getElementTypeDescriptor() == null) {
// maybe
return true;
}
boolean canConvert = conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType);
if (canConvert) {
// yes
return true;
} else {
if (sourceType.getElementTypeDescriptor().getType().isAssignableFrom(targetType.getType())) {
// maybe;
return true;
} else {
// no;
return false;
}
}
}
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -69,4 +85,4 @@ final class CollectionToStringConverter implements ConditionalGenericConverter {
return sb.toString();
}
}
}
@@ -49,7 +49,7 @@ final class MapToMapConverter implements ConditionalGenericConverter {
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
return canConvertKey(sourceType, targetType) && canConvertValue(sourceType, targetType);
}
@SuppressWarnings("unchecked")
@@ -70,6 +70,54 @@ final class MapToMapConverter implements ConditionalGenericConverter {
}
// internal helpers
private boolean canConvertKey(TypeDescriptor sourceType, TypeDescriptor targetType) {
if (targetType.getMapKeyTypeDescriptor() == null) {
// yes
return true;
}
if (sourceType.getMapKeyTypeDescriptor() == null) {
// maybe
return true;
}
boolean canConvert = conversionService.canConvert(sourceType.getMapKeyTypeDescriptor(), targetType.getMapKeyTypeDescriptor());
if (canConvert) {
// yes
return true;
} else {
if (sourceType.getMapKeyTypeDescriptor().getType().isAssignableFrom(targetType.getMapKeyTypeDescriptor().getType())) {
// maybe;
return true;
} else {
// no;
return false;
}
}
}
private boolean canConvertValue(TypeDescriptor sourceType, TypeDescriptor targetType) {
if (targetType.getMapValueTypeDescriptor() == null) {
// yes
return true;
}
if (sourceType.getMapValueTypeDescriptor() == null) {
// maybe
return true;
}
boolean canConvert = conversionService.canConvert(sourceType.getMapValueTypeDescriptor(), targetType.getMapValueTypeDescriptor());
if (canConvert) {
// yes
return true;
} else {
if (sourceType.getMapValueTypeDescriptor().getType().isAssignableFrom(targetType.getMapValueTypeDescriptor().getType())) {
// maybe;
return true;
} else {
// no;
return false;
}
}
}
private Object convertKey(Object sourceKey, TypeDescriptor sourceType, TypeDescriptor targetType) {
if (targetType == null) {
@@ -44,7 +44,19 @@ final class ObjectToArrayConverter implements ConditionalGenericConverter {
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
boolean canConvert = conversionService.canConvert(sourceType, targetType.getElementTypeDescriptor());
if (canConvert) {
// yes
return true;
} else {
if (sourceType.getType().isAssignableFrom(targetType.getElementTypeDescriptor().getType())) {
// maybe;
return true;
} else {
// no;
return false;
}
}
}
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -46,7 +46,23 @@ final class ObjectToCollectionConverter implements ConditionalGenericConverter {
}
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return true;
if (targetType.getElementTypeDescriptor() == null) {
// yes
return true;
}
boolean canConvert = conversionService.canConvert(sourceType, targetType.getElementTypeDescriptor());
if (canConvert) {
// yes
return true;
} else {
if (sourceType.getType().isAssignableFrom(targetType.getElementTypeDescriptor().getType())) {
// maybe;
return true;
} else {
// no;
return false;
}
}
}
@SuppressWarnings("unchecked")
@@ -64,4 +80,4 @@ final class ObjectToCollectionConverter implements ConditionalGenericConverter {
return target;
}
}
}