package br.com.caelum.vraptor.serialization.gson.adapters;
import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
import br.com.caelum.vraptor.converter.ConversionError;
import br.com.caelum.vraptor.core.Localization;
import br.com.caelum.vraptor.ioc.Component;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
@Component
public class CalendarDeserializer implements JsonDeserializer<Calendar> {
private final Localization localization;
public CalendarDeserializer(Localization localization) {
this.localization = localization;
}
public Calendar deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
Calendar calendar = new GregorianCalendar();
try {
if (json.isJsonPrimitive()) {
String value = json.getAsString();
Locale locale = localization.getLocale();
if (locale == null)
locale = Locale.getDefault();
DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, locale);
Date date = format.parse(value);
calendar.setTime(date);
} else {
JsonObject value = json.getAsJsonObject();
String timezone = value.get("timezone").getAsString();
Long time = value.get("time").getAsLong();
calendar.setTimeZone(TimeZone.getTimeZone(timezone));
calendar.setTimeInMillis(time);
}
return calendar;
}
catch (JsonParseException e) {
throw new ConversionError("Invalid Json format to convert Calendar: " + e.getMessage());
}
catch (ParseException e) {
throw new ConversionError("Error to convert Calendar: " + e.getMessage());
}
}
}