blob: 73321eca3475a1353d8b1958681535c495dd42d4 [file] [log] [blame]
package org.codehaus.jackson.map;
import org.codehaus.jackson.map.ser.BeanSerializerModifier;
import org.codehaus.jackson.type.JavaType;
/**
* Abstract class that defines API used by {@link SerializerProvider}
* to obtain actual
* {@link JsonSerializer} instances from multiple distinct factories.
*/
public abstract class SerializerFactory
{
/*
/**********************************************************
/* Helper class to contain configuration settings
/**********************************************************
*/
/**
* Configuration settings container class for bean serializer factory.
*
* @since 1.7
*/
public abstract static class Config
{
/**
* Method for creating a new instance with additional serializer provider.
*/
public abstract Config withAdditionalSerializers(Serializers additional);
/**
* @since 1.8
*/
public abstract Config withAdditionalKeySerializers(Serializers additional);
/**
* Method for creating a new instance with additional bean serializer modifier.
*/
public abstract Config withSerializerModifier(BeanSerializerModifier modifier);
public abstract boolean hasSerializers();
public abstract boolean hasKeySerializers();
public abstract boolean hasSerializerModifiers();
public abstract Iterable<Serializers> serializers();
public abstract Iterable<Serializers> keySerializers();
public abstract Iterable<BeanSerializerModifier> serializerModifiers();
}
/*
/**********************************************************
/* Additional configuration
/**********************************************************
*/
/**
* @since 1.7
*/
public abstract Config getConfig();
/**
* Method used for creating a new instance of this factory, but with different
* configuration. Reason for specifying factory method (instead of plain constructor)
* is to allow proper sub-classing of factories.
*<p>
* Note that custom sub-classes generally <b>must override</b> implementation
* of this method, as it usually requires instantiating a new instance of
* factory type. Check out javadocs for
* {@link org.codehaus.jackson.map.ser.BeanSerializerFactory} for more details.
*
* @since 1.7
*/
public abstract SerializerFactory withConfig(Config config);
/**
* Convenience method for creating a new factory instance with additional serializer
* provider; equivalent to calling
*<pre>
* withConfig(getConfig().withAdditionalSerializers(additional));
*<pre>
*
* @since 1.7
*/
public final SerializerFactory withAdditionalSerializers(Serializers additional) {
return withConfig(getConfig().withAdditionalSerializers(additional));
}
/**
* @since 1.8
*/
public final SerializerFactory withAdditionalKeySerializers(Serializers additional) {
return withConfig(getConfig().withAdditionalKeySerializers(additional));
}
/**
* Convenience method for creating a new factory instance with additional bean
* serializer modifier; equivalent to calling
*<pre>
* withConfig(getConfig().withSerializerModifier(modifier));
*<pre>
*
* @since 1.7
*/
public final SerializerFactory withSerializerModifier(BeanSerializerModifier modifier) {
return withConfig(getConfig().withSerializerModifier(modifier));
}
/*
/**********************************************************
/* Basic SerializerFactory API:
/**********************************************************
*/
/**
* Method called to create (or, for immutable serializers, reuse) a serializer for given type.
*/
public abstract JsonSerializer<Object> createSerializer(SerializationConfig config, JavaType baseType,
BeanProperty property)
throws JsonMappingException;
/**
* Method called to create a type information serializer for given base type,
* if one is needed. If not needed (no polymorphic handling configured), should
* return null.
*
* @param baseType Declared type to use as the base type for type information serializer
*
* @return Type serializer to use for the base type, if one is needed; null if not.
*
* @since 1.7
*/
public abstract TypeSerializer createTypeSerializer(SerializationConfig config, JavaType baseType,
BeanProperty property)
throws JsonMappingException;
/**
* Method called to create serializer to use for serializing JSON property names (which must
* be output as <code>JsonToken.FIELD_NAME</code>) for Map that has specified declared
* key type, and is for specified property (or, if property is null, as root value)
*
* @param config Serialization configuration in use
* @param baseType Declared type for Map keys
* @param property Property that contains Map being serialized; null when serializing root Map value.
*
* @return Serializer to use, if factory knows it; null if not (in which case default serializer
* is to be used)
*
* @since 1.8
*/
public abstract JsonSerializer<Object> createKeySerializer(SerializationConfig config, JavaType baseType,
BeanProperty property)
throws JsonMappingException;
/*
/**********************************************************
/* Deprecated (as of 1.7) SerializerFactory API:
/**********************************************************
*/
/**
* Deprecated version of accessor for type id serializer: as of 1.7 one needs
* to instead call version that passes property information through.
*
* @since 1.5
*
* @deprecated Since 1.7, call variant with more arguments
*/
@Deprecated
public final JsonSerializer<Object> createSerializer(JavaType type, SerializationConfig config) {
try {
return createSerializer(config, type, null);
} catch (JsonMappingException e) { // not optimal but:
throw new RuntimeJsonMappingException(e);
}
}
/**
* Deprecated version of accessor for type id serializer: as of 1.7 one needs
* to instead call version that passes property information through.
*
* @since 1.5
*
* @deprecated Since 1.7, call variant with more arguments
*/
@Deprecated
public final TypeSerializer createTypeSerializer(JavaType baseType, SerializationConfig config) {
try {
return createTypeSerializer(config, baseType, null);
} catch (JsonMappingException e) { // not optimal but:
throw new RuntimeException(e);
}
}
}