@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); }
for (Class sourceSuperType : sourceHierarchy) { for (Class targetSuperType : targetHierarchy) { ConvertiblePair pair = new ConvertiblePair(sourceSuperType, targetSuperType, formattingAnnotation); typeConverter = typeConverters.get(pair); if (typeConverter != null) { for (Class sourceSuperType : sourceHierarchy) { for (Class targetSuperType : targetHierarchy) { ConvertiblePair pair = new ConvertiblePair(sourceSuperType, targetSuperType); typeConverter = typeConverters.get(pair); if (typeConverter != null) {
@Override public <S, T> boolean canConvert(Class<S> sourceType, Class<T> targetType) { ConvertiblePair pair = new ConvertiblePair(sourceType, targetType, null); TypeConverter typeConverter = converterCache.get(pair); if (typeConverter == null) { typeConverter = findTypeConverter(sourceType, targetType, null); if (typeConverter != null) { converterCache.put(pair, typeConverter); return true; } return false; } return true; }
private <S, T> ConvertiblePair newPair(Class<S> sourceType, Class<T> targetType, TypeConverter<S, T> typeConverter) { ConvertiblePair pair; if (typeConverter instanceof FormattingTypeConverter) { pair = new ConvertiblePair(sourceType, targetType, ((FormattingTypeConverter) typeConverter).annotationType()); } else { pair = new ConvertiblePair(sourceType, targetType); } return pair; }
@Override public <S, T> DefaultConversionService addConverter(Class<S> sourceType, Class<T> targetType, Function<S, T> function) { ConvertiblePair pair = new ConvertiblePair(sourceType, targetType); TypeConverter<S, T> typeConverter = TypeConverter.of(sourceType, targetType, function); typeConverters.put(pair, typeConverter); converterCache.put(pair, typeConverter); return this; }