package com.fasterxml.jackson.datatype.guava;
import com.google.common.base.Optional;
import com.google.common.collect.*;
import com.google.common.hash.HashCode;
import com.google.common.net.HostAndPort;
import com.google.common.net.InternetDomainName;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.Deserializers;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.MapLikeType;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.databind.type.ReferenceType;
import com.fasterxml.jackson.datatype.guava.deser.*;
import com.fasterxml.jackson.datatype.guava.deser.multimap.list.ArrayListMultimapDeserializer;
import com.fasterxml.jackson.datatype.guava.deser.multimap.list.LinkedListMultimapDeserializer;
import com.fasterxml.jackson.datatype.guava.deser.multimap.set.HashMultimapDeserializer;
import com.fasterxml.jackson.datatype.guava.deser.multimap.set.LinkedHashMultimapDeserializer;
import java.io.Serializable;
public class GuavaDeserializers
extends Deserializers.Base
implements Serializable
{
static final long serialVersionUID = 1L;
protected BoundType _defaultBoundType;
public GuavaDeserializers() {
this(null);
}
public GuavaDeserializers(BoundType defaultBoundType) {
_defaultBoundType = defaultBoundType;
}
@Override
public JsonDeserializer<?> findCollectionDeserializer(CollectionType type,
DeserializationConfig config, BeanDescription beanDesc,
TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer)
throws JsonMappingException
{
Class<?> raw = type.getRawClass();
if (ImmutableCollection.class.isAssignableFrom(raw)) {
if (ImmutableList.class.isAssignableFrom(raw)) {
return new ImmutableListDeserializer(type,
elementTypeDeserializer, elementDeserializer);
}
if (ImmutableMultiset.class.isAssignableFrom(raw)) {
if (ImmutableSortedMultiset.class.isAssignableFrom(raw)) {
requireCollectionOfComparableElements(type, "ImmutableSortedMultiset");
return new ImmutableSortedMultisetDeserializer(type,
elementTypeDeserializer, elementDeserializer);
}
return new ImmutableMultisetDeserializer(type, elementTypeDeserializer, elementDeserializer);
}
if (ImmutableSet.class.isAssignableFrom(raw)) {
if (ImmutableSortedSet.class.isAssignableFrom(raw)) {
requireCollectionOfComparableElements(type, "ImmutableSortedSet");
return new ImmutableSortedSetDeserializer(type,
elementTypeDeserializer, elementDeserializer);
}
return new ImmutableSetDeserializer(type,
elementTypeDeserializer, elementDeserializer);
}
return new ImmutableListDeserializer(type, elementTypeDeserializer, elementDeserializer);
}
if (Multiset.class.isAssignableFrom(raw)) {
if (SortedMultiset.class.isAssignableFrom(raw)) {
if (TreeMultiset.class.isAssignableFrom(raw)) {
return new TreeMultisetDeserializer(type, elementTypeDeserializer, elementDeserializer);
}
return new TreeMultisetDeserializer(type, elementTypeDeserializer, elementDeserializer);
}
if (LinkedHashMultiset.class.isAssignableFrom(raw)) {
return new LinkedHashMultisetDeserializer(type, elementTypeDeserializer, elementDeserializer);
}
if (HashMultiset.class.isAssignableFrom(raw)) {
return new HashMultisetDeserializer(type, elementTypeDeserializer, elementDeserializer);
}
if (EnumMultiset.class.isAssignableFrom(raw)) {
}
return new HashMultisetDeserializer(type, elementTypeDeserializer, elementDeserializer);
}
return null;
}
private void requireCollectionOfComparableElements(CollectionType actualType, String targetType) {
Class<?> elemType = actualType.getContentType().getRawClass();
if (!Comparable.class.isAssignableFrom(elemType)) {
throw new IllegalArgumentException("Can not handle " + targetType
+ " with elements that are not Comparable<?> (" + elemType.getName() + ")");
}
}
@Override
public JsonDeserializer<?> findMapDeserializer(MapType type,
DeserializationConfig config, BeanDescription beanDesc,
KeyDeserializer keyDeserializer,
TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer)
throws JsonMappingException
{
Class<?> raw = type.getRawClass();
if (ImmutableMap.class.isAssignableFrom(raw)) {
if (ImmutableSortedMap.class.isAssignableFrom(raw)) {
return new ImmutableSortedMapDeserializer(type, keyDeserializer, elementTypeDeserializer,
elementDeserializer);
}
if (ImmutableBiMap.class.isAssignableFrom(raw)) {
return new ImmutableBiMapDeserializer(type, keyDeserializer, elementTypeDeserializer,
elementDeserializer);
}
return new ImmutableMapDeserializer(type, keyDeserializer, elementTypeDeserializer, elementDeserializer);
}
if (BiMap.class.isAssignableFrom(raw)) {
if (EnumBiMap.class.isAssignableFrom(raw)) {
}
if (EnumHashBiMap.class.isAssignableFrom(raw)) {
}
if (HashBiMap.class.isAssignableFrom(raw)) {
}
}
return null;
}
@Override
public JsonDeserializer<?> findMapLikeDeserializer(MapLikeType type,
DeserializationConfig config, BeanDescription beanDesc,
KeyDeserializer keyDeserializer, TypeDeserializer elementTypeDeserializer,
JsonDeserializer<?> elementDeserializer)
throws JsonMappingException
{
Class<?> raw = type.getRawClass();
if (ListMultimap.class.isAssignableFrom(raw)) {
if (ImmutableListMultimap.class.isAssignableFrom(raw)) {
}
if (ArrayListMultimap.class.isAssignableFrom(raw)) {
return new ArrayListMultimapDeserializer(type, keyDeserializer,
elementTypeDeserializer, elementDeserializer);
}
if (LinkedListMultimap.class.isAssignableFrom(raw)) {
return new LinkedListMultimapDeserializer(type, keyDeserializer,
elementTypeDeserializer, elementDeserializer);
}
if (ForwardingListMultimap.class.isAssignableFrom(raw)) {
}
return new ArrayListMultimapDeserializer(type, keyDeserializer,
elementTypeDeserializer, elementDeserializer);
}
if (SetMultimap.class.isAssignableFrom(raw)) {
if (SortedSetMultimap.class.isAssignableFrom(raw)) {
if (TreeMultimap.class.isAssignableFrom(raw)) {
}
if (ForwardingSortedSetMultimap.class.isAssignableFrom(raw)) {
}
}
if (ImmutableSetMultimap.class.isAssignableFrom(raw)) {
return new LinkedHashMultimapDeserializer(type, keyDeserializer,
elementTypeDeserializer, elementDeserializer);
}
if (HashMultimap.class.isAssignableFrom(raw)) {
return new HashMultimapDeserializer(type, keyDeserializer, elementTypeDeserializer,
elementDeserializer);
}
if (LinkedHashMultimap.class.isAssignableFrom(raw)) {
return new LinkedHashMultimapDeserializer(type, keyDeserializer,
elementTypeDeserializer, elementDeserializer);
}
if (ForwardingSetMultimap.class.isAssignableFrom(raw)) {
}
return new HashMultimapDeserializer(type, keyDeserializer, elementTypeDeserializer,
elementDeserializer);
}
if (Multimap.class.isAssignableFrom(raw)) {
return new LinkedListMultimapDeserializer(type, keyDeserializer,
elementTypeDeserializer, elementDeserializer);
}
if (Table.class.isAssignableFrom(raw)) {
}
return null;
}
@Override
public JsonDeserializer<?> findReferenceDeserializer(ReferenceType refType,
DeserializationConfig config, BeanDescription beanDesc,
TypeDeserializer contentTypeDeserializer, JsonDeserializer<?> contentDeserializer)
{
if (refType.hasRawClass(Optional.class)) {
return new GuavaOptionalDeserializer(refType, null, contentTypeDeserializer, contentDeserializer);
}
return null;
}
@Override
public JsonDeserializer<?> findBeanDeserializer(final JavaType type, DeserializationConfig config,
BeanDescription beanDesc)
{
if (type.hasRawClass(Range.class)) {
return new RangeDeserializer(_defaultBoundType, type);
}
if (type.hasRawClass(HostAndPort.class)) {
return HostAndPortDeserializer.std;
}
if (type.hasRawClass(InternetDomainName.class)) {
return InternetDomainNameDeserializer.std;
}
if (type.hasRawClass(HashCode.class)) {
return HashCodeDeserializer.std;
}
return null;
}
}