Package io.fathom.cloud.openstack.client

Source Code of io.fathom.cloud.openstack.client.DateTypeAdapter

package io.fathom.cloud.openstack.client;

import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.JsonSyntaxException;

public class DateTypeAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> {
    private static final Logger log = LoggerFactory.getLogger(DateTypeAdapter.class);

    private final DateFormat dateFormat;
    private final DateFormat dateFormatZulu;
    private final DateFormat dateFormatZuluNoMillis;

    public DateTypeAdapter() {
        dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.US);
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

        dateFormatZulu = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
        dateFormatZulu.setTimeZone(TimeZone.getTimeZone("UTC"));

        dateFormatZuluNoMillis = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
        dateFormatZuluNoMillis.setTimeZone(TimeZone.getTimeZone("UTC"));
    }

    @Override
    public synchronized JsonElement serialize(Date date, Type type, JsonSerializationContext jsonSerializationContext) {
        synchronized (dateFormat) {
            String dateFormatAsString = dateFormat.format(date);
            return new JsonPrimitive(dateFormatAsString);
        }
    }

    @Override
    public synchronized Date deserialize(JsonElement jsonElement, Type type,
            JsonDeserializationContext jsonDeserializationContext) {
        DateFormat useDateFormat;

        String s = jsonElement.getAsString();
        boolean hasMillis = s.contains(".");
        if (s.endsWith("Z")) {
            useDateFormat = hasMillis ? dateFormatZulu : dateFormatZuluNoMillis;
        } else {
            if (!hasMillis) {
                log.warn("Cannot deserialize date: {}", s);
                throw new UnsupportedOperationException();
            }
            useDateFormat = dateFormat;
        }
        try {
            synchronized (useDateFormat) {
                return useDateFormat.parse(s);
            }
        } catch (ParseException e) {
            throw new JsonSyntaxException(s, e);
        }
    }
}
TOP

Related Classes of io.fathom.cloud.openstack.client.DateTypeAdapter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.