ModuleContextBase.java

package tools.jackson.databind.cfg;

import java.util.Collection;
import java.util.function.UnaryOperator;

import tools.jackson.core.*;

import tools.jackson.databind.*;
import tools.jackson.databind.JacksonModule.SetupContext;
import tools.jackson.databind.deser.*;
import tools.jackson.databind.jsontype.NamedType;
import tools.jackson.databind.ser.SerializerFactory;
import tools.jackson.databind.ser.Serializers;
import tools.jackson.databind.ser.ValueSerializerModifier;
import tools.jackson.databind.type.TypeFactory;
import tools.jackson.databind.type.TypeModifier;

/**
 * Default implementation of {@link SetupContext} used by
 * {@link ObjectMapper}.
 */
public class ModuleContextBase
    implements JacksonModule.SetupContext
{
    // // // Immutable objects we need to access information

    protected final MapperBuilder<?,?> _builder;

    // // // Other modifiable state

    protected final ConfigOverrides _configOverrides;

    /*
    /**********************************************************************
    /* Life-cycle
    /**********************************************************************
     */

    public ModuleContextBase(MapperBuilder<?,?> b,
            ConfigOverrides configOverrides)
    {
        _builder = b;
        _configOverrides = configOverrides;
    }

    /**
     * Method called after all changes have been applied through this context, to
     * propagate buffered or pending changes (if any) back to builder. Note that
     * base implementation does nothing here; it is only provded in case sub-classes
     * might need it.
     */
    public void applyChanges(MapperBuilder<?,?> b) {
        // nothing to apply at base class
    }

    /*
    /**********************************************************************
    /* Accessors for metadata
    /**********************************************************************
     */

    @Override
    public Version getMapperVersion() {
        return tools.jackson.databind.cfg.PackageVersion.VERSION;
    }

    @Override
    public String getFormatName() {
        return _streamFactory().getFormatName();
    }

    /*
    /**********************************************************************
    /* Accessors for subset of handlers
    /**********************************************************************
     */

    @Override
    public Object getOwner() {
        return _builder;
    }

    @Override
    public TypeFactory typeFactory() {
        return _builder.typeFactory();
    }

    @Override
    public TokenStreamFactory tokenStreamFactory() {
        return _streamFactory();
    }

    /*
    /**********************************************************************
    /* Accessors on/off features
    /**********************************************************************
     */

    @Override
    public boolean isEnabled(MapperFeature f) {
        return _builder.isEnabled(f);
    }

    @Override
    public boolean isEnabled(DeserializationFeature f) {
        return _builder.isEnabled(f);
    }

    @Override
    public boolean isEnabled(SerializationFeature f) {
        return _builder.isEnabled(f);
    }

    @Override
    public boolean isEnabled(TokenStreamFactory.Feature f) {
        return _streamFactory().isEnabled(f);
    }

    @Override
    public boolean isEnabled(StreamReadFeature f) {
        return _builder.isEnabled(f);
    }

    @Override
    public boolean isEnabled(StreamWriteFeature f) {
        return _builder.isEnabled(f);
    }

    @Override
    public boolean isEnabled(DatatypeFeature f) {
        return _builder.isEnabled(f);
    }

    @Override
    public DatatypeFeatures datatypeFeatures() {
        return _builder.datatypeFeatures();
    }
    
    /*
    /**********************************************************************
    /* Mutators for adding deserializers, related
    /**********************************************************************
     */

    @Override
    public SetupContext addDeserializers(Deserializers d) {
        _set(_deserializerFactory().withAdditionalDeserializers(d));
        return this;
    }

    @Override
    public SetupContext addKeyDeserializers(KeyDeserializers kd) {
        _set(_deserializerFactory().withAdditionalKeyDeserializers(kd));
        return this;
    }

    @Override
    public SetupContext addDeserializerModifier(ValueDeserializerModifier modifier) {
        _set(_deserializerFactory().withDeserializerModifier(modifier));
        return this;
    }

    @Override
    public SetupContext addValueInstantiators(ValueInstantiators instantiators) {
        _set(_deserializerFactory().withValueInstantiators(instantiators));
        return this;
    }

    /*
    /**********************************************************************
    /* Mutators for adding serializers, related
    /**********************************************************************
     */

    @Override
    public SetupContext addSerializers(Serializers s) {
        _set(_serializerFactory().withAdditionalSerializers(s));
        return this;
    }

    @Override
    public SetupContext addKeySerializers(Serializers s) {
        _set(_serializerFactory().withAdditionalKeySerializers(s));
        return this;
    }

    @Override
    public SetupContext addSerializerModifier(ValueSerializerModifier modifier) {
        _set(_serializerFactory().withSerializerModifier(modifier));
        return this;
    }

    @Override
    public SetupContext overrideDefaultNullKeySerializer(ValueSerializer<?> ser) {
        _set(_serializerFactory().withNullKeySerializer(ser));
        return this;
    }

    @Override
    public SetupContext overrideDefaultNullValueSerializer(ValueSerializer<?> ser) {
        _set(_serializerFactory().withNullValueSerializer(ser));
        return this;
    }

    /*
    /**********************************************************************
    /* Mutators for type handling
    /**********************************************************************
     */

    @Override
    public SetupContext addAbstractTypeResolver(AbstractTypeResolver resolver) {
        _builder.addAbstractTypeResolver(resolver);
        return this;
    }

    @Override
    public SetupContext addTypeModifier(TypeModifier modifier) {
        _builder.addTypeModifier(modifier);
        return this;
    }

    @Override
    public SetupContext registerSubtypes(Class<?>... subtypes) {
        _builder.subtypeResolver().registerSubtypes(subtypes);
        return this;
    }

    @Override
    public SetupContext registerSubtypes(NamedType... subtypes) {
        _builder.subtypeResolver().registerSubtypes(subtypes);
        return this;
    }

    @Override
    public SetupContext registerSubtypes(Collection<Class<?>> subtypes) {
        _builder.subtypeResolver().registerSubtypes(subtypes);
        return this;
    }

    /*
    /**********************************************************************
    /* Mutators for annotation introspection
    /**********************************************************************
     */

    @Override
    public SetupContext insertAnnotationIntrospector(AnnotationIntrospector ai) {
        _builder.baseSettings(_builder.baseSettings()
                .withInsertedAnnotationIntrospector(ai));
        return this;
    }

    @Override
    public SetupContext appendAnnotationIntrospector(AnnotationIntrospector ai) {
        _builder.baseSettings(_builder.baseSettings()
                .withAppendedAnnotationIntrospector(ai));
        return this;
    }

    /*
    /**********************************************************************
    /* Mutators, other
    /**********************************************************************
     */

    @Override
    public MutableConfigOverride configOverride(Class<?> type) {
        return _configOverrides.findOrCreateOverride(type);
    }

    @Override
    public SetupContext addHandler(DeserializationProblemHandler handler)
    {
        _builder.addHandler(handler);
        return this;
    }

    @Override
    public SetupContext overrideInjectableValues(UnaryOperator<InjectableValues> v) {
        InjectableValues oldV = _builder.injectableValues();
        InjectableValues newV = v.apply(oldV);
        if (newV != oldV) {
            _builder.injectableValues(newV);
        }
        return this;
    }

    @Override
    public SetupContext setMixIn(Class<?> target, Class<?> mixinSource) {
        _builder.addMixIn(target, mixinSource);
        return this;
    }

    /*
    /**********************************************************************
    /* Internal/sub-class helper methods
    /**********************************************************************
     */

    protected TokenStreamFactory _streamFactory() {
        return _builder.streamFactory();
    }

    protected DeserializerFactory _deserializerFactory() {
        return _builder.deserializerFactory();
    }

    protected void _set(DeserializerFactory f) {
        _builder.deserializerFactory(f);
    }

    protected SerializerFactory _serializerFactory() {
        return _builder.serializerFactory();
    }

    protected void _set(SerializerFactory f) {
        _builder.serializerFactory(f);
    }
}