package org.quickbundle.tools.helper.xml;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.quickbundle.itf.ITransctVoField;
import org.quickbundle.tools.helper.RmDateHelper;
import org.quickbundle.tools.helper.RmPopulateHelper;
import org.quickbundle.tools.helper.RmVoHelper;
import org.quickbundle.util.RmSequenceMap;
import org.springframework.beans.BeanWrapper;
public class RmXmlConverter {
/**
* 功能:
*
* @param obj
* @param element 可能是Document或Element
* @return
*/
/**
* 把obj的内容转化为xml格式
*
* @param obj
* @return xml格式
*/
public static Document getDocByObj(Object obj) {
Document docObj = org.dom4j.DocumentHelper.createDocument();
object2Xml(obj, docObj);
return docObj;
}
/**
* 功能: 注意Map的key值必须是String
*
* @param obj
* @param element
*/
public static void object2Xml(Object obj, Object element) {
Element rootElement = null;
if(element == null) {
Document doc = org.dom4j.DocumentHelper.createDocument();
rootElement = doc.addElement("rmdatas");
} else if(element instanceof Document) {
rootElement = ((Document)element).addElement("rmdatas");
} else if(element instanceof Element) {
rootElement = (Element) element;
}
if (obj == null) {
//如果对象为空,什么也不作
} else if (obj instanceof String) { //字符串类型
rootElement.setText(obj.toString());
} else if (obj instanceof Integer || obj instanceof BigDecimal || obj instanceof Timestamp) { //其它等同于字符串的类型
rootElement.setText(obj.toString());
rootElement.addAttribute("type", obj.getClass().getName());
} else if (obj instanceof List) {
List lResult = (List) obj;
rootElement.addAttribute("type", obj.getClass().getName());
for (Iterator itLResult = lResult.iterator(); itLResult.hasNext();) {
Object vo = itLResult.next();
Element childEle = rootElement.addElement("rmdata");
object2Xml(vo, childEle);
}
} else if (obj instanceof Map) {
Map mObj = (Map) obj;
rootElement.addAttribute("type", obj.getClass().getName());
for (Iterator itMObj = mObj.keySet().iterator(); itMObj.hasNext();) {
String key = (String) itMObj.next();
Object value = mObj.get(key);
Element childEle = rootElement.addElement(key);
object2Xml(value, childEle);
}
} else if (obj instanceof Serializable) {
final Element thisElement = rootElement;
thisElement.addAttribute("type", obj.getClass().getName());
RmVoHelper.accessVo(obj, new ITransctVoField() {
public int transctVo(BeanWrapper bw, PropertyDescriptor pd) {
if (!pd.getName().equals("class")) {
Element columnElement = thisElement.addElement(pd.getName());
object2Xml(bw.getPropertyValue(pd.getName()), columnElement);
return 1;
} else {
return 0;
}
}
});
}
}
@SuppressWarnings("unchecked")
public static Object xml2Object(Element ele) {
if(ele == null ) {
return null;
}
Object obj = null;
String javaType = ele.valueOf("./@type");
if(javaType.length() == 0) {
javaType = "java.lang.String";
}
try {
try {
obj = Class.forName(javaType).newInstance();
} catch (Exception e) {
}
if (obj instanceof String) { //基本类型
obj = ele.getText();
} else if(javaType.endsWith(Integer.class.getName())) {
obj = Integer.valueOf(ele.getText());
} else if(javaType.endsWith(Timestamp.class.getName())) {
obj = RmDateHelper.getTimestamp(ele.getText());
} else if(javaType.endsWith(BigDecimal.class.getName())) {
obj = new BigDecimal(ele.getText());
} else if(obj instanceof List) {
List lObj = (List) obj;
for (Iterator itDatas = ele.selectNodes("rmdata").iterator(); itDatas.hasNext();) {
Object littleObj = xml2Object((Element) itDatas.next());
lObj.add(littleObj);
}
} else if(obj instanceof Map) {
Map mObj = (Map) obj;
for (Iterator itDatas = ele.selectNodes("node()").iterator(); itDatas.hasNext();) {
Node tmpObj = (Node)itDatas.next();
if (tmpObj instanceof Element) {
Element thisEle = (Element) tmpObj;
mObj.put(thisEle.getName(), xml2Object(thisEle));
}
}
} else if(obj instanceof Serializable) {
Map mField = new RmSequenceMap();
for (Iterator itField = ele.selectNodes("node()").iterator(); itField.hasNext();) {
Node xmlField = (Node) itField.next();
if(xmlField.selectNodes("node()[@type]").size() > 0 || xmlField.valueOf("@type").trim().length() > 0) {
RmVoHelper.setVoFieldValue(obj, xmlField.getName(), xml2Object((Element)xmlField));
} else {
String fieldKey = xmlField.valueOf("name()");
String fieldValue = xmlField.getText();
mField.put(fieldKey, fieldValue);
}
}
RmPopulateHelper.populate(obj, mField);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("javaType=" + javaType);
}
return obj;
}
}