package com.fasterxml.jackson.dataformat.avro;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.DatabindContext;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.exc.InvalidTypeIdException;
import com.fasterxml.jackson.databind.jsontype.NamedType;
import com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver;
import com.fasterxml.jackson.databind.type.TypeFactory;
public class AvroTypeIdResolver extends ClassNameIdResolver
{
private final Map<String, Class<?>> _idTypes = new HashMap<>();
private final Map<Class<?>, String> _typeIds = new HashMap<>();
public AvroTypeIdResolver(JavaType baseType, TypeFactory typeFactory, Collection<NamedType> subTypes) {
this(baseType, typeFactory);
if (subTypes != null) {
for (NamedType namedType : subTypes) {
registerSubtype(namedType.getType(), namedType.getName());
}
}
}
public AvroTypeIdResolver(JavaType baseType, TypeFactory typeFactory) {
super(baseType, typeFactory);
}
@Override
public void registerSubtype(Class<?> type, String name) {
_idTypes.put(name, type);
_typeIds.put(type, name);
}
@Override
protected JavaType _typeFromId(String id, DatabindContext ctxt) throws IOException {
if (_baseType.isPrimitive()) {
return _baseType;
}
Class<?> subType = _idTypes.get(id);
if (subType != null) {
id = _idFrom(null, subType, _typeFactory);
}
try {
return super._typeFromId(id, ctxt);
} catch (InvalidTypeIdException | IllegalArgumentException e) {
return null;
}
}
}