- for (Class<?> key : parametrizedConvertorKeys) {
- if (key.isAssignableFrom(type)) {
- convertor = parametrizedConvertors.get(key);
- parametrizedConvertors.put(type, convertor);
- LOG.debug("{} is now converted by {}", type, convertor);
- found = true;
- break;
+ /**
+ * Last resort. If we do not already have convertor registered,
+ * we will perform some costly operations and try to find if we
+ * can convert input using any of already registered convertors
+ * @param type input type
+ * @return found convertor
+ */
+ @VisibleForTesting
+ Optional<Convertor> findConvertor(final short version, final Class<?> type) {
+ final Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
+ convertors.get(version);
+
+ Optional<Convertor> convertor = Optional.empty();
+
+ if (convertorsForVersion != null) {
+ convertor = Optional.ofNullable(convertorsForVersion.get(type));
+
+ if (!convertor.isPresent()) {
+ for (Entry<Class<?>, Convertor<?, ?, ? extends ConvertorData>> entry :
+ convertorsForVersion.entrySet()) {
+ final Class<?> convertorType = entry.getKey();
+ if (type.isAssignableFrom(convertorType)) {
+ final Convertor<?, ?, ? extends ConvertorData> foundConvertor = entry.getValue();
+ convertor = Optional.ofNullable(foundConvertor);
+
+ if (convertor.isPresent()) {
+ convertorsForVersion.put(type, foundConvertor);
+ LOG.warn("{} for version {} is now converted by {} using last resort method",
+ type, version, foundConvertor);
+ break;
+ }
+ }