package com.google.code.joto.value2java.converters;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;
import com.google.code.joto.ast.beanstmt.BeanAST.BeanExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.LiteralExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.MethodApplyExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.SimpleNameExpr;
import com.google.code.joto.ast.valueholder.ValueHolderAST.AbstractObjectValueHolder;
import com.google.code.joto.ast.valueholder.ValueHolderAST.FieldValueHolder;
import com.google.code.joto.ast.valueholder.ValueHolderAST.ObjectValueHolder;
import com.google.code.joto.ast.valueholder.ValueHolderAST.PrimitiveFieldValueHolder;
import com.google.code.joto.reflect.ReflectUtils;
import com.google.code.joto.value2java.ObjectVHToStmtConverter;
import com.google.code.joto.value2java.VHToStmt;
import com.google.code.joto.value2java.VHToStmtConverterLookup;
import com.google.code.joto.value2java.impl.ObjectStmtInfo;
import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
public class JavaUtilConverters {
private static final DateConverter DateConverterInstance = new DateConverter();
public static void registerDefaultConverters(VHToStmtConverterLookup p) {
p.registerConverter(DateConverterInstance, 0);
}
// -------------------------------------------------------------------------
public static class DateConverter implements ObjectVHToStmtConverter {
protected DateConverter() {
}
@Override
public boolean canConvert(Class<?> type) {
return java.util.Date.class.isAssignableFrom(type)
|| java.sql.Date.class.isAssignableFrom(type);
}
@Override
public void convert(VHToStmt owner, AbstractObjectValueHolder obj,
ObjectStmtInfo objInfo) {
if (obj instanceof ObjectValueHolder) {
ObjectValueHolder vh = (ObjectValueHolder) obj;
Class<?> objClass = obj.getObjClass();
Map<Field, FieldValueHolder> fieldsValuesMap = vh.getFieldsValuesMap();
final ReflectionProvider reflectionProvider = ReflectUtils.getReflectionProvider();
Field timeField = reflectionProvider.getField(java.util.Date.class, "fastTime");
PrimitiveFieldValueHolder timeFVH = (PrimitiveFieldValueHolder) fieldsValuesMap.get(timeField);
long timeValue = (Long) timeFVH.getValue();
BeanExpr expr = doConvertValue(owner, obj, objInfo, timeValue);
objInfo.setTypeAndInitExpr(objClass, expr);
}
}
protected BeanExpr doConvertValue(VHToStmt owner,
AbstractObjectValueHolder obj, ObjectStmtInfo objInfo,
long timeValue) {
List<BeanExpr> args = new ArrayList<BeanExpr>();
Class<?> objClass = obj.getObjClass();
String dateUtilClassName = "DateUtil";
if (java.sql.Date.class.isAssignableFrom(objClass)) {
dateUtilClassName = "SqlDateUtil";
}
Calendar cal = GregorianCalendar.getInstance();
cal.setTime(new Date(timeValue));
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
args.add(new LiteralExpr(year));
args.add(new LiteralExpr(month));
args.add(new LiteralExpr(day));
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minutes = cal.get(Calendar.MINUTE);
int seconds = cal.get(Calendar.SECOND);
if (hour == 0 && minutes == 0 && seconds == 0) {
// midnight date day
} else {
args.add(new LiteralExpr(hour));
args.add(new LiteralExpr(minutes));
args.add(new LiteralExpr(seconds));
}
return new MethodApplyExpr(new SimpleNameExpr(dateUtilClassName), "toDate", args);
}
@Override
public String toString() {
return "DateConverter";
}
}
}