package com.fasterxml.jackson.annotation;

import com.fasterxml.jackson.annotation.ObjectIdGenerator.IdKey;

/**
 * Definition of API used for resolving actual Java object from
 * Object Identifiers (as annotated using {@link JsonIdentityInfo}).
 *
 * @since 2.4
 */
public interface ObjectIdResolver {
    /**
     * Method called when a POJO is deserialized and has an Object Identifier.
     * Method exists so that implementation can keep track of existing object in
     * JSON stream that could be useful for further resolution.
     * 
     * @param id The Object Identifer
     * @param pojo The POJO associated to that Identifier
     */
    void bindItem(IdKey id, Object pojo);

    /**
     * Method called when deserialization encounters the given Object Identifier
     * and requires the POJO associated with it.
     * 
     * @param id The Object Identifier
     * @return The POJO, or null if unable to resolve.
     */
    Object resolveId(IdKey id);

    /**
     * Factory method called to create a new instance to use for
     * deserialization: needed since resolvers may have state (a pool of
     * objects).
     * <p>
     * Note that actual type of 'context' is
     * <code>com.fasterxml.jackson.databind.DeserializationContext</code>, but
     * can not be declared here as type itself (as well as call to this object)
     * comes from databind package.
     * 
     * @param context
     *            Deserialization context object used (of type
     *            <code>com.fasterxml.jackson.databind.DeserializationContext</code>
     *            ; may be needed by more complex resolvers to access contextual
     *            information such as configuration.
     */
    ObjectIdResolver newForDeserialization(Object context);

    /**
     * Method called to check whether this resolver instance can be used for
     * Object Ids of specific resolver type; determination is based by passing a
     * configured "blueprint" (prototype) instance; from which the actual
     * instances are created (using {@link #newForDeserialization}).
     * 
     * @return True if this instance can be used as-is; false if not
     */
    boolean canUseFor(ObjectIdResolver resolverType);
}
