DTOをXML形式の文字列に変換

JAXB使えよって感じなんでしょうけど、単純にXML形式にしたいだけなのにJAXBだとちょっと面倒。
IntegerとかDoubleもFormat指定できた方がいいんだろうなぁ。
isUserClassもちょっとダサいし。。
まぁ一発目としてはこれでいいかな。


import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

import jp.co.ccs.xml.annotation.Format;

/**
* XMLに変換するクラスです
*
* @author y-motoba
*/
public class XmlConverter {

/**
* objをxml形式に変換します
*
* @param obj
* Object
*
* @return String
*/
public String convert(Object obj) {

if (obj == null) {

return "";
}

StringBuffer xmlString = new StringBuffer();

String rootElementName = getRootElementName(obj);
xmlString.append("<" + rootElementName + ">");
xmlString.append(obj2xml(obj));
xmlString.append("</" + rootElementName + ">");

return xmlString.toString();
}

/**
* @param obj
* @return
*/
private String obj2xml(Object obj) {

StringBuffer xmlString = new StringBuffer();

Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {

xmlString.append(field2Xml(obj, field));
}

return xmlString.toString();
}

/**
* DTOのフィールドをxml形式に変換します
*
* @param field
* Field
*
* @return String
*/
private String field2Xml(Object obj, Field field) {

field.setAccessible(true);
return getFieldElement(obj, getFieldManager(obj, field));
}

/**
* XML形式にしたDTOのフィールドを取得します
*
* @param obj
* Object
* @param fieldManager
* FieldManager
*
* @return String
*/
private String getFieldElement(Object obj, FieldManager fieldManager) {

StringBuffer xml = new StringBuffer();
boolean isWrapper = false;
if (!"".equals(fieldManager.elementWrapperName)) {

isWrapper = true;
}

if (isWrapper)
xml.append("<" + fieldManager.elementWrapperName + ">");

xml.append("<" + fieldManager.elementName + ">"
+ getElementValue(obj, fieldManager) + "" +
"</" + fieldManager.elementName + ">");

if (isWrapper)
xml.append("");

return xml.toString();
}

/**
* DTOのフィールドに関する情報を取得します
*
* @param field
* Field
*
* @return FieldManager
*/
private FieldManager getFieldManager(Object obj, Field field) {

FieldManager fieldManager = new FieldManager();

fieldManager.field = field;
fieldManager.fieldValue = getFieldValue(obj, field);
fieldManager.elementName = getElementName(field);
fieldManager.elementWrapperName = getElementWrapperName(field);
fieldManager.format = getFormat(field);

return fieldManager;
}

/**
* DTOのフィールドに対する値を取得します
*
* @param obj
* Object
* @param fieldManager
* FieldManager
*
* @return String
*/
private String getElementValue(Object obj, FieldManager fieldManager) {

Object value = fieldManager.fieldValue;

if (value == null) {

return "";
}

if (value instanceof List) {

return list2Xml(obj, (List) value);

} else if (value instanceof Date) {

return format((Date) value, fieldManager.format);

} else if (fieldManager.fieldValue instanceof Timestamp) {

return format((Timestamp) value, fieldManager.format);

} else if (isUserClass(value)) {

return obj2xml(value);

} else {

return value.toString();
}
}

/**
* tsをformat形式に変換します
*
* @param ts
* Timestamp
* @param format
* format
*
* @return String
*/
private String format(Timestamp ts, String format) {

return format(new Date(ts.getTime()), format);
}

/**
* dateをformat形式に変換します
*
* @param date
* Date
* @param format
* format
*
* @return String
*/
private String format(Date date, String format) {

SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}

/**
* ユーザ独自のクラスか判定します
*
* @param obj
* Object
*
* @return boolean
*/
private boolean isUserClass(Object obj) {

if (obj instanceof String) {

return false;

} else if (obj instanceof Integer) {

return false;

} else if (obj instanceof Long) {

return false;

} else if (obj instanceof Double) {

return false;

} else if (obj instanceof Float) {

return false;

} else if (obj instanceof List) {

return false;
}

return true;
}

/**
* fieldValueListをxml形式に変換します
*
* @param obj
* Object
* @param objList
* 変換対象リスト
*
* @return String
*/
private String list2Xml(Object obj, List fieldValueList) {

if (fieldValueList == null) {

return "";
}

StringBuffer xmlString = new StringBuffer();
for (Object fieldValue : fieldValueList) {

if (isUserClass(fieldValue)) {

String fieldElementName = getRootElementName(fieldValue);
xmlString.append("<" + fieldElementName + ">");
xmlString.append(obj2xml(fieldValue));
xmlString.append("</" + fieldElementName + ">");
}
}

return xmlString.toString();
}

/**
* objのフィールドfieldの値を取得します
*
* @param obj
* Object
* @param field
* Field
*
* @return Object
*/
private Object getFieldValue(Object obj, Field field) {

try {

return field.get(obj);

} catch (IllegalArgumentException e) {

e.printStackTrace();
throw new RuntimeException();

} catch (IllegalAccessException e) {

e.printStackTrace();
throw new RuntimeException();
}
}

/**
* フィールドのFormatアノテーションの値を取得します
*
* @param obj
* Object
*
* @return RootElementName
*/
private String getFormat(Field field) {

Format format = field.getAnnotation(Format.class);
if (format == null) {

return "yyyy/MM/dd hh:mm:ss";

} else {

return format.value();
}
}

/**
* XMLの要素ラッパー名取得
*
* @param obj
* Object
*
* @return RootElementName
*/
private String getElementWrapperName(Field field) {

XmlElementWrapper xmlElementWrapper = field
.getAnnotation(XmlElementWrapper.class);
if (xmlElementWrapper == null) {

return "";

} else {

return xmlElementWrapper.name();
}
}

/**
* XMLの要素名取得
*
* @param obj
* Object
*
* @return RootElementName
*/
private String getElementName(Field field) {

XmlElement xmlElement = field.getAnnotation(XmlElement.class);
if (xmlElement == null) {

return field.getName();

} else {

return xmlElement.name();
}
}

/**
* XMLのルート要素名取得
*
* @param obj
* Object
*
* @return RootElementName
*/
private String getRootElementName(Object obj) {

XmlRootElement xmlRootElement = obj.getClass().getAnnotation(
XmlRootElement.class);
if (xmlRootElement == null) {

return obj.getClass().getSimpleName();

} else {

return xmlRootElement.name();
}
}
}

class FieldManager {

public Field field;
public Object fieldValue;
public String elementName;
public String elementWrapperName;
public String format;
}

0 コメント: