package com.fasterxml.jackson.datatype.guava.deser;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.KeyDeserializer;
import com.fasterxml.jackson.databind.deser.NullValueProvider;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import com.google.common.collect.ImmutableMap;
abstract class GuavaImmutableMapDeserializer<T extends ImmutableMap<Object, Object>> extends
GuavaMapDeserializer<T>
{
private static final long serialVersionUID = 2L;
GuavaImmutableMapDeserializer(JavaType type, KeyDeserializer keyDeser,
JsonDeserializer<?> valueDeser, TypeDeserializer valueTypeDeser,
NullValueProvider nuller) {
super(type, keyDeser, valueDeser, valueTypeDeser, nuller);
}
protected abstract ImmutableMap.Builder<Object, Object> createBuilder();
@Override
protected T _deserializeEntries(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
final KeyDeserializer keyDes = _keyDeserializer;
final JsonDeserializer<?> valueDes = _valueDeserializer;
final TypeDeserializer typeDeser = _valueTypeDeserializer;
ImmutableMap.Builder<Object, Object> builder = createBuilder();
for (; p.getCurrentToken() == JsonToken.FIELD_NAME; p.nextToken()) {
String fieldName = p.getCurrentName();
Object key = (keyDes == null) ? fieldName : keyDes.deserializeKey(fieldName, ctxt);
JsonToken t = p.nextToken();
Object value;
if (t == JsonToken.VALUE_NULL) {
if (!_skipNullValues) {
value = _nullProvider.getNullValue(ctxt);
if (value != null) {
builder.put(key, value);
}
}
continue;
}
if (typeDeser == null) {
value = valueDes.deserialize(p, ctxt);
} else {
value = valueDes.deserializeWithType(p, ctxt, typeDeser);
}
builder.put(key, value);
}
@SuppressWarnings("unchecked")
T map = (T) builder.build();
return map;
}
}