DelegatingSerializer.java

package tools.jackson.databind.ser.std;

import java.util.Iterator;
import java.util.Objects;
import java.util.Set;

import com.fasterxml.jackson.annotation.JsonFormat;

import tools.jackson.core.JsonGenerator;

import tools.jackson.databind.*;
import tools.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
import tools.jackson.databind.jsontype.TypeSerializer;
import tools.jackson.databind.ser.PropertyWriter;
import tools.jackson.databind.util.NameTransformer;

/**
 * Base class that simplifies implementations of {@link ValueSerializer}s
 * that mostly delegate functionality to another serializer implementation
 * (possibly forming a chaining of serializers delegating functionality
 * in some cases).
 *
 * @since 3.1
 */
public abstract class DelegatingSerializer
    extends StdSerializer<Object>
{
    protected final ValueSerializer<Object> _delegatee;

    /*
    /**********************************************************************
    /* Construction
    /**********************************************************************
     */
    @SuppressWarnings("unchecked")
    public DelegatingSerializer(ValueSerializer<?> delegatee) {
        super((Class<Object>) Objects.requireNonNull(delegatee, "delegatee must not be null").handledType());
        _delegatee = (ValueSerializer<Object>) delegatee;
    }

    /*
    /**********************************************************************
    /* Abstract methods to implement
    /**********************************************************************
     */

    protected abstract ValueSerializer<Object> newDelegatingInstance(ValueSerializer<?> newDelegatee);

    protected final ValueSerializer<Object> _newIfChanged(ValueSerializer<?> newDelegatee) {
        if (newDelegatee == _delegatee) {
            return this;
        }
        return newDelegatingInstance(newDelegatee);
    }
    
    /*
    /**********************************************************************
    /* Overridden "mutant factory" methods
    /**********************************************************************
     */

    @Override
    public ValueSerializer<Object> replaceDelegatee(ValueSerializer<?> delegatee) {
        return _newIfChanged(delegatee);
    }

    @Override
    public ValueSerializer<Object> unwrappingSerializer(NameTransformer unwrapper) {
        return _newIfChanged(_delegatee.unwrappingSerializer(unwrapper));
    }
    
    @Override
    public ValueSerializer<?> withFilterId(Object filterId) {
        return _newIfChanged(_delegatee.withFilterId(filterId));
    }

    @Override
    public ValueSerializer<?> withFormatOverrides(SerializationConfig config,
            JsonFormat.Value formatOverrides) {
        return _newIfChanged(_delegatee.withFormatOverrides(config, formatOverrides));
    }
    
    @Override
    public ValueSerializer<?> withIgnoredProperties(Set<String> ignoredProperties) {
        return _newIfChanged(_delegatee.withIgnoredProperties(ignoredProperties));
    }

    /*
    /**********************************************************************
    /* Overridden methods for contextualization, resolving
    /**********************************************************************
     */

    @Override
    public void resolve(SerializationContext ctxt) {
        _delegatee.resolve(ctxt);
    }

    @Override
    public ValueSerializer<?> createContextual(SerializationContext ctxt, BeanProperty property)
    {
        return _newIfChanged(ctxt.handleSecondaryContextualization(_delegatee, property));
    }

    /*
    /**********************************************************************
    /* Overridden serialization methods
    /**********************************************************************
     */

    @Override
    public boolean isEmpty(SerializationContext ctxt, Object value) {
        return _delegatee.isEmpty(ctxt, value);
    }

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializationContext ctxt) {
        _delegatee.serialize(value, gen, ctxt);
    }

    @Override
    public void serializeWithType(Object value, JsonGenerator gen, SerializationContext ctxt,
            TypeSerializer typeSer) {
        _delegatee.serializeWithType(value, gen, ctxt, typeSer);
    }

    /*
    /**********************************************************************
    /* Overridden accessors
    /**********************************************************************
     */
    
    @Override
    public Class<?> handledType() { return _delegatee.handledType(); }

    @Override
    public boolean usesObjectId() { return _delegatee.usesObjectId(); }

    @Override
    public boolean isUnwrappingSerializer() { return _delegatee.isUnwrappingSerializer(); }

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

    @Override
    public Iterator<PropertyWriter> properties() { return _delegatee.properties(); }

    @Override
    public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType type) {
        _delegatee.acceptJsonFormatVisitor(visitor, type);
    }
}