com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.java Source code

Java tutorial

Introduction

Here is the source code for com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.java

Source

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 {
    private static final long serialVersionUID = 1L;

    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) {
        Class<?> cls = deser.handledType();
        if (cls != null) {
            return cls;
        }
        return Object.class;
    }

    /*
    /**********************************************************************
    /* 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 {
        JsonDeserializer<?> del = ctxt.handleSecondaryContextualization(_delegatee, property);
        if (del == _delegatee) {
            return this;
        }
        return newDelegatingInstance(del);
    }

    /**
     * @deprecated Since 2.3, use {@link #newDelegatingInstance} instead
     */
    @Deprecated
    protected JsonDeserializer<?> _createContextual(DeserializationContext ctxt, BeanProperty property,
            JsonDeserializer<?> newDelegatee) {
        if (newDelegatee == _delegatee) {
            return this;
        }
        return newDelegatingInstance(newDelegatee);
    }

    @Override
    public SettableBeanProperty findBackReference(String logicalName) {
        // [Issue#253]: Hope this works....
        return _delegatee.findBackReference(logicalName);
    }

    /*
    /**********************************************************************
    /* 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 _delegatee.isCachable();
    }

    @Override
    public ObjectIdReader getObjectIdReader() {
        return _delegatee.getObjectIdReader();
    }

    @Override
    public JsonDeserializer<?> getDelegatee() {
        return _delegatee;
    }
}