package org.jboss.seam.remoting.wrapper;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* Handles date conversions
*
* @author Shane Bryzak
*/
public class DateWrapper extends BaseWrapper implements Wrapper
{
private static final byte[] DATE_TAG_OPEN = "<date>".getBytes();
private static final byte[] DATE_TAG_CLOSE = "</date>".getBytes();
private static final String DATE_FORMAT = "yyyyMMddHHmmssSSS";
private DateFormat getDateFormat()
{
return new SimpleDateFormat(DATE_FORMAT);
}
public void marshal(OutputStream out) throws IOException
{
out.write(DATE_TAG_OPEN);
if (Date.class.isAssignableFrom(value.getClass()))
{
out.write(getDateFormat().format(value).getBytes());
}
else if (Calendar.class.isAssignableFrom(value.getClass()))
{
out.write(getDateFormat().format(((Calendar) value).getTime()).getBytes());
}
out.write(DATE_TAG_CLOSE);
}
public Object convert(Type type) throws ConversionException
{
if ((type instanceof Class && Date.class.isAssignableFrom((Class) type)) || type.equals(Object.class))
{
try
{
value = getDateFormat().parse(element.getStringValue());
}
catch (ParseException ex)
{
throw new ConversionException(String.format("Date value [%s] is not in a valid format.", element.getStringValue()));
}
}
else if ((type instanceof Class && Calendar.class.isAssignableFrom((Class) type)))
{
try
{
Calendar cal = Calendar.getInstance();
cal.setTime(getDateFormat().parse(element.getStringValue()));
value = cal;
}
catch (ParseException ex)
{
throw new ConversionException(String.format("Date value [%s] is not in a valid format.", element.getStringValue()));
}
}
else
{
throw new ConversionException(String.format("Value [%s] cannot be converted to type [%s].", element.getStringValue(), type));
}
return value;
}
public ConversionScore conversionScore(Class cls)
{
if (Date.class.isAssignableFrom(cls) || Calendar.class.isAssignableFrom(cls))
{
return ConversionScore.exact;
}
else if (cls.equals(Object.class))
{
return ConversionScore.compatible;
}
else
{
return ConversionScore.nomatch;
}
}
}