Skip to content

Commit 1e39b0b

Browse files
author
Keith Donald
committed
implemented collection/map converter conditional matching checks; updated SpEL to reflect this behavior
1 parent df460f4 commit 1e39b0b

22 files changed

+239
-71
lines changed

org.springframework.core/src/main/java/org/springframework/core/convert/support/ArrayToArrayConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public Set<ConvertiblePair> getConvertibleTypes() {
4545
}
4646

4747
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
48-
return true;
48+
return this.helperConverter.matches(sourceType, targetType);
4949
}
5050

5151
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {

org.springframework.core/src/main/java/org/springframework/core/convert/support/ArrayToCollectionConverter.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,23 @@ public Set<ConvertiblePair> getConvertibleTypes() {
4949
}
5050

5151
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
52-
return true;
52+
if (targetType.getElementTypeDescriptor() == null) {
53+
// yes
54+
return true;
55+
}
56+
boolean canConvert = conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor());
57+
if (canConvert) {
58+
// yes
59+
return true;
60+
} else {
61+
if (sourceType.getElementTypeDescriptor().getType().isAssignableFrom(targetType.getElementTypeDescriptor().getType())) {
62+
// maybe;
63+
return true;
64+
} else {
65+
// no;
66+
return false;
67+
}
68+
}
5369
}
5470

5571
@SuppressWarnings("unchecked")

org.springframework.core/src/main/java/org/springframework/core/convert/support/ArrayToObjectConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public Set<ConvertiblePair> getConvertibleTypes() {
4545
}
4646

4747
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
48-
return true;
48+
return this.helperConverter.matches(sourceType, targetType);
4949
}
5050

5151
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {

org.springframework.core/src/main/java/org/springframework/core/convert/support/ArrayToStringConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public Set<ConvertiblePair> getConvertibleTypes() {
4545
}
4646

4747
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
48-
return true;
48+
return this.helperConverter.matches(sourceType, targetType);
4949
}
5050

5151
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {

org.springframework.core/src/main/java/org/springframework/core/convert/support/CollectionToArrayConverter.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,23 @@ public Set<ConvertiblePair> getConvertibleTypes() {
4949
}
5050

5151
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
52-
return true;
52+
if (sourceType.getElementTypeDescriptor() == null) {
53+
// maybe
54+
return true;
55+
}
56+
boolean canConvert = conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor());
57+
if (canConvert) {
58+
// yes
59+
return true;
60+
} else {
61+
if (sourceType.getElementTypeDescriptor().getType().isAssignableFrom(targetType.getElementTypeDescriptor().getType())) {
62+
// maybe;
63+
return true;
64+
} else {
65+
// no;
66+
return false;
67+
}
68+
}
5369
}
5470

5571
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -66,4 +82,4 @@ public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor t
6682
return array;
6783
}
6884

69-
}
85+
}

org.springframework.core/src/main/java/org/springframework/core/convert/support/CollectionToCollectionConverter.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,27 @@ public Set<ConvertiblePair> getConvertibleTypes() {
4949
}
5050

5151
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
52-
return true;
52+
if (targetType.getElementTypeDescriptor() == null) {
53+
// yes
54+
return true;
55+
}
56+
if (sourceType.getElementTypeDescriptor() == null) {
57+
// maybe
58+
return true;
59+
}
60+
boolean canConvert = conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor());
61+
if (canConvert) {
62+
// yes
63+
return true;
64+
} else {
65+
if (sourceType.getElementTypeDescriptor().getType().isAssignableFrom(targetType.getElementTypeDescriptor().getType())) {
66+
// maybe;
67+
return true;
68+
} else {
69+
// no;
70+
return false;
71+
}
72+
}
5373
}
5474

5575
@SuppressWarnings("unchecked")
@@ -72,4 +92,4 @@ public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor t
7292
return target;
7393
}
7494

75-
}
95+
}

org.springframework.core/src/main/java/org/springframework/core/convert/support/CollectionToObjectConverter.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,23 @@ public Set<ConvertiblePair> getConvertibleTypes() {
4343
}
4444

4545
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
46-
return true;
46+
if (sourceType.getElementTypeDescriptor() == null) {
47+
// maybe
48+
return true;
49+
}
50+
boolean canConvert = conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType);
51+
if (canConvert) {
52+
// yes
53+
return true;
54+
} else {
55+
if (sourceType.getElementTypeDescriptor().getType().isAssignableFrom(targetType.getType())) {
56+
// maybe;
57+
return true;
58+
} else {
59+
// no;
60+
return false;
61+
}
62+
}
4763
}
4864

4965
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {

org.springframework.core/src/main/java/org/springframework/core/convert/support/CollectionToStringConverter.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,23 @@ public Set<ConvertiblePair> getConvertibleTypes() {
4545
}
4646

4747
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
48-
return true;
48+
if (sourceType.getElementTypeDescriptor() == null) {
49+
// maybe
50+
return true;
51+
}
52+
boolean canConvert = conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType);
53+
if (canConvert) {
54+
// yes
55+
return true;
56+
} else {
57+
if (sourceType.getElementTypeDescriptor().getType().isAssignableFrom(targetType.getType())) {
58+
// maybe;
59+
return true;
60+
} else {
61+
// no;
62+
return false;
63+
}
64+
}
4965
}
5066

5167
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -69,4 +85,4 @@ public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor t
6985
return sb.toString();
7086
}
7187

72-
}
88+
}

org.springframework.core/src/main/java/org/springframework/core/convert/support/MapToMapConverter.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public Set<ConvertiblePair> getConvertibleTypes() {
4949
}
5050

5151
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
52-
return true;
52+
return canConvertKey(sourceType, targetType) && canConvertValue(sourceType, targetType);
5353
}
5454

5555
@SuppressWarnings("unchecked")
@@ -70,6 +70,54 @@ public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor t
7070
}
7171

7272
// internal helpers
73+
74+
private boolean canConvertKey(TypeDescriptor sourceType, TypeDescriptor targetType) {
75+
if (targetType.getMapKeyTypeDescriptor() == null) {
76+
// yes
77+
return true;
78+
}
79+
if (sourceType.getMapKeyTypeDescriptor() == null) {
80+
// maybe
81+
return true;
82+
}
83+
boolean canConvert = conversionService.canConvert(sourceType.getMapKeyTypeDescriptor(), targetType.getMapKeyTypeDescriptor());
84+
if (canConvert) {
85+
// yes
86+
return true;
87+
} else {
88+
if (sourceType.getMapKeyTypeDescriptor().getType().isAssignableFrom(targetType.getMapKeyTypeDescriptor().getType())) {
89+
// maybe;
90+
return true;
91+
} else {
92+
// no;
93+
return false;
94+
}
95+
}
96+
}
97+
98+
private boolean canConvertValue(TypeDescriptor sourceType, TypeDescriptor targetType) {
99+
if (targetType.getMapValueTypeDescriptor() == null) {
100+
// yes
101+
return true;
102+
}
103+
if (sourceType.getMapValueTypeDescriptor() == null) {
104+
// maybe
105+
return true;
106+
}
107+
boolean canConvert = conversionService.canConvert(sourceType.getMapValueTypeDescriptor(), targetType.getMapValueTypeDescriptor());
108+
if (canConvert) {
109+
// yes
110+
return true;
111+
} else {
112+
if (sourceType.getMapValueTypeDescriptor().getType().isAssignableFrom(targetType.getMapValueTypeDescriptor().getType())) {
113+
// maybe;
114+
return true;
115+
} else {
116+
// no;
117+
return false;
118+
}
119+
}
120+
}
73121

74122
private Object convertKey(Object sourceKey, TypeDescriptor sourceType, TypeDescriptor targetType) {
75123
if (targetType == null) {

org.springframework.core/src/main/java/org/springframework/core/convert/support/ObjectToArrayConverter.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,19 @@ public Set<ConvertiblePair> getConvertibleTypes() {
4444
}
4545

4646
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
47-
return true;
47+
boolean canConvert = conversionService.canConvert(sourceType, targetType.getElementTypeDescriptor());
48+
if (canConvert) {
49+
// yes
50+
return true;
51+
} else {
52+
if (sourceType.getType().isAssignableFrom(targetType.getElementTypeDescriptor().getType())) {
53+
// maybe;
54+
return true;
55+
} else {
56+
// no;
57+
return false;
58+
}
59+
}
4860
}
4961

5062
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {

0 commit comments

Comments
 (0)