package br.com.six2six.fixturefactory.transformer;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import org.apache.commons.lang.ClassUtils;
import br.com.six2six.fixturefactory.JavaVersion;
public class CalendarTransformer implements Transformer {
public <T> T transform(Object value, Class<T> type) {
Object returnValue = null;
if (value == null) {
return null;
}
if (ClassUtils.isAssignable(type, XMLGregorianCalendar.class)) {
try {
returnValue = DatatypeFactory.newInstance().newXMLGregorianCalendar((GregorianCalendar) value);
} catch (DatatypeConfigurationException e) {
throw new IllegalArgumentException("Error parser Calendar to XMLGregorianCalendar", e);
}
} else if (ClassUtils.isAssignable(type, java.sql.Date.class)) {
returnValue = new java.sql.Date(((Calendar) value).getTimeInMillis());
} else if (ClassUtils.isAssignable(type, java.util.Date.class)) {
returnValue = ((Calendar) value).getTime();
} else if (ClassUtils.isAssignable(type, Calendar.class)) {
returnValue = value;
} else {
throw new IllegalArgumentException("Incorrect type for transformer: " + type.getCanonicalName());
}
return type.cast(returnValue);
}
public boolean accepts(Object value, Class<?> type) {
boolean instanceOfCalendar = value instanceof Calendar;
return JavaVersion.current().gte(JavaVersion.JAVA_8) ? instanceOfCalendar && !java.time.temporal.Temporal.class.isAssignableFrom(type) : instanceOfCalendar;
}
}