package com.fasterxml.jackson.databind;


/**
 * Defines interface for resolvers that can resolve abstract types into concrete
 * ones; either by using static mappings, or possibly by materializing
 * implementations dynamically.
 */
public abstract class AbstractTypeResolver
{
    /**
     * Try to locate a subtype for given abstract type, to either resolve
     * to a concrete type, or at least to a more-specific (and hopefully supported)
     * abstract type, one which may have registered deserializers.
     * Method is called before trying to locate registered deserializers
     * (as well as standard abstract type defaulting that core Jackson does),
     * so it is typically implemented to add custom mappings of common abstract
     * types (like specify which concrete implementation to use for binding
     * {@link java.util.List}s).
     *<p>
     * Note that this method does not necessarily have to do full resolution
     * of bindings; that is, it is legal to return type that could be further
     * resolved: caller is expected to keep calling this method on registered
     * resolvers, until a concrete type is located.
     * 
     * @param config Configuration in use; should always be of type
     *    <code>DeserializationConfig</code>
     */
    public JavaType findTypeMapping(DeserializationConfig config, JavaType type) {
        return null;
    }

    // !!! 29-Nov-2015, tatu: TODO: mark deprecated in 2.8
    /**
     * Older variant of {@link #resolveAbstractType(DeserializationConfig, BeanDescription)};
     * obsoleted in 2.7, to be deprecated in 2.8
     */
    public JavaType resolveAbstractType(DeserializationConfig config,
            JavaType type) {
        return null;
    }

    /**
     * Method called to try to resolve an abstract type into
     * concrete type (usually for purposes of deserializing),
     * when no concrete implementation was found.
     * It will be called after checking all other possibilities,
     * including defaulting.
     *<p>
     * Default implementation will call obsolete method for Jackson 2.7,
     * to try to keep some level of backwards compatibility.
     * 
     * @param config Configuration in use; should always be of type
     *    <code>DeserializationConfig</code>
     * @param typeDesc Description of the POJO type to resolve
     * 
     * @return Resolved concrete type (which should retain generic
     *    type parameters of input type, if any), if resolution succeeds;
     *    null if resolver does not know how to resolve given type
     *
     * @since 2.7
     */
    public JavaType resolveAbstractType(DeserializationConfig config,
            BeanDescription typeDesc) {
        return resolveAbstractType(config, typeDesc.getType());
    }
}
