package cn.mutils.core.time;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import cn.mutils.core.annotation.Format;
import cn.mutils.core.annotation.Primitive;
import cn.mutils.core.annotation.PrimitiveType;
import cn.mutils.core.beans.BeanField;
import cn.mutils.core.json.IJsonItem;
import cn.mutils.core.properties.IPropertyItem;
import cn.mutils.core.xml.IXmlItem;
import cn.mutils.core.xml.XmlUtil;
/**
* Support two data types:{"date":"2015-05-21 13:39:40"} {"date":1432186780000}
*/
@SuppressWarnings({"serial", "unused"})
public class DateTime extends Date implements IJsonItem, IXmlItem, IPropertyItem {
/**
* Used to give format of toString() output
*/
protected String mFormat = "yyyy-MM-dd HH:mm:ss";
protected PrimitiveType mSerialType = PrimitiveType.STRING;
/**
* Used to give format of serialization and deserialization
*/
protected String mSerialFormat = "yyyy-MM-dd HH:mm:ss";
public DateTime() {
super();
}
public DateTime(long milliseconds) {
super(milliseconds);
}
public DateTime(String format) {
this.setFormat(format);
}
public DateTime(String format, String text) {
try {
this.setTime(new SimpleDateFormat(format, Locale.getDefault()).parse(text).getTime());
this.setFormat(format);
} catch (Exception e) {
// ParseException
}
}
public String getFormat() {
return mFormat;
}
public void setFormat(String format) {
mFormat = format;
}
@Override
public String toString() {
if (mFormat == null) {
return super.toString();
} else {
return DateTimeFormat.format(this, mFormat);
}
}
public PrimitiveType getSerialType() {
return mSerialType;
}
public void setSerialType(PrimitiveType type) {
mSerialType = type;
}
public String getSerialFormat() {
return mSerialFormat;
}
public void setSerialFormat(String format) {
mSerialFormat = format;
}
protected void init(BeanField itemField) {
if (itemField != null) {
Primitive t = itemField.getAnnotation(Primitive.class);
if (t != null) {
mSerialType = t.value();
}
Format f = itemField.getAnnotation(Format.class);
if (f != null && !f.value().isEmpty()) {
mSerialFormat = f.value();
}
}
}
@Override
public IJsonItem fromJson(Object json, BeanField itemField) {
init(itemField);
try {
if (mSerialType == PrimitiveType.STRING) {
this.setTime(DateTimeFormat.parse(json.toString(), mSerialFormat).getTime());
} else {
this.setTime(Long.parseLong(json.toString()));
}
} catch (Exception e) {
return null;
}
return this;
}
@Override
public Object toJson(BeanField itemField) {
init(itemField);
if (mSerialType == PrimitiveType.STRING) {
return DateTimeFormat.format(this, mSerialFormat);
} else {
return this.getTime();
}
}
@Override
public IXmlItem fromXml(Node xml, BeanField itemField) {
init(itemField);
try {
if (mSerialType == PrimitiveType.STRING) {
this.setTime(DateTimeFormat.parse(xml.getTextContent(), mSerialFormat).getTime());
} else {
this.setTime(Long.parseLong(xml.getTextContent()));
}
} catch (Exception e) {
return null;
}
return this;
}
@Override
public Node toXml(Document doc, BeanField itemField) {
init(itemField);
Node node = XmlUtil.newNode(doc, itemField);
if (mSerialType == PrimitiveType.STRING) {
node.setTextContent(DateTimeFormat.format(this, mSerialFormat));
} else {
node.setTextContent(this.getTime() + "");
}
return node;
}
@Override
public IPropertyItem fromProperty(String value, BeanField itemField) {
init(itemField);
try {
if (mSerialType == PrimitiveType.STRING) {
this.setTime(DateTimeFormat.parse(value, mSerialFormat).getTime());
} else {
this.setTime(Long.parseLong(value));
}
} catch (Exception e) {
return null;
}
return this;
}
@Override
public String toProperty(BeanField itemField) {
init(itemField);
if (mSerialType == PrimitiveType.STRING) {
return DateTimeFormat.format(this, mSerialFormat);
} else {
return this.getTime() + "";
}
}
}