/** * The contents of this file are subject to the OpenMRS Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.module.sync.serialization; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang.StringUtils; public class TimestampNormalizer extends Normalizer { public static final String DATETIME_MASK = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; public static final String DATETIME_MASK_BACKUP = "yyyy-MM-dd HH:mm:ss.S"; // because we are converting to strings in more than one way, so need a way to convert back public static final String DATETIME_DISPLAY_FORMAT = "dd MMM yyyy HH:mm:ss"; public String toString(Object o) { java.sql.Date d; java.sql.Time t; long time; String result = null; if (o instanceof java.sql.Timestamp){ //this is how hibernate recreates Date objects SimpleDateFormat dfm = new SimpleDateFormat(TimestampNormalizer.DATETIME_MASK); result = dfm.format((Date)o); } else if (o instanceof java.sql.Date){ d = (java.sql.Date)o; t = new java.sql.Time(d.getTime()); result = d.toString() + ' ' + t.toString(); } else if (o instanceof java.util.Date){ SimpleDateFormat dfm = new SimpleDateFormat(TimestampNormalizer.DATETIME_MASK); result = dfm.format((Date)o);; } else if (o instanceof java.util.Calendar){ time = ((java.util.Calendar)o).getTime().getTime(); d = new java.sql.Date(time); t = new java.sql.Time(time); result = d.toString() + ' ' + t.toString(); } else { log.warn("Unknown class in timestamp " + o.getClass().getName()); result = o.toString();//ugh } return result; } @Override public Object fromString(Class clazz, String s) { if (StringUtils.isBlank(s)) return null; if ("java.util.Date".equals(clazz.getName()) || "java.sql.Timestamp".equals(clazz.getName())) { //result = d.toString() + ' ' + t.toString(); Date result = null; SimpleDateFormat dfm = new SimpleDateFormat(DATETIME_MASK); try { result = dfm.parse(s.trim()); } catch (ParseException e) { log.debug("DateParsingException trying to turn " + s + " into a date with pattern: " + dfm.toPattern() + " , so retrying with backup mask"); try { dfm = new SimpleDateFormat(DATETIME_MASK_BACKUP); result = dfm.parse(s.trim()); } catch (ParseException pee) { log.debug("Still getting DateParsingException trying to turn " + s + " into a date using backup pattern: " + dfm.toPattern()); } } return result; } return null; } }