package com.fasterxml.jackson.datatype.guava.deser;
import java.io.IOException;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.fasterxml.jackson.databind.deser.ContextualKeyDeserializer;
import com.fasterxml.jackson.databind.deser.NullValueProvider;
import com.fasterxml.jackson.databind.deser.std.ContainerDeserializerBase;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import com.fasterxml.jackson.databind.type.LogicalType;
import com.fasterxml.jackson.databind.util.AccessPattern;
public abstract class GuavaMapDeserializer<T>
extends ContainerDeserializerBase<T>
implements ContextualDeserializer
{
private static final long serialVersionUID = 2L;
protected KeyDeserializer _keyDeserializer;
protected JsonDeserializer<?> _valueDeserializer;
protected final TypeDeserializer _valueTypeDeserializer;
protected GuavaMapDeserializer(JavaType type, KeyDeserializer keyDeser,
JsonDeserializer<?> valueDeser, TypeDeserializer valueTypeDeser,
NullValueProvider nuller)
{
super(type, nuller, null);
_keyDeserializer = keyDeser;
_valueDeserializer = valueDeser;
_valueTypeDeserializer = valueTypeDeser;
}
public abstract GuavaMapDeserializer<T> withResolved(KeyDeserializer keyDeser,
JsonDeserializer<?> valueDeser, TypeDeserializer valueTypeDeser,
NullValueProvider nuller);
@SuppressWarnings("unchecked")
@Override
public JsonDeserializer<Object> getContentDeserializer() {
return (JsonDeserializer<Object>) _valueDeserializer;
}
@Override
public LogicalType logicalType() {
return LogicalType.Map;
}
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
BeanProperty property) throws JsonMappingException
{
KeyDeserializer keyDeser = _keyDeserializer;
JsonDeserializer<?> valueDeser = _valueDeserializer;
TypeDeserializer valueTypeDeser = _valueTypeDeserializer;
if (keyDeser == null) {
keyDeser = ctxt.findKeyDeserializer(_containerType.getKeyType(), property);
} else {
if (keyDeser instanceof ContextualKeyDeserializer) {
keyDeser = ((ContextualKeyDeserializer) keyDeser).createContextual(ctxt, property);
}
}
final JavaType vt = _containerType.getContentType();
if (valueDeser == null) {
valueDeser = ctxt.findContextualValueDeserializer(vt, property);
} else {
valueDeser = ctxt.handleSecondaryContextualization(valueDeser, property, vt);
}
if (valueTypeDeser != null) {
valueTypeDeser = valueTypeDeser.forProperty(property);
}
NullValueProvider nuller = findContentNullProvider(ctxt, property, valueDeser);
if ((_keyDeserializer == keyDeser) && (_valueDeserializer == valueDeser)
&& (_valueTypeDeserializer == valueTypeDeser)
&& (_nullProvider == nuller)
) {
return this;
}
return withResolved(keyDeser, valueDeser, valueTypeDeser, nuller);
}
@Override
public Object deserializeWithType(JsonParser p, DeserializationContext ctxt,
TypeDeserializer typeDeserializer)
throws IOException
{
return typeDeserializer.deserializeTypedFromObject(p, ctxt);
}
@SuppressWarnings("unchecked")
@Override
public T deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException
{
JsonToken t = p.getCurrentToken();
if (t == JsonToken.START_OBJECT) {
t = p.nextToken();
}
if (t != JsonToken.FIELD_NAME && t != JsonToken.END_OBJECT) {
return (T) ctxt.handleUnexpectedToken(_containerType.getRawClass(), p);
}
return _deserializeEntries(p, ctxt);
}
@Override
public abstract AccessPattern getEmptyAccessPattern();
@Override
public abstract Object getEmptyValue(DeserializationContext ctxt) throws JsonMappingException;
protected abstract T _deserializeEntries(JsonParser p, DeserializationContext ctxt)
throws IOException;
}