added utility method to reduce code duplication
This commit is contained in:
		
							parent
							
								
									0601f0e520
								
							
						
					
					
						commit
						15e009f3a0
					
				| 
						 | 
				
			
			@ -49,23 +49,7 @@ final class ArrayToCollectionConverter implements ConditionalGenericConverter {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
		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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return ConversionUtils.canConvertElements(sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor(), conversionService);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,23 +49,7 @@ final class CollectionToArrayConverter implements ConditionalGenericConverter {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
		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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return ConversionUtils.canConvertElements(sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor(), conversionService);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,27 +49,7 @@ final class CollectionToCollectionConverter implements ConditionalGenericConvert
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
		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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return ConversionUtils.canConvertElements(sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor(), conversionService);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,23 +43,7 @@ final class CollectionToObjectConverter implements ConditionalGenericConverter {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
		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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return ConversionUtils.canConvertElements(sourceType.getElementTypeDescriptor(), targetType, conversionService);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,23 +45,7 @@ final class CollectionToStringConverter implements ConditionalGenericConverter {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
		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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return ConversionUtils.canConvertElements(sourceType.getElementTypeDescriptor(), targetType, conversionService);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,7 @@
 | 
			
		|||
package org.springframework.core.convert.support;
 | 
			
		||||
 | 
			
		||||
import org.springframework.core.convert.ConversionFailedException;
 | 
			
		||||
import org.springframework.core.convert.ConversionService;
 | 
			
		||||
import org.springframework.core.convert.TypeDescriptor;
 | 
			
		||||
import org.springframework.core.convert.converter.GenericConverter;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -40,5 +41,29 @@ abstract class ConversionUtils {
 | 
			
		|||
			throw new ConversionFailedException(sourceType, targetType, source, ex);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static boolean canConvertElements(TypeDescriptor sourceElementType, TypeDescriptor targetElementType, ConversionService conversionService) {
 | 
			
		||||
		if (targetElementType == null) {
 | 
			
		||||
			// yes
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		if (sourceElementType == null) {
 | 
			
		||||
			// maybe
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		boolean canConvert = conversionService.canConvert(sourceElementType, targetElementType);
 | 
			
		||||
		if (canConvert) {
 | 
			
		||||
			// yes
 | 
			
		||||
			return true;
 | 
			
		||||
		} else {
 | 
			
		||||
			if (sourceElementType.getType().isAssignableFrom(targetElementType.getType())) {
 | 
			
		||||
				// maybe;
 | 
			
		||||
				return true;
 | 
			
		||||
			} else {
 | 
			
		||||
				// no;
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
		}		
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,51 +72,11 @@ 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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return ConversionUtils.canConvertElements(sourceType.getMapKeyTypeDescriptor(), targetType.getMapKeyTypeDescriptor(), conversionService);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return ConversionUtils.canConvertElements(sourceType.getMapValueTypeDescriptor(), targetType.getMapValueTypeDescriptor(), conversionService);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private Object convertKey(Object sourceKey, TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,19 +44,7 @@ final class ObjectToArrayConverter implements ConditionalGenericConverter {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
		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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return ConversionUtils.canConvertElements(sourceType, targetType.getElementTypeDescriptor(), conversionService);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,23 +46,7 @@ final class ObjectToCollectionConverter implements ConditionalGenericConverter {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
 | 
			
		||||
		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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return ConversionUtils.canConvertElements(sourceType, targetType.getElementTypeDescriptor(), conversionService);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue