Commit f05942ff authored by Greg Messner's avatar Greg Messner
Browse files

Now handles all date strings received from GitLab.

parent 05678e63
...@@ -6,6 +6,8 @@ import java.util.Calendar; ...@@ -6,6 +6,8 @@ import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.TimeZone; import java.util.TimeZone;
import javax.xml.bind.DatatypeConverter;
/** /**
* This class provides utility methods for parsing and formatting ISO8601 formatted dates. * This class provides utility methods for parsing and formatting ISO8601 formatted dates.
*/ */
...@@ -14,29 +16,29 @@ public class ISO8601 { ...@@ -14,29 +16,29 @@ public class ISO8601 {
public static final String PATTERN_MSEC = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; public static final String PATTERN_MSEC = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
public static final String OUTPUT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'"; public static final String OUTPUT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'";
public static final String OUTPUT_MSEC_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; public static final String OUTPUT_MSEC_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
public static final String ALTERNATE_PATTERN = "yyyy-MM-dd HH:mm:ss"; public static final String UTC_PATTERN = "yyyy-MM-dd HH:mm:ss 'UTC'";
private static final SimpleDateFormat iso8601Format; private static final SimpleDateFormat iso8601Format;
private static final SimpleDateFormat iso8601MsecFormat; private static final SimpleDateFormat iso8601MsecFormat;
private static final SimpleDateFormat iso8601OutputFormat; private static final SimpleDateFormat iso8601OutputFormat;
private static final SimpleDateFormat iso8601OutputMsecFormat; private static final SimpleDateFormat iso8601OutputMsecFormat;
private static final SimpleDateFormat iso8601AlternateFormat; private static final SimpleDateFormat iso8601UtcFormat;
static { static {
iso8601Format = new SimpleDateFormat(PATTERN); iso8601Format = new SimpleDateFormat(PATTERN);
iso8601Format.setLenient(true); iso8601Format.setLenient(true);
iso8601Format.setTimeZone(TimeZone.getTimeZone("GMT")); iso8601Format.setTimeZone(TimeZone.getTimeZone("UTC"));
iso8601MsecFormat = new SimpleDateFormat(PATTERN_MSEC); iso8601MsecFormat = new SimpleDateFormat(PATTERN_MSEC);
iso8601MsecFormat.setLenient(true); iso8601MsecFormat.setLenient(true);
iso8601MsecFormat.setTimeZone(TimeZone.getTimeZone("GMT")); iso8601MsecFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
iso8601OutputFormat = new SimpleDateFormat(OUTPUT_PATTERN); iso8601OutputFormat = new SimpleDateFormat(OUTPUT_PATTERN);
iso8601OutputFormat.setLenient(true); iso8601OutputFormat.setLenient(true);
iso8601OutputFormat.setTimeZone(TimeZone.getTimeZone("GMT")); iso8601OutputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
iso8601OutputMsecFormat = new SimpleDateFormat(OUTPUT_MSEC_PATTERN); iso8601OutputMsecFormat = new SimpleDateFormat(OUTPUT_MSEC_PATTERN);
iso8601OutputMsecFormat.setLenient(true); iso8601OutputMsecFormat.setLenient(true);
iso8601OutputMsecFormat.setTimeZone(TimeZone.getTimeZone("GMT")); iso8601OutputMsecFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
iso8601AlternateFormat = new SimpleDateFormat(ALTERNATE_PATTERN); iso8601UtcFormat = new SimpleDateFormat(UTC_PATTERN);
iso8601AlternateFormat.setLenient(true); iso8601UtcFormat.setLenient(true);
iso8601AlternateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); iso8601UtcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
} }
/** /**
...@@ -47,7 +49,7 @@ public class ISO8601 { ...@@ -47,7 +49,7 @@ public class ISO8601 {
public static String getTimestamp() { public static String getTimestamp() {
return (iso8601Format.format(new Date())); return (iso8601Format.format(new Date()));
} }
/** /**
* Get a ISO8601formatted string for the current date and time. * Get a ISO8601formatted string for the current date and time.
* *
...@@ -85,9 +87,7 @@ public class ISO8601 { ...@@ -85,9 +87,7 @@ public class ISO8601 {
} }
long time = date.getTime(); long time = date.getTime();
return (time % 1000 != 0 ? return (time % 1000 != 0 ? iso8601OutputMsecFormat.format(date) : iso8601OutputFormat.format(date));
iso8601OutputMsecFormat.format(date) :
iso8601OutputFormat.format(date));
} }
/** /**
...@@ -104,22 +104,13 @@ public class ISO8601 { ...@@ -104,22 +104,13 @@ public class ISO8601 {
} }
dateTimeString = dateTimeString.trim(); dateTimeString = dateTimeString.trim();
SimpleDateFormat fmt; if (dateTimeString.endsWith("UTC")) {
if (dateTimeString.length() > 10) { synchronized (iso8601UtcFormat) {
if (dateTimeString.charAt(10) == 'T') { return (iso8601UtcFormat.parse(dateTimeString));
fmt = (dateTimeString.endsWith("Z") ? (dateTimeString.charAt(dateTimeString.length() - 4) == '.' ?
iso8601OutputMsecFormat :
iso8601OutputFormat) :
iso8601Format);
} else {
fmt = iso8601AlternateFormat;
} }
} else { } else {
fmt = iso8601Format; Calendar cal = DatatypeConverter.parseDateTime(dateTimeString);
} return (cal.getTime());
synchronized (fmt) {
return (fmt.parse(dateTimeString));
} }
} }
......
...@@ -3,7 +3,10 @@ package com.messners.gitlab.api; ...@@ -3,7 +3,10 @@ package com.messners.gitlab.api;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.TimeZone;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
...@@ -14,8 +17,11 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; ...@@ -14,8 +17,11 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
...@@ -34,6 +40,13 @@ import com.messners.gitlab.api.models.AccessLevel; ...@@ -34,6 +40,13 @@ import com.messners.gitlab.api.models.AccessLevel;
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
public class JacksonJson extends JacksonJaxbJsonProvider implements ContextResolver<ObjectMapper> { public class JacksonJson extends JacksonJaxbJsonProvider implements ContextResolver<ObjectMapper> {
private static final SimpleDateFormat iso8601UtcFormat;
static {
iso8601UtcFormat = new SimpleDateFormat(ISO8601.UTC_PATTERN);
iso8601UtcFormat.setLenient(true);
iso8601UtcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
}
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
public JacksonJson() { public JacksonJson() {
...@@ -50,6 +63,7 @@ public class JacksonJson extends JacksonJaxbJsonProvider implements ContextResol ...@@ -50,6 +63,7 @@ public class JacksonJson extends JacksonJaxbJsonProvider implements ContextResol
SimpleModule module = new SimpleModule("GitLabApiJsonModule"); SimpleModule module = new SimpleModule("GitLabApiJsonModule");
module.addSerializer(Date.class, new JsonDateSerializer()); module.addSerializer(Date.class, new JsonDateSerializer());
module.addDeserializer(Date.class, new JsonDateDeserializer());
module.addSerializer(AccessLevel.class, new JsonAccessLevelSerializer()); module.addSerializer(AccessLevel.class, new JsonAccessLevelSerializer());
objectMapper.registerModule(module); objectMapper.registerModule(module);
} }
...@@ -137,7 +151,23 @@ public class JacksonJson extends JacksonJaxbJsonProvider implements ContextResol ...@@ -137,7 +151,23 @@ public class JacksonJson extends JacksonJaxbJsonProvider implements ContextResol
gen.writeString(iso8601String); gen.writeString(iso8601String);
} }
} }
/**
* JsonDeserializer for deserializing ISO8601 formatted dates.
*/
public static class JsonDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException, JsonProcessingException {
try {
return (ISO8601.toDate(jsonparser.getText()));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
/** /**
* JsonSerializer for serializing AccessLevel values. * JsonSerializer for serializing AccessLevel values.
*/ */
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment