package com.fasterxml.jackson.databind.deser.std;
import java.io.IOException;
import java.util.Collection;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.*;
import com.fasterxml.jackson.databind.deser.impl.ObjectIdReader;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
/**
* Base class that simplifies implementations of {@link JsonDeserializer}s
* that mostly delegate functionality to another deserializer implementation
* (possibly forming a chaing of deserializers delegating functionality
* in some cases)
*
* @since 2.1
*/
public abstract class DelegatingDeserializer
extends StdDeserializer<Object>
implements ContextualDeserializer, ResolvableDeserializer
{
protected final JsonDeserializer<?> _delegatee;
/*
/**********************************************************************
/* Construction
/**********************************************************************
*/
public DelegatingDeserializer(JsonDeserializer<?> delegatee)
{
super(_figureType(delegatee));
_delegatee = delegatee;
}
protected abstract JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegatee);
private static Class<?> _figureType(JsonDeserializer<?> deser)
{
if (deser instanceof StdDeserializer<?>) {
return ((StdDeserializer<?>) deser).getValueClass();
}
return Object.class;
}
/*
/**********************************************************************
/* Overridden methods for contextualization, resolving
/**********************************************************************
*/
public void resolve(DeserializationContext ctxt) throws JsonMappingException {
if (_delegatee instanceof ResolvableDeserializer) {
((ResolvableDeserializer) _delegatee).resolve(ctxt);
}
}
public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
BeanProperty property)
throws JsonMappingException
{
JsonDeserializer<?> del = _delegatee;
if (del instanceof ContextualDeserializer) {
del = ((ContextualDeserializer) del).createContextual(ctxt, property);
}
return _createContextual(ctxt, property, del);
}
protected JsonDeserializer<?> _createContextual(DeserializationContext ctxt,
BeanProperty property, JsonDeserializer<?> newDelegatee)
{
if (newDelegatee == _delegatee) {
return this;
}
return newDelegatingInstance(newDelegatee);
}
/*
/**********************************************************************
/* Overridden deserialization methods
/**********************************************************************
*/
@Override
public Object deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
return _delegatee.deserialize(jp, ctxt);
}
@SuppressWarnings("unchecked")
@Override
public Object deserialize(JsonParser jp, DeserializationContext ctxt,
Object intoValue)
throws IOException, JsonProcessingException
{
return ((JsonDeserializer<Object>)_delegatee).deserialize(jp, ctxt, intoValue);
}
@Override
public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt,
TypeDeserializer typeDeserializer)
throws IOException, JsonProcessingException
{
return _delegatee.deserializeWithType(jp, ctxt, typeDeserializer);
}
/*
/**********************************************************************
/* Overridden other methods
/**********************************************************************
*/
@Override
public JsonDeserializer<?> replaceDelegatee(JsonDeserializer<?> delegatee)
{
if (delegatee == _delegatee) {
return this;
}
return newDelegatingInstance(delegatee);
}
@Override
public Object getNullValue() { return _delegatee.getNullValue(); }
@Override
public Object getEmptyValue() { return _delegatee.getEmptyValue(); }
@Override
public Collection<Object> getKnownPropertyNames() { return _delegatee.getKnownPropertyNames(); }
@Override
public boolean isCachable() { return false; }
@Override
public ObjectIdReader getObjectIdReader() { return _delegatee.getObjectIdReader(); }
@Override
public JsonDeserializer<?> getDelegatee() {
return _delegatee;
}
}