XML(XmlMapper 사용) 추가
parent
e36b0b3642
commit
e6072fbfc8
@ -0,0 +1,150 @@
|
|||||||
|
package cokr.xit.foundation.data;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectWriter;
|
||||||
|
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
|
||||||
|
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;
|
||||||
|
|
||||||
|
import cokr.xit.foundation.AbstractComponent;
|
||||||
|
|
||||||
|
/**XML 포맷/파싱 유틸리티.
|
||||||
|
* @author mjkhan
|
||||||
|
*/
|
||||||
|
public class XML extends AbstractComponent {
|
||||||
|
private XmlMapper xmlMapper;
|
||||||
|
|
||||||
|
/**XML 포맷/파싱에 사용하는 XmlMapper를 반환한다.
|
||||||
|
* @return XML 포맷/파싱에 사용하는 XmlMapper
|
||||||
|
*/
|
||||||
|
public XmlMapper getXmlMapper() {
|
||||||
|
if (xmlMapper == null) {
|
||||||
|
xmlMapper = new XmlMapper();
|
||||||
|
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
|
||||||
|
}
|
||||||
|
return xmlMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**XML 포맷/파싱에 사용하는 XmlMapper를 설정한다.
|
||||||
|
* @param xmlMapper XML 포맷/파싱에 사용하는 XmlMapper
|
||||||
|
* @return 현재 XML 객체
|
||||||
|
*/
|
||||||
|
public XML setXmlMapper(XmlMapper xmlMapper) {
|
||||||
|
this.xmlMapper = xmlMapper;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**XML 포맷/파싱에 사용하는 XmlMapper의 동작을 설정한다.
|
||||||
|
* @param configurer XmlMapper 동작 설정 function
|
||||||
|
* @return 현재 XML
|
||||||
|
*/
|
||||||
|
public XML configure(Consumer<XmlMapper> configurer) {
|
||||||
|
if (configurer != null)
|
||||||
|
configurer.accept(getXmlMapper());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**XML 문자열을 파싱하여 주어진 클래스의 객체로 변환한다.
|
||||||
|
* @param <T> 클래스 유형
|
||||||
|
* @param xml XML 문자열
|
||||||
|
* @param klass 클래스
|
||||||
|
* @return 문자열을 파싱하여 변환한 객체
|
||||||
|
*/
|
||||||
|
public <T> T parse(String xml, Class<T> klass) {
|
||||||
|
try {
|
||||||
|
return getXmlMapper().readValue(xml, klass);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw runtimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> T parse(String xml, TypeReference<T> typeRef) {
|
||||||
|
try {
|
||||||
|
return getXmlMapper().readValue(xml, typeRef);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw runtimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**input의 내용을 파싱하여 주어진 클래스의 객체로 변환한다.
|
||||||
|
* @param <T> 클래스 유형
|
||||||
|
* @param input XML input
|
||||||
|
* @param klass 클래스
|
||||||
|
* @return input을 파싱하여 변환한 객체
|
||||||
|
*/
|
||||||
|
public <T> T parse(InputStream input, Class<T> klass) {
|
||||||
|
try {
|
||||||
|
return getXmlMapper().readValue(input, klass);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw runtimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> T parse(InputStream input, TypeReference<T> typeRef) {
|
||||||
|
try {
|
||||||
|
return getXmlMapper().readValue(input, typeRef);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw runtimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**주어진 객체를 XML 문자열로 변환한다.
|
||||||
|
* @param obj 객체
|
||||||
|
* @return 객체를 변환한 XML 문자열
|
||||||
|
*/
|
||||||
|
public String stringify(Object obj) {
|
||||||
|
return stringify(obj, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**주어진 객체를 XML 문자열로 변환한다.
|
||||||
|
* @param obj 객체
|
||||||
|
* @param indent 띄어쓰기 여부
|
||||||
|
* <ul><li>띄어쓰기를 적용하려면 true</li>
|
||||||
|
* <li>그렇지 않으면 false</li>
|
||||||
|
* </ul>
|
||||||
|
* @return 객체를 변환한 XML 문자열
|
||||||
|
*/
|
||||||
|
public String stringify(Object obj, boolean indent) {
|
||||||
|
if (obj instanceof String)
|
||||||
|
return (String)obj;
|
||||||
|
|
||||||
|
XmlMapper mapper = getXmlMapper();
|
||||||
|
ObjectWriter writer = !indent ? mapper.writer() : mapper.writerWithDefaultPrettyPrinter();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return writer.writeValueAsString(obj);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw runtimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**주어진 객체를 OutputStream에 저장한다.
|
||||||
|
* @param out OutputStream
|
||||||
|
* @param obj 객체
|
||||||
|
* @param indent 띄어쓰기 여부
|
||||||
|
* <ul><li>띄어쓰기를 적용하려면 true</li>
|
||||||
|
* <li>그렇지 않으면 false</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public void write(OutputStream out, Object obj, boolean indent) {
|
||||||
|
XmlMapper mapper = getXmlMapper();
|
||||||
|
ObjectWriter writer = !indent ? mapper.writer() : mapper.writerWithDefaultPrettyPrinter();
|
||||||
|
|
||||||
|
try {
|
||||||
|
writer.writeValue(out, obj);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw runtimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**주어진 객체를 OutputStream에 저장한다.
|
||||||
|
* @param out OutputStream
|
||||||
|
* @param obj 객체
|
||||||
|
*/
|
||||||
|
public void write(OutputStream out, Object obj) {
|
||||||
|
write(out, obj, false);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue