All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.prestosql.jdbc.$internal.jackson.datatype.guava.GuavaSerializers Maven / Gradle / Ivy

There is a newer version: 350
Show newest version
package io.prestosql.jdbc.$internal.jackson.datatype.guava;

import java.io.Serializable;
import java.util.Set;

import io.prestosql.jdbc.$internal.jackson.annotation.JsonIgnoreProperties;
import io.prestosql.jdbc.$internal.jackson.databind.*;
import io.prestosql.jdbc.$internal.jackson.databind.introspect.Annotated;
import io.prestosql.jdbc.$internal.jackson.databind.jsontype.TypeSerializer;
import io.prestosql.jdbc.$internal.jackson.databind.ser.Serializers;
import io.prestosql.jdbc.$internal.jackson.databind.ser.std.ToStringSerializer;
import io.prestosql.jdbc.$internal.jackson.databind.type.MapLikeType;
import io.prestosql.jdbc.$internal.jackson.databind.type.ReferenceType;
import io.prestosql.jdbc.$internal.jackson.databind.ser.std.StdDelegatingSerializer;
import io.prestosql.jdbc.$internal.jackson.databind.util.StdConverter;
import io.prestosql.jdbc.$internal.jackson.datatype.guava.ser.RangeSetSerializer;
import io.prestosql.jdbc.$internal.guava.base.Optional;
import io.prestosql.jdbc.$internal.guava.cache.CacheBuilder;
import io.prestosql.jdbc.$internal.guava.cache.CacheBuilderSpec;
import io.prestosql.jdbc.$internal.guava.collect.FluentIterable;
import io.prestosql.jdbc.$internal.guava.collect.Multimap;
import io.prestosql.jdbc.$internal.guava.collect.Range;
import io.prestosql.jdbc.$internal.guava.collect.RangeSet;
import io.prestosql.jdbc.$internal.guava.collect.Table;
import io.prestosql.jdbc.$internal.guava.hash.HashCode;
import io.prestosql.jdbc.$internal.guava.net.HostAndPort;
import io.prestosql.jdbc.$internal.guava.net.InternetDomainName;
import io.prestosql.jdbc.$internal.jackson.datatype.guava.ser.GuavaOptionalSerializer;
import io.prestosql.jdbc.$internal.jackson.datatype.guava.ser.MultimapSerializer;
import io.prestosql.jdbc.$internal.jackson.datatype.guava.ser.RangeSerializer;
import io.prestosql.jdbc.$internal.jackson.datatype.guava.ser.TableSerializer;

public class GuavaSerializers extends Serializers.Base
    implements Serializable
{
    static final long serialVersionUID = 1L;

    static class FluentConverter extends StdConverter> {
        static final FluentConverter instance = new FluentConverter();

        @Override
        public Iterable convert(Object value) {
            return (Iterable) value;
        }
    }

    @Override
    public JsonSerializer findReferenceSerializer(SerializationConfig config, 
            ReferenceType refType, BeanDescription beanDesc,
            TypeSerializer contentTypeSerializer, JsonSerializer contentValueSerializer)
    {
        final Class raw = refType.getRawClass();
        if (Optional.class.isAssignableFrom(raw)) {
            boolean staticTyping = (contentTypeSerializer == null)
                    && config.isEnabled(MapperFeature.USE_STATIC_TYPING);
            return new GuavaOptionalSerializer(refType, staticTyping,
                    contentTypeSerializer, contentValueSerializer);
        }
        return null;
    }

    @Override
    public JsonSerializer findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc)
    {
        Class raw = type.getRawClass();
        if (RangeSet.class.isAssignableFrom(raw)) {
            return new RangeSetSerializer();
        }
        if (Range.class.isAssignableFrom(raw)) {
            return new RangeSerializer(_findDeclared(type, Range.class));
        }
        if (Table.class.isAssignableFrom(raw)) {
            return new TableSerializer(_findDeclared(type, Table.class));
        }

        // since 2.4
        if (HostAndPort.class.isAssignableFrom(raw)) {
            return ToStringSerializer.instance;
        }
        if (InternetDomainName.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;
        }
        if (HashCode.class.isAssignableFrom(raw)) {
            return ToStringSerializer.instance;
        }
        if (FluentIterable.class.isAssignableFrom(raw)) {
            JavaType iterableType = _findDeclared(type, Iterable.class);
            return new StdDelegatingSerializer(FluentConverter.instance, iterableType, null);
        }
        return super.findSerializer(config, type, beanDesc);
    }

    @Override
    public JsonSerializer findMapLikeSerializer(SerializationConfig config,
            MapLikeType type, BeanDescription beanDesc, JsonSerializer keySerializer,
            TypeSerializer elementTypeSerializer, JsonSerializer elementValueSerializer)
    {
        if (Multimap.class.isAssignableFrom(type.getRawClass())) {
            final AnnotationIntrospector intr = config.getAnnotationIntrospector();
            Object filterId = intr.findFilterId((Annotated)beanDesc.getClassInfo());
            JsonIgnoreProperties.Value ignorals = config.getDefaultPropertyIgnorals(Multimap.class,
                    beanDesc.getClassInfo());
            Set ignored = (ignorals == null) ? null : ignorals.getIgnored();
            return new MultimapSerializer(type, beanDesc,
                    keySerializer, elementTypeSerializer, elementValueSerializer, ignored, filterId);
        }
        return null;
    }

    private JavaType _findDeclared(JavaType subtype, Class target) {
        JavaType decl = subtype.findSuperType(target);
        if (decl == null) { // should never happen but
            throw new IllegalArgumentException("Strange "+target.getName()+" sub-type, "+subtype+", can not find type parameters");
        }
        return decl;
    }
}