package cn.mutils.core.io.serial.primitive; import org.w3c.dom.Document; import org.w3c.dom.Node; import cn.mutils.core.annotation.Primitive; import cn.mutils.core.annotation.PrimitiveType; import cn.mutils.core.beans.BeanField; import cn.mutils.core.io.serial.Serial; import cn.mutils.core.json.IJsonItem; import cn.mutils.core.properties.IPropertyItem; import cn.mutils.core.reflect.ReflectUtil; import cn.mutils.core.xml.IXmlItem; import cn.mutils.core.xml.XmlUtil; /** * Support three data types:{"state":"INIT"} {"state":"0"} {"state":0} */ @SuppressWarnings({"serial", "unchecked", "unused"}) public abstract class EnumItem<E extends Enum<E>> extends Serial<Enum<E>> { public EnumItem() { mType = PrimitiveType.INT; mValue = valueOf(0); } public EnumItem(int value) { mType = PrimitiveType.INT; mValue = valueOf(value); } public EnumItem(String name) { mType = PrimitiveType.INT; mValue = (E) ReflectUtil.valueOfEnum(valueOf(0).getClass(), name); } public EnumItem(E value) { mType = PrimitiveType.INT; mValue = value; } /** * Override this method if you want to get integer * value:@Primitive(PrimitiveType.INT) @Primitive(PrimitiveType.STRING_INT) */ public abstract int intValue(); /** * Override this method if you want to get integer * value:@Primitive(PrimitiveType.INT) @Primitive(PrimitiveType.STRING_INT) */ public abstract E valueOf(int value); public E toEnum() { return (E) mValue; } protected void init(BeanField itemField) { if (itemField != null) { Primitive t = itemField.getAnnotation(Primitive.class); if (t != null) { mType = t.value(); } } } @Override public IJsonItem fromJson(Object json, BeanField itemField) { init(itemField); try { if (mType == PrimitiveType.STRING) { mValue = (E) ReflectUtil.valueOfEnum(valueOf(0).getClass(), json.toString()); } else { mValue = valueOf(Integer.parseInt(json.toString())); } } catch (Exception e) { return null; } return this; } @Override public Object toJson(BeanField itemField) { init(itemField); if (mType == PrimitiveType.STRING) { return mValue == null ? null : mValue.toString(); } else { int intValue = this.intValue(); return mType == PrimitiveType.INT ? intValue : (intValue + ""); } } @Override public IXmlItem fromXml(Node xml, BeanField itemField) { init(itemField); try { if (mType == PrimitiveType.STRING) { mValue = (E) ReflectUtil.valueOfEnum(valueOf(0).getClass(), xml.getTextContent()); } else { mValue = valueOf(Integer.parseInt(xml.getTextContent())); } } catch (Exception e) { return null; } return this; } @Override public Node toXml(Document doc, BeanField itemField) { init(itemField); if (mType == PrimitiveType.STRING) { if (mValue == null) { return doc.createElement(XmlUtil.TAG_NULL); } else { Node node = XmlUtil.newNode(doc, itemField); node.setTextContent(mValue.toString()); return node; } } else { Node node = XmlUtil.newNode(doc, itemField); node.setTextContent(this.intValue() + ""); return node; } } @Override public IPropertyItem fromProperty(String value, BeanField itemField) { init(itemField); try { if (mType == PrimitiveType.STRING) { mValue = (E) ReflectUtil.valueOfEnum(valueOf(0).getClass(), value); } else { mValue = valueOf(Integer.parseInt(value)); } } catch (Exception e) { return null; } return this; } @Override public String toProperty(BeanField itemField) { if (mType == PrimitiveType.STRING) { return mValue == null ? null : mValue.toString(); } else { return this.intValue() + ""; } } }