blob: 2c672523e0afadd7721f42879ce1119212cc03e7 [file] [log] [blame]
package com.fasterxml.jackson.databind.cfg;
import com.fasterxml.jackson.databind.AbstractTypeResolver;
import com.fasterxml.jackson.databind.deser.*;
import com.fasterxml.jackson.databind.util.ArrayBuilders;
/**
* Configuration settings container class for {@link DeserializerFactory}.
*/
public class DeserializerFactoryConfig
implements java.io.Serializable // since 2.1
{
private static final long serialVersionUID = 3683541151102256824L;
protected final static Deserializers[] NO_DESERIALIZERS = new Deserializers[0];
protected final static KeyDeserializers[] NO_KEY_DESERIALIZERS = new KeyDeserializers[0];
protected final static BeanDeserializerModifier[] NO_MODIFIERS = new BeanDeserializerModifier[0];
protected final static AbstractTypeResolver[] NO_ABSTRACT_TYPE_RESOLVERS = new AbstractTypeResolver[0];
protected final static ValueInstantiators[] NO_VALUE_INSTANTIATORS = new ValueInstantiators[0];
/**
* List of providers for additional deserializers, checked before considering default
* basic or bean deserializers.
*/
protected final Deserializers[] _additionalDeserializers;
/**
* List of providers for additional key deserializers, checked before considering
* standard key deserializers.
*/
protected final KeyDeserializers[] _additionalKeyDeserializers;
/**
* List of modifiers that can change the way {@link BeanDeserializer} instances
* are configured and constructed.
*/
protected final BeanDeserializerModifier[] _modifiers;
/**
* List of objects that may be able to resolve abstract types to
* concrete types. Used by functionality like "mr Bean" to materialize
* types as needed.
*/
protected final AbstractTypeResolver[] _abstractTypeResolvers;
/**
* List of objects that know how to create instances of POJO types;
* possibly using custom construction (non-annoted constructors; factory
* methods external to value type etc).
* Used to support objects that are created using non-standard methods;
* or to support post-constructor functionality.
*/
protected final ValueInstantiators[] _valueInstantiators;
/**
* Constructor for creating basic configuration with no additional
* handlers.
*/
public DeserializerFactoryConfig() {
this(null, null, null, null, null);
}
/**
* Copy-constructor that will create an instance that contains defined
* set of additional deserializer providers.
*/
protected DeserializerFactoryConfig(Deserializers[] allAdditionalDeserializers,
KeyDeserializers[] allAdditionalKeyDeserializers,
BeanDeserializerModifier[] modifiers,
AbstractTypeResolver[] atr,
ValueInstantiators[] vi)
{
_additionalDeserializers = (allAdditionalDeserializers == null) ?
NO_DESERIALIZERS : allAdditionalDeserializers;
_additionalKeyDeserializers = (allAdditionalKeyDeserializers == null) ?
NO_KEY_DESERIALIZERS : allAdditionalKeyDeserializers;
_modifiers = (modifiers == null) ? NO_MODIFIERS : modifiers;
_abstractTypeResolvers = (atr == null) ? NO_ABSTRACT_TYPE_RESOLVERS : atr;
_valueInstantiators = (vi == null) ? NO_VALUE_INSTANTIATORS : vi;
}
/**
* Fluent/factory method used to construct a configuration object that
* has same deserializer providers as this instance, plus one specified
* as argument. Additional provider will be added before existing ones,
* meaning it has priority over existing definitions.
*/
public DeserializerFactoryConfig withAdditionalDeserializers(Deserializers additional)
{
if (additional == null) {
throw new IllegalArgumentException("Can not pass null Deserializers");
}
Deserializers[] all = ArrayBuilders.insertInListNoDup(_additionalDeserializers, additional);
return new DeserializerFactoryConfig(all, _additionalKeyDeserializers, _modifiers,
_abstractTypeResolvers, _valueInstantiators);
}
/**
* Fluent/factory method used to construct a configuration object that
* has same key deserializer providers as this instance, plus one specified
* as argument. Additional provider will be added before existing ones,
* meaning it has priority over existing definitions.
*/
public DeserializerFactoryConfig withAdditionalKeyDeserializers(KeyDeserializers additional)
{
if (additional == null) {
throw new IllegalArgumentException("Can not pass null KeyDeserializers");
}
KeyDeserializers[] all = ArrayBuilders.insertInListNoDup(_additionalKeyDeserializers, additional);
return new DeserializerFactoryConfig(_additionalDeserializers, all, _modifiers,
_abstractTypeResolvers, _valueInstantiators);
}
/**
* Fluent/factory method used to construct a configuration object that
* has same configuration as this instance plus one additional
* deserialiazer modifier. Added modifier has the highest priority (that is, it
* gets called before any already registered modifier).
*/
public DeserializerFactoryConfig withDeserializerModifier(BeanDeserializerModifier modifier)
{
if (modifier == null) {
throw new IllegalArgumentException("Can not pass null modifier");
}
BeanDeserializerModifier[] all = ArrayBuilders.insertInListNoDup(_modifiers, modifier);
return new DeserializerFactoryConfig(_additionalDeserializers, _additionalKeyDeserializers, all,
_abstractTypeResolvers, _valueInstantiators);
}
/**
* Fluent/factory method used to construct a configuration object that
* has same configuration as this instance plus one additional
* abstract type resolver.
* Added resolver has the highest priority (that is, it
* gets called before any already registered resolver).
*/
public DeserializerFactoryConfig withAbstractTypeResolver(AbstractTypeResolver resolver)
{
if (resolver == null) {
throw new IllegalArgumentException("Can not pass null resolver");
}
AbstractTypeResolver[] all = ArrayBuilders.insertInListNoDup(_abstractTypeResolvers, resolver);
return new DeserializerFactoryConfig(_additionalDeserializers, _additionalKeyDeserializers, _modifiers,
all, _valueInstantiators);
}
/**
* Fluent/factory method used to construct a configuration object that
* has same configuration as this instance plus specified additional
* value instantiator provider object.
* Added instantiator provider has the highest priority (that is, it
* gets called before any already registered resolver).
*
* @param instantiators Object that can provide {@link com.fasterxml.jackson.databind.deser.ValueInstantiator}s for
* constructing POJO values during deserialization
*/
public DeserializerFactoryConfig withValueInstantiators(ValueInstantiators instantiators)
{
if (instantiators == null) {
throw new IllegalArgumentException("Can not pass null resolver");
}
ValueInstantiators[] all = ArrayBuilders.insertInListNoDup(_valueInstantiators, instantiators);
return new DeserializerFactoryConfig(_additionalDeserializers, _additionalKeyDeserializers, _modifiers,
_abstractTypeResolvers, all);
}
public boolean hasDeserializers() { return _additionalDeserializers.length > 0; }
public boolean hasKeyDeserializers() { return _additionalKeyDeserializers.length > 0; }
public boolean hasDeserializerModifiers() { return _modifiers.length > 0; }
public boolean hasAbstractTypeResolvers() { return _abstractTypeResolvers.length > 0; }
public boolean hasValueInstantiators() { return _valueInstantiators.length > 0; }
public Iterable<Deserializers> deserializers() {
return ArrayBuilders.arrayAsIterable(_additionalDeserializers);
}
public Iterable<KeyDeserializers> keyDeserializers() {
return ArrayBuilders.arrayAsIterable(_additionalKeyDeserializers);
}
public Iterable<BeanDeserializerModifier> deserializerModifiers() {
return ArrayBuilders.arrayAsIterable(_modifiers);
}
public Iterable<AbstractTypeResolver> abstractTypeResolvers() {
return ArrayBuilders.arrayAsIterable(_abstractTypeResolvers);
}
public Iterable<ValueInstantiators> valueInstantiators() {
return ArrayBuilders.arrayAsIterable(_valueInstantiators);
}
}