All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.stanford.protege.webprotege.api.TimestampDeserializer Maven / Gradle / Ivy

The newest version!
package edu.stanford.protege.webprotege.api;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

import javax.annotation.Nonnull;
import java.io.IOException;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;

/**
 * Matthew Horridge
 * Stanford Center for Biomedical Informatics Research
 * 18 Jul 2018
 *
 * Deserializes ISO timestamps into longs (UTC Zone).  This also deserializes
 * mongodb timestamps which look like this  ISODate("2018-09-01T01:02:03Z")
 */
@Deprecated
public class TimestampDeserializer extends StdDeserializer {

    private static final String UTC = "UTC";

    private static final ZoneId ZONE_ID = ZoneId.of(UTC);

    private static final DateTimeFormatter FORMATTER = createFormatter();

    // Legacy MongoDB serialization
    private static final String ISODATE_PREFIX = "ISODate(\"";

    private static final String ISODATE_SUFFIX = "\")";

    public TimestampDeserializer() {
        super(String.class);
    }

    @Override
    public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        String ts = extractDateTime(jsonParser.getValueAsString());
        ZonedDateTime dateTime = ZonedDateTime.parse(ts, FORMATTER);
        Instant instant = dateTime.toInstant();
        return instant.toEpochMilli();
    }

    private static String extractDateTime(@Nonnull String dateTime) {
        if(dateTime.startsWith(ISODATE_PREFIX)) {
            return dateTime.substring(ISODATE_PREFIX.length(), dateTime.length() - ISODATE_SUFFIX.length());
        }
        else {
            return dateTime;
        }
    }

    private static DateTimeFormatter createFormatter() {
        // This stuff is due to a JDK bug in parsing date times with basic zone
        // offsets (i.e. zone offsets that do not contain colons)
        // See https://stackoverflow.com/questions/46487403, where this was taken from
        return new DateTimeFormatterBuilder()
                // date/time
                .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                // offset (hh:mm - "+00:00" when it's zero)
                .optionalStart().appendOffset("+HH:MM", "+00:00").optionalEnd()
                // offset (hhmm - "+0000" when it's zero)
                .optionalStart().appendOffset("+HHMM", "+0000").optionalEnd()
                // offset (hh - "Z" when it's zero)
                .optionalStart().appendOffset("+HH", "Z").optionalEnd()
                // create formatter
                .toFormatter();

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy