blob: 30ccc4801ec963fd01f03d79672e5f1aac82beaa [file] [log] [blame]
package org.codehaus.jackson.map;
import org.codehaus.jackson.io.SerializedString;
import org.codehaus.jackson.map.deser.BeanDeserializerModifier;
import org.codehaus.jackson.map.deser.ValueInstantiators;
import org.codehaus.jackson.type.JavaType;
/**
* Abstract class that defines API used by {@link ObjectMapper} and
* {@link JsonDeserializer}s to obtain deserializers capable of
* re-constructing instances of handled type from JSON content.
*/
public abstract class DeserializerProvider
{
protected DeserializerProvider() { }
/*
/**********************************************************
/* Fluent factory methods
/**********************************************************
*/
/**
* Method that sub-classes need to override, to ensure that fluent-factory
* methods will produce proper sub-type.
*
* @since 1.9
*/
public abstract DeserializerProvider withFactory(DeserializerFactory factory);
/**
* Method that is to configure {@link DeserializerFactory} that provider has
* to use specified deserializer provider, with highest precedence (that is,
* additional providers have higher precedence than default one or previously
* added ones)
*
* @since 1.7
*/
public abstract DeserializerProvider withAdditionalDeserializers(Deserializers d);
/**
* @since 1.8
*/
public abstract DeserializerProvider withAdditionalKeyDeserializers(KeyDeserializers d);
/**
* @since 1.7
*/
public abstract DeserializerProvider withDeserializerModifier(BeanDeserializerModifier modifier);
/**
* @since 1.8
*/
public abstract DeserializerProvider withAbstractTypeResolver(AbstractTypeResolver resolver);
/**
* Method that will construct a new instance with specified additional value instantiators
* (i.e. does NOT replace existing ones)
*
* @since 1.9
*/
public abstract DeserializerProvider withValueInstantiators(ValueInstantiators instantiators);
/*
/**********************************************************
/* General deserializer locating method
/**********************************************************
*/
/**
* Method called to get hold of a deserializer for a value of given type;
* or if no such deserializer can be found, a default handler (which
* may do a best-effort generic serialization or just simply
* throw an exception when invoked).
*<p>
* Note: this method is only called for value types; not for keys.
* Key deserializers can be accessed using {@link #findKeyDeserializer}.
*
* @param config Deserialization configuration
* @param propertyType Declared type of the value to deserializer (obtained using
* 'setter' method signature and/or type annotations
* @param property Object that represents accessor for property value; field,
* setter method or constructor parameter.
*
* @throws JsonMappingException if there are fatal problems with
* accessing suitable deserializer; including that of not
* finding any serializer
*/
public abstract JsonDeserializer<Object> findValueDeserializer(DeserializationConfig config,
JavaType propertyType, BeanProperty property)
throws JsonMappingException;
/**
* Method called to locate deserializer for given type, as well as matching
* type deserializer (if one is needed); and if type deserializer is needed,
* construct a "wrapped" deserializer that can extract and use type information
* for calling actual deserializer.
*<p>
* Since this method is only called for root elements, no referral information
* is taken.
*
* @since 1.5
*/
public abstract JsonDeserializer<Object> findTypedValueDeserializer(DeserializationConfig config,
JavaType type, BeanProperty property)
throws JsonMappingException;
/**
* Method called to get hold of a deserializer to use for deserializing
* keys for {@link java.util.Map}.
*
* @throws JsonMappingException if there are fatal problems with
* accessing suitable key deserializer; including that of not
* finding any serializer
*/
public abstract KeyDeserializer findKeyDeserializer(DeserializationConfig config,
JavaType keyType, BeanProperty property)
throws JsonMappingException;
/**
* Method called to find out whether provider would be able to find
* a deserializer for given type, using a root reference (i.e. not
* through fields or membership in an array or collection)
*/
public abstract boolean hasValueDeserializerFor(DeserializationConfig config, JavaType type);
/*
/**********************************************************
/* Additional type handling methods, related
/**********************************************************
*/
/**
* Method that can be called to try to resolve an abstract type
* (interface, abstract class) into a concrete type, or at least
* something "more concrete" (abstract class instead of interface).
* Will either return passed type, or a more specific type.
*
* @since 1.9
*/
public abstract JavaType mapAbstractType(DeserializationConfig config, JavaType type)
throws JsonMappingException;
/**
* Method that can be used to try find expected root name for given type
*
* @since 1.9
*/
public abstract SerializedString findExpectedRootName(DeserializationConfig config, JavaType type)
throws JsonMappingException;
/*
/**********************************************************
/* Access to caching aspects
/**********************************************************
*/
/**
* Method that can be used to determine how many deserializers this
* provider is caching currently
* (if it does caching: default implementation does)
* Exact count depends on what kind of deserializers get cached;
* default implementation caches only dynamically constructed deserializers,
* but not eagerly constructed standard deserializers (which is different
* from how serializer provider works).
*<p>
* The main use case for this method is to allow conditional flushing of
* deserializer cache, if certain number of entries is reached.
*
* @since 1.4
*/
public abstract int cachedDeserializersCount();
/**
* Method that will drop all dynamically constructed deserializers (ones that
* are counted as result value for {@link #cachedDeserializersCount}).
* This can be used to remove memory usage (in case some deserializers are
* only used once or so), or to force re-construction of deserializers after
* configuration changes for mapper than owns the provider.
*
* @since 1.4
*/
public abstract void flushCachedDeserializers();
}