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.databind.*; import com.fasterxml.jackson.databind.deser.*; import com.fasterxml.jackson.databind.deser.impl.ObjectIdReader; import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; import com.fasterxml.jackson.databind.util.AccessPattern; /** * 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 { private static final long serialVersionUID = 1L; protected final JsonDeserializer<?> _delegatee; /* /********************************************************************** /* Construction /********************************************************************** */ public DelegatingDeserializer(JsonDeserializer<?> d) { super(d.getClass()); _delegatee = d; } /* /********************************************************************** /* Abstract methods to implement /********************************************************************** */ protected abstract JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegatee); /* /********************************************************************** /* Overridden methods for contextualization, resolving /********************************************************************** */ @Override public void resolve(DeserializationContext ctxt) throws JsonMappingException { if (_delegatee instanceof ResolvableDeserializer) { ((ResolvableDeserializer) _delegatee).resolve(ctxt); } } @Override public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException { JavaType vt = ctxt.constructType(_delegatee.handledType()); JsonDeserializer<?> del = ctxt.handleSecondaryContextualization(_delegatee, property, vt); if (del == _delegatee) { return this; } return newDelegatingInstance(del); } @Override public JsonDeserializer<?> replaceDelegatee(JsonDeserializer<?> delegatee) { if (delegatee == _delegatee) { return this; } return newDelegatingInstance(delegatee); } /* /********************************************************************** /* Overridden deserialization methods /********************************************************************** */ @Override public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { return _delegatee.deserialize(p, ctxt); } @SuppressWarnings("unchecked") @Override public Object deserialize(JsonParser p, DeserializationContext ctxt, Object intoValue) throws IOException { return ((JsonDeserializer<Object>)_delegatee).deserialize(p, ctxt, intoValue); } @Override public Object deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException { return _delegatee.deserializeWithType(p, ctxt, typeDeserializer); } /* /********************************************************************** /* Overridden other methods /********************************************************************** */ @Override public boolean isCachable() { return _delegatee.isCachable(); } @Override // since 2.9 public Boolean supportsUpdate(DeserializationConfig config) { return _delegatee.supportsUpdate(config); } @Override public JsonDeserializer<?> getDelegatee() { return _delegatee; } @Override public SettableBeanProperty findBackReference(String logicalName) { // [databind#253]: Hope this works.... return _delegatee.findBackReference(logicalName); } @Override public AccessPattern getNullAccessPattern() { return _delegatee.getNullAccessPattern(); } @Override public Object getNullValue(DeserializationContext ctxt) throws JsonMappingException { return _delegatee.getNullValue(ctxt); } @Override public Object getEmptyValue(DeserializationContext ctxt) throws JsonMappingException { return _delegatee.getEmptyValue(ctxt); } @Override public Collection<Object> getKnownPropertyNames() { return _delegatee.getKnownPropertyNames(); } @Override public ObjectIdReader getObjectIdReader() { return _delegatee.getObjectIdReader(); } }