package uk.ac.ox.zoo.seeg.abraid.mp.common.web; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer; import org.joda.time.ReadableDateTime; import org.joda.time.ReadableInstant; import org.joda.time.format.DateTimeFormatter; import java.io.IOException; /** * Implements deserialization of Joda DateTime objects, with a custom date/time formatter. * This is necessary because this functionality is not implemented in jackson-datatype-joda's default deserializer * (which this class extends). * * Copyright (c) 2014 University of Oxford */ public class JodaCustomDateTimeDeserializer extends DateTimeDeserializer { private static final long serialVersionUID = 4530909041442821333L; private transient DateTimeFormatter dateTimeFormatter; public JodaCustomDateTimeDeserializer(Class<? extends ReadableInstant> cls, DateTimeFormatter dateTimeFormatter) { super(cls); this.dateTimeFormatter = dateTimeFormatter; } /** * Factory method for a JodaCustomDateTimeDeserializer. * @param cls The class to deserialize. * @param dateTimeFormatter The Joda Time formatter for DateTime objects. * @param <T> The type to deserialize. * @return A new JodaCustomDateTimeDeserializer. */ @SuppressWarnings("unchecked") public static <T extends ReadableInstant> JsonDeserializer<T> forType(Class<T> cls, DateTimeFormatter dateTimeFormatter) { return (JsonDeserializer<T>) new JodaCustomDateTimeDeserializer(cls, dateTimeFormatter); } /** * Deserializes a JSON token (string) into a DateTime, using the supplied DateTimeFormatter. * * Note that not all of the superclass's functionality is implemented, i.e. conversion from integer rather than * string and adjustment for DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE. * * @param jsonParser The JSON parser. * @param context The deserialization context. * @return The deserialized DateTime. * @throws IOException If an error occurs */ @Override public ReadableDateTime deserialize(com.fasterxml.jackson.core.JsonParser jsonParser, DeserializationContext context) throws IOException { JsonToken token = jsonParser.getCurrentToken(); if (token == JsonToken.VALUE_STRING) { String str = jsonParser.getText().trim(); if (str.length() == 0) { return null; } return dateTimeFormatter.parseDateTime(str); } throw context.mappingException(getValueClass()); } }