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 コメント:
コメントを投稿