package com.facebook.presto.jdbc.internal.jackson.datatype.guava;
import com.facebook.presto.jdbc.internal.guava.base.Optional;
import com.facebook.presto.jdbc.internal.guava.cache.CacheBuilder;
import com.facebook.presto.jdbc.internal.guava.cache.CacheBuilderSpec;
import com.facebook.presto.jdbc.internal.guava.collect.Multimap;
import com.facebook.presto.jdbc.internal.guava.collect.Range;
import com.facebook.presto.jdbc.internal.guava.net.HostAndPort;
import com.facebook.presto.jdbc.internal.jackson.databind.*;
import com.facebook.presto.jdbc.internal.jackson.databind.jsontype.TypeSerializer;
import com.facebook.presto.jdbc.internal.jackson.databind.ser.Serializers;
import com.facebook.presto.jdbc.internal.jackson.databind.ser.std.ToStringSerializer;
import com.facebook.presto.jdbc.internal.jackson.databind.type.MapLikeType;
import com.facebook.presto.jdbc.internal.jackson.datatype.guava.ser.GuavaOptionalSerializer;
import com.facebook.presto.jdbc.internal.jackson.datatype.guava.ser.MultimapSerializer;
import com.facebook.presto.jdbc.internal.jackson.datatype.guava.ser.RangeSerializer;
public class GuavaSerializers extends Serializers.Base
{
@Override
public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc)
{
Class<?> raw = type.getRawClass();
if(Optional.class.isAssignableFrom(raw)){
return new GuavaOptionalSerializer(type);
}
if (Range.class.isAssignableFrom(raw)) {
return new RangeSerializer(type);
}
// since 2.4
if (HostAndPort.class.isAssignableFrom(raw)) {
return ToStringSerializer.instance;
}
// not sure how useful, but why not?
if (CacheBuilderSpec.class.isAssignableFrom(raw) || CacheBuilder.class.isAssignableFrom(raw)) {
return ToStringSerializer.instance;
}
return super.findSerializer(config, type, beanDesc);
}
@Override
public JsonSerializer<?> findMapLikeSerializer(SerializationConfig config,
MapLikeType type, BeanDescription beanDesc, JsonSerializer<Object> keySerializer,
TypeSerializer elementTypeSerializer, JsonSerializer<Object> elementValueSerializer)
{
if (Multimap.class.isAssignableFrom(type.getRawClass())) {
return new MultimapSerializer(config, type, beanDesc, keySerializer,
elementTypeSerializer, elementValueSerializer);
}
return null;
}
}