@SuppressWarnings("unchecked")
@Override
public <T> Optional<T> convert(Object object, Class<T> targetType, ConversionContext context) {
if (object == null || targetType == null || context == null) {
return Optional.empty();
}
if (targetType == Object.class) {
return Optional.of((T) object);
}
Class<?> sourceType = object.getClass();
targetType = ReflectionUtils.getWrapperType(targetType);
if (targetType.isInstance(object) && !Iterable.class.isInstance(object) && !Map.class.isInstance(object)) {
return Optional.of((T) object);
}
Optional<? extends Class<? extends Annotation>> formattingAnn = context.getAnnotationMetadata().getAnnotationTypeByStereotype(Format.class);
Class<? extends Annotation> formattingAnnotation = formattingAnn.orElse(null);
ConvertiblePair pair = new ConvertiblePair(sourceType, targetType, formattingAnnotation);
TypeConverter typeConverter = converterCache.get(pair);
if (typeConverter == null) {
typeConverter = findTypeConverter(sourceType, targetType, formattingAnnotation);
if (typeConverter == null) {
return Optional.empty();
} else {
converterCache.put(pair, typeConverter);
}
}
return typeConverter.convert(object, targetType, context);
}