package com.github.kzwang.osem.converter;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.AnnotatedField;
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
import com.github.kzwang.osem.annotations.IndexableProperty;
import org.elasticsearch.common.joda.Joda;
import java.io.IOException;
import java.util.Date;
/**
* Custom Data Deserializer use Joda to parse date
*/
public class DateDeserializer extends StdScalarDeserializer<Object>
implements ContextualDeserializer {
private String formatString;
public DateDeserializer() {
super(Object.class);
}
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
if (property != null) {
Annotated annotated = property.getMember();
if (annotated instanceof AnnotatedField || annotated instanceof AnnotatedMethod) {
IndexableProperty indexableProperty = annotated.getAnnotation(IndexableProperty.class);
if (indexableProperty != null && !indexableProperty.format().isEmpty()) {
formatString = indexableProperty.format();
}
}
}
return this;
}
@Override
public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
if (formatString != null && !formatString.isEmpty() && jp.getCurrentToken() == JsonToken.VALUE_STRING) {
String str = jp.getText().trim();
if (str.length() == 0) {
return null;
}
return Joda.forPattern(formatString).parser().parseDateTime(str).toDate();
}
return super._parseDate(jp, ctxt);
}
}