package org.codehaus.jackson.map.ser;
import java.util.*;
import org.codehaus.jackson.type.JavaType;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ser.SerializerCache.*;
/**
* Optimized lookup table for accessing two types of serializers; typed
* and non-typed.
*/
public final class ReadOnlyClassToSerializerMap
{
/**
*<p>
* NOTE: keys are {@link ClassPairKey}s (for "typed" serializers) and
* {@link JavaType}s (untyped)
*/
final HashMap<Object, JsonSerializer<Object>> _map;
/**
* We'll reuse key class to avoid unnecessary instantiations; since
* this is not shared between threads, we can just reuse single
* instance.
*/
final TypedKeyRaw _typedKeyRaw = new TypedKeyRaw(getClass());
final TypedKeyFull _typedKeyFull = new TypedKeyFull(null);
final UntypedKeyRaw _untypedKeyRaw = new UntypedKeyRaw(getClass());
private ReadOnlyClassToSerializerMap(HashMap<Object, JsonSerializer<Object>> map)
{
_map = map;
}
public ReadOnlyClassToSerializerMap instance()
{
return new ReadOnlyClassToSerializerMap(_map);
}
/**
* Factory method for creating the "blueprint" lookup map. Such map
* can not be used as is but just shared: to get an actual usable
* instance, {@link #instance} has to be called first.
*/
@SuppressWarnings("unchecked")
public static ReadOnlyClassToSerializerMap from(HashMap<Object, JsonSerializer<Object>> src)
{
return new ReadOnlyClassToSerializerMap((HashMap<Object, JsonSerializer<Object>>)src.clone());
}
public JsonSerializer<Object> typedValueSerializer(JavaType type)
{
_typedKeyFull.reset(type);
return _map.get(_typedKeyFull);
}
public JsonSerializer<Object> typedValueSerializer(Class<?> cls)
{
_typedKeyRaw.reset(cls);
return _map.get(_typedKeyRaw);
}
public JsonSerializer<Object> untypedValueSerializer(Class<?> cls)
{
_untypedKeyRaw.reset(cls);
return _map.get(_untypedKeyRaw);
}
/**
* @since 1.5
*/
public JsonSerializer<Object> untypedValueSerializer(JavaType type)
{
return _map.get(type);
}
}