diff --git a/org.springframework.core/src/main/java/org/springframework/core/convert/TypeDescriptor.java b/org.springframework.core/src/main/java/org/springframework/core/convert/TypeDescriptor.java index c9d447c6795..da5cb00d9da 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/convert/TypeDescriptor.java +++ b/org.springframework.core/src/main/java/org/springframework/core/convert/TypeDescriptor.java @@ -135,6 +135,9 @@ public class TypeDescriptor { * @return the collection type descriptor */ public static TypeDescriptor collection(Class collectionType, TypeDescriptor elementType) { + if (!Collection.class.isAssignableFrom(collectionType)) { + throw new IllegalArgumentException("collectionType must be a java.util.Collection"); + } return new TypeDescriptor(collectionType, elementType); } @@ -148,6 +151,9 @@ public class TypeDescriptor { * @return the map type descriptor */ public static TypeDescriptor map(Class mapType, TypeDescriptor keyType, TypeDescriptor valueType) { + if (!Map.class.isAssignableFrom(mapType)) { + throw new IllegalArgumentException("mapType must be a java.util.Map"); + } return new TypeDescriptor(mapType, keyType, valueType); } diff --git a/org.springframework.core/src/test/java/org/springframework/core/convert/TypeDescriptorTests.java b/org.springframework.core/src/test/java/org/springframework/core/convert/TypeDescriptorTests.java index 9592450d673..ccffbba4cd7 100644 --- a/org.springframework.core/src/test/java/org/springframework/core/convert/TypeDescriptorTests.java +++ b/org.springframework.core/src/test/java/org/springframework/core/convert/TypeDescriptorTests.java @@ -719,7 +719,85 @@ public class TypeDescriptorTests { } @Test - public void testEquals() throws Exception { + public void collection() { + TypeDescriptor desc = TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(Integer.class)); + assertEquals(List.class, desc.getType()); + assertEquals(List.class, desc.getObjectType()); + assertEquals("java.util.List", desc.getName()); + assertEquals("java.util.List", desc.toString()); + assertTrue(!desc.isPrimitive()); + assertEquals(0, desc.getAnnotations().length); + assertTrue(desc.isCollection()); + assertFalse(desc.isArray()); + assertEquals(Integer.class, desc.getElementType()); + assertEquals(TypeDescriptor.valueOf(Integer.class), desc.getElementTypeDescriptor()); + assertFalse(desc.isMap()); + assertNull(desc.getMapKeyType()); + assertEquals(TypeDescriptor.NULL, desc.getMapKeyTypeDescriptor()); + assertNull(desc.getMapValueType()); + assertEquals(TypeDescriptor.NULL, desc.getMapValueTypeDescriptor()); + } + + @Test + public void collectionNested() { + TypeDescriptor desc = TypeDescriptor.collection(List.class, TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(Integer.class))); + assertEquals(List.class, desc.getType()); + assertEquals(List.class, desc.getObjectType()); + assertEquals("java.util.List", desc.getName()); + assertEquals("java.util.List>", desc.toString()); + assertTrue(!desc.isPrimitive()); + assertEquals(0, desc.getAnnotations().length); + assertTrue(desc.isCollection()); + assertFalse(desc.isArray()); + assertEquals(List.class, desc.getElementType()); + assertEquals(TypeDescriptor.valueOf(Integer.class), desc.getElementTypeDescriptor().getElementTypeDescriptor()); + assertFalse(desc.isMap()); + assertNull(desc.getMapKeyType()); + assertEquals(TypeDescriptor.NULL, desc.getMapKeyTypeDescriptor()); + assertNull(desc.getMapValueType()); + assertEquals(TypeDescriptor.NULL, desc.getMapValueTypeDescriptor()); + } + + @Test + public void map() { + TypeDescriptor desc = TypeDescriptor.map(Map.class, TypeDescriptor.valueOf(String.class), TypeDescriptor.valueOf(Integer.class)); + assertEquals(Map.class, desc.getType()); + assertEquals(Map.class, desc.getObjectType()); + assertEquals("java.util.Map", desc.getName()); + assertEquals("java.util.Map", desc.toString()); + assertTrue(!desc.isPrimitive()); + assertEquals(0, desc.getAnnotations().length); + assertFalse(desc.isCollection()); + assertFalse(desc.isArray()); + assertNull(desc.getElementType()); + assertEquals(TypeDescriptor.NULL, desc.getElementTypeDescriptor()); + assertTrue(desc.isMap()); + assertEquals(String.class, desc.getMapKeyTypeDescriptor().getType()); + assertEquals(Integer.class, desc.getMapValueTypeDescriptor().getType()); + } + + @Test + public void mapNested() { + TypeDescriptor desc = TypeDescriptor.map(Map.class, TypeDescriptor.valueOf(String.class), + TypeDescriptor.map(Map.class, TypeDescriptor.valueOf(String.class), TypeDescriptor.valueOf(Integer.class))); + assertEquals(Map.class, desc.getType()); + assertEquals(Map.class, desc.getObjectType()); + assertEquals("java.util.Map", desc.getName()); + assertEquals("java.util.Map>", desc.toString()); + assertTrue(!desc.isPrimitive()); + assertEquals(0, desc.getAnnotations().length); + assertFalse(desc.isCollection()); + assertFalse(desc.isArray()); + assertNull(desc.getElementType()); + assertEquals(TypeDescriptor.NULL, desc.getElementTypeDescriptor()); + assertTrue(desc.isMap()); + assertEquals(String.class, desc.getMapKeyTypeDescriptor().getType()); + assertEquals(String.class, desc.getMapValueTypeDescriptor().getMapKeyTypeDescriptor().getType()); + assertEquals(Integer.class, desc.getMapValueTypeDescriptor().getMapValueTypeDescriptor().getType()); + } + + @Test + public void equals() throws Exception { TypeDescriptor t1 = TypeDescriptor.valueOf(String.class); TypeDescriptor t2 = TypeDescriptor.valueOf(String.class); TypeDescriptor t3 = TypeDescriptor.valueOf(Date.class);