package utils;
import java.lang.reflect.Type;
import org.joda.time.DateTime;
import play.Play;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
/**
* Creates GsonBuilder objects that are setup with specific type adapters and attributes
* for this application.
*
* @author Alex Jarvis axj7@aber.ac.uk
*/
public class GsonFactory {
/**
* Returns a GsonBuilder object with custom type adapters for Joda's DateTime class
* and also pretty printing (if set in the configuration).
* @return
*/
public static GsonBuilder gsonBuilder() {
GsonBuilder gson = new GsonBuilder();
if (Boolean.parseBoolean(Play.configuration.getProperty("json.prettyprinting"))) {
gson.setPrettyPrinting();
}
gson.registerTypeAdapter(DateTime.class, new GsonFactory.DateTimeSerializer());
gson.registerTypeAdapter(DateTime.class, new GsonFactory.DateTimeDeserializer());
return gson;
}
/**
* Serializes Joda's DateTime object into an ISO8601 string.
*
* @author Alex Jarvis axj7@aber.ac.uk
*/
public static class DateTimeSerializer implements JsonSerializer<DateTime> {
public JsonElement serialize(DateTime src, Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(src.toString());
}
}
/**
* Deserializes an ISO8601 date string into a Joda DateTime object.
*
* @author Alex Jarvis axj7@aber.ac.uk
*/
private static class DateTimeDeserializer implements JsonDeserializer<DateTime> {
public DateTime deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
// TODO: remove this quickfix
String dateTimeString = json.getAsJsonPrimitive().getAsString();
if (dateTimeString.endsWith("+100")) {
dateTimeString.replace("+100", "+0100");
}
return new DateTime(dateTimeString);
}
}
}