package com.fasterxml.jackson.datatype.joda.deser;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
Intermediate base class used by deserializers that allow configuration
via JsonFormat
annotation
Since: 2.6
/**
* Intermediate base class used by deserializers that allow configuration
* via <code>JsonFormat</code> annotation
*
* @since 2.6
*/
public abstract class JodaDateDeserializerBase<T>
extends JodaDeserializerBase<T>
//need contextualization to read per-property annotations
implements ContextualDeserializer
{
private static final long serialVersionUID = 1L;
protected final JacksonJodaDateFormat _format;
protected JodaDateDeserializerBase(Class<?> type, JacksonJodaDateFormat format)
{
super(type);
_format = format;
}
public abstract JodaDateDeserializerBase<?> withFormat(JacksonJodaDateFormat format);
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
BeanProperty prop) throws JsonMappingException
{
JsonFormat.Value ann = findFormatOverrides(ctxt, prop, handledType());
if (ann != null) {
JacksonJodaDateFormat format = _format;
Boolean useTimestamp;
// Simple case first: serialize as numeric timestamp?
if (ann.getShape().isNumeric()) {
useTimestamp = Boolean.TRUE;
} else if (ann.getShape() == JsonFormat.Shape.STRING) {
useTimestamp = Boolean.FALSE;
} else if (ann.getShape() == JsonFormat.Shape.ARRAY) {
// 17-Nov-2014, tatu: also, arrays typically contain non-string representation
useTimestamp = Boolean.TRUE;
} else {
useTimestamp = null;
}
// must not call if flag defined, to rely on defaults:
if (useTimestamp != null) {
format = format.withUseTimestamp(useTimestamp);
}
// for others, safe to call, null/empty just ignored
format = format.with(ann);
if (format != _format) {
return withFormat(format);
}
}
return this;
}
}