package com.palmnest.application.core.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.lang.StringUtils;

/**
 * This class is converts a java.util.Date to a String and a String to a
 * java.util.Date for use as a Timestamp. It is used by BeanUtils when copying
 * properties.
 *
 * @author <a href="mailto:chasel.java@gmail.com">Chasel Li</a>
 */
public class TimestampConverter extends DateConverter {
	/**
	 * i18n-ized timestamp format - based on values in ApplicationResources.properties
	 */
	public static final String TS_FORMAT = DateUtil.getDatePattern() + " HH:mm:ss.S";

	/**
	 * Convert a String to a date
	 *
	 * @param type  java.util.Date
	 * @param value the String value
	 * @return a converted date
	 */
	@SuppressWarnings("rawtypes")
	protected Object convertToDate(Class type, Object value) {
		DateFormat df = new SimpleDateFormat(TS_FORMAT);
		if (value instanceof String) {
			try {
				if (StringUtils.isEmpty(value.toString())) {
					return null;
				}

				return df.parse((String) value);
			} catch (Exception pe) {
				throw new ConversionException("Error converting String to Timestamp");
			}
		}

		throw new ConversionException("Could not convert "
				+ value.getClass().getName() + " to " + type.getName());
	}

	/**
	 * Convert from a java.util.Date to a String
	 *
	 * @param type  java.lang.String
	 * @param value the date instance
	 * @return string version of date using default date pattern
	 */
	@SuppressWarnings("rawtypes")
	protected Object convertToString(Class type, Object value) {
		DateFormat df = new SimpleDateFormat(TS_FORMAT);
		if (value instanceof Date) {
			try {
				return df.format(value);
			} catch (Exception e) {
				throw new ConversionException("Error converting Timestamp to String");
			}
		}

		return value.toString();
	}
}
