package com.fasterxml.jackson.databind.jsontype.impl;

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonTypeInfo;

import com.fasterxml.jackson.core.JsonGenerator;

import com.fasterxml.jackson.core.type.WritableTypeId;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;

public abstract class TypeSerializerBase extends TypeSerializer
{
    protected final TypeIdResolver _idResolver;

    protected final BeanProperty _property;

    protected TypeSerializerBase(TypeIdResolver idRes, BeanProperty property)
    {
        _idResolver = idRes;
        _property = property;
    }

    /*
    /**********************************************************
    /* Base implementations, simple accessors
    /**********************************************************
     */

    @Override
    public abstract JsonTypeInfo.As getTypeInclusion();

    @Override
    public String getPropertyName() { return null; }
    
    @Override
    public TypeIdResolver getTypeIdResolver() { return _idResolver; }

    @Override
    public WritableTypeId writeTypePrefix(JsonGenerator g,
            WritableTypeId idMetadata) throws IOException
    {
        _generateTypeId(idMetadata);
        return g.writeTypePrefix(idMetadata);
    }

    @Override
    public WritableTypeId writeTypeSuffix(JsonGenerator g,
            WritableTypeId idMetadata) throws IOException
    {
        return g.writeTypeSuffix(idMetadata);
    }

    
Helper method that will generate type id to use, if not already passed.
Since:2.9
/** * Helper method that will generate type id to use, if not already passed. * * @since 2.9 */
protected void _generateTypeId(WritableTypeId idMetadata) { Object id = idMetadata.id; if (id == null) { final Object value = idMetadata.forValue; Class<?> typeForId = idMetadata.forValueType; if (typeForId == null) { id = idFromValue(value); } else { id = idFromValueAndType(value, typeForId); } idMetadata.id = id; } } /* /********************************************************** /* Helper methods for subclasses /********************************************************** */ protected String idFromValue(Object value) { String id = _idResolver.idFromValue(value); if (id == null) { handleMissingId(value); } return id; } protected String idFromValueAndType(Object value, Class<?> type) { String id = _idResolver.idFromValueAndType(value, type); if (id == null) { handleMissingId(value); } return id; } // As per [databind#633], maybe better just not do anything... protected void handleMissingId(Object value) { /* String typeDesc = ClassUtil.classNameOf(value, "NULL"); throw new IllegalArgumentException("Cannot resolve type id for " +typeDesc+" (using "+_idResolver.getClass().getName()+")"); */ } }