package org.cagrid.core.xml; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; import javax.xml.bind.DatatypeConverter; import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; /** * The DateAdapter is used by JAXB to convert GregorianCalendars to * java.util.Date. This allows us to re-map the dateTime xmlType to * java.util.Date rather than XMLGregorianCalendar. The jaxb-bindings.xjb * configuration specifies that the DateAdapter implements the parseDate and * printDate methods needed by JAXB. */ public class DateAdapter extends XmlAdapter<String, Date> { private final static TimeZone GMT = TimeZone.getTimeZone("GMT"); public static Date parseDate(String s) { return DatatypeConverter.parseDate(s).getTime(); } public static String printDate(Date d) { if (d == null) return null; Calendar c = Calendar.getInstance(); c.setTime(d); return DatatypeConverter.printDate(c); } public static Date parseDateTime(String s) { return DatatypeConverter.parseDateTime(s).getTime(); } public static String printDateTime(Date d) { if (d == null) return null; Calendar c = Calendar.getInstance(GMT); c.setTime(d); return DatatypeConverter.printDateTime(c); } public static java.sql.Date parseSQLDate(String s) { return new java.sql.Date(DatatypeConverter.parseDate(s).getTime().getTime()); } public static java.sql.Time parseSQLTime(String s) { return new java.sql.Time(DatatypeConverter.parseDate(s).getTime().getTime()); } public static java.sql.Timestamp parseSQLTimestamp(String s) { return new java.sql.Timestamp(DatatypeConverter.parseDateTime(s).getTime().getTime()); } @Override public Date unmarshal(String v) throws Exception { if (v == null) return null; DatatypeFactory dtf = DatatypeFactory.newInstance(); XMLGregorianCalendar xgc = dtf.newXMLGregorianCalendar(v); GregorianCalendar cal = xgc.toGregorianCalendar(); return cal.getTime(); } @Override public String marshal(Date v) throws Exception { if (v == null) return null; GregorianCalendar cal = new GregorianCalendar(); cal.setTime(v); DatatypeFactory dtf = DatatypeFactory.newInstance(); return dtf.newXMLGregorianCalendar(cal).toXMLFormat(); } }