package egovframework.rte.fdl.xml;
import java.io.CharArrayReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.xml.sax.InputSource;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.xml.transform.stream.StreamResult;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.Set;
import java.util.List;
import org.apache.log4j.Logger;
import org.jdom.*;
import org.jdom.transform.*;
import javax.xml.transform.*;
import org.jdom.xpath.*;
import egovframework.rte.fdl.xml.exception.ValidatorException;
/**
* XML문서 파싱 작업시 공통적으로 사용하는 메소드를 포함하는 추상 클래스.
* 파싱할 XML 문서를 받는 부분과 XML 문서 파싱 후 에러 메시지를 생성하는
* 부분으로 나뉜다. 각 파서는 파싱하는 부분만이 다르기 때문에
* parse() 메소드를 abstract 메소드로 가진다
* @author 개발프레임웍크 실행환경 개발팀 김종호
* @since 2009.03.17
* @version 1.0
* @see <pre>
* == 개정이력(Modification Information) ==
*
* 수정일 수정자 수정내용
* --------- --------- -------------------------------
* 2009.03.17 김종호 최초생성
*
* </pre>
*/
public abstract class AbstractXMLUtility {
private static Logger logger = XmlLog.getLogger(AbstractXMLUtility.class);
/** 파일명 **/
private String fileName = null;
/** 스키마 파일명 **/
private String schmafileName = null;
/** xmlValue **/
private String xmlValue = null;
/** ApplicationContext **/
ApplicationContext context;
/** XmlConfig class **/
XmlConfig xmlConfig;
/** xml 설정관리 Class **/
String savedPath;
/** xml 설정 파일 경로 **/
String configPath="classpath*:spring/egovxmlCfg.xml";
/**
* AbstractXMLUtility 생성자
*/
public AbstractXMLUtility(){
context = new FileSystemXmlApplicationContext(configPath);
xmlConfig = (XmlConfig)context.getBean("xmlconfig");
savedPath = xmlConfig.getXmlpath();
}
/**
* XML 문서가 파일로 존재할 경우 파일 이름을 전달
* @param fileName - xml 경로
*/
public void setXMLFile(String fileName) {
this.fileName = fileName;
}
/**
* XML 문서 경로 리턴
* @return XML문서 경로
*/
public String getXMLFile() {
return fileName;
}
/**
* XML SCHEMA 문서가 파일로 존재할 경우 파일 이름을 전달
* @param schmafileName - 스키마파일 경로
*/
public void setSCHEMAFile(String schmafileName) {
this.schmafileName = schmafileName;
}
/**
* XML SCHEMA 문서경로 리턴
* @return XML SCHEMA 문서
*/
public String getSCHEMAFile() {
return schmafileName;
}
/**
* XML 문서가 String으로 존재할 경우 String 객체를 전달
* @param xmlValue - XML문서 String형
*/
public void setXML(String xmlValue) {
this.xmlValue = xmlValue;
}
/**
* XML문서 String 리턴
* @return XML문서 String
*/
public String getXML() {
return xmlValue;
}
/**
* 전달된 String을 파싱이 가능한 InputSource로 변환
* @return XML 문서 InputStream
*/
protected InputSource stringToInputSource() {
char[] xml = getXML().toCharArray();
CharArrayReader reader = new CharArrayReader(xml);
return new InputSource(reader);
}
/**
* DOM, SAX 등의 XML 파서에 따라 파싱 작업을 실행할
* 메소드를 정의하는 추상 메소드
* @param isValid - Validation 검사 여부
* @throws ValidatorException
*/
public abstract boolean parse(boolean isValid) throws ValidatorException;
//public abstract NodeList getResults(String xmlFile,String expression) throws UnSupportedException;
/**
* XML 문서 파싱 완료 후 에러가 발생하여 에러 메시지가 존재할 경우
* 에러 메시지를 생성
* @param errorReport - 에러내용 리스트 객체
* @throws ValidatorException
*/
protected void makeErrorMessage(Set errorReport) throws ValidatorException {
StringBuffer errorMessage = new StringBuffer();
Iterator iterator = errorReport.iterator();
while (iterator.hasNext()) {
String tmp_str = (String) iterator.next();
errorMessage.append(tmp_str);
errorMessage.append("<br/>");
iterator.remove();
}
throw new ValidatorException(
errorMessage.toString());
}
public List getResult(Document doc,String exps)
throws JDOMException {
XPath xPath = XPath.newInstance(exps);
return xPath.selectNodes(doc);
}
/**
* 신규 Element 추가
* @param doc - Document 객체
* @param addNDName - 추가할 대상 Element명
* @param list - 추가할 Element 리스트
* @param path - 신규 생설할 XML문서 경로
* @throws TransformerException
* @throws TransformerConfigurationException
* @throws FileNotFoundException
*/
public void addElement(Document doc,String addNDName,List list,String path)
throws TransformerException,TransformerConfigurationException,FileNotFoundException,IOException
{
StreamResult sTResult = null;
FileOutputStream fos = null;
Element root=doc.getRootElement();
addNode(root,addNDName,list);
TransformerFactory transformerFactory= TransformerFactory.newInstance();
Transformer serializer = transformerFactory.newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING,"euc-kr");
serializer.setOutputProperty(OutputKeys.INDENT,"yes");
if(path != null)
{
fos = new FileOutputStream(path);
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
else
{
fos = new FileOutputStream(savedPath+"addElement.xml");
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
}
/**
* 신규 TextElement 추가
* @param doc - Document 객체
* @param addNDName - 추가할 대상 Elememt명
* @param list - 추가할 TextElement 리스트
* @param path
* @throws TransformerException
* @throws TransformerConfigurationException
* @throws FileNotFoundException
*/
public void addTextElement(Document doc,String addNDName,List list,String path)
throws TransformerException,TransformerConfigurationException,FileNotFoundException,IOException
{
StreamResult sTResult = null;
FileOutputStream fos = null;
Element root=doc.getRootElement();
addTextNode(root,addNDName,list);
TransformerFactory transformerFactory= TransformerFactory.newInstance();
Transformer serializer = transformerFactory.newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING,"euc-kr");
serializer.setOutputProperty(OutputKeys.INDENT,"yes");
if(path != null)
{
fos = new FileOutputStream(path);
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
else
{
fos = new FileOutputStream(savedPath+"addElement.xml");
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
}
/**
* TextNode 추가
* @param element - 조회대상 Element
* @param addNDName - 추가할대상 Element명
* @param list - 추가할 TextElement 리스트
*/
public void addTextNode(Element element,String addNDName,List list)
{
List childList = element.getChildren();
if(childList.size() != 0)
{
for(int yy=0; yy < childList.size(); yy++)
{
Element tmp = (Element)childList.get(yy);
if(tmp.getName().equals(addNDName))
{
for(int tt=0 ; tt < list.size(); tt++)
{
SharedObject sobj = (SharedObject)list.get(tt);
tmp.addContent((String)sobj.getValue());
}
}
addTextNode(tmp, addNDName, list);
}
}else
{
if(element.getName().equals(addNDName))
{
for(int tt=0 ; tt < list.size(); tt++)
{
SharedObject sobj = (SharedObject)list.get(tt);
element.addContent((String)sobj.getValue());
}
}
}
}
/**
* TextElement Update
* @param doc - Document 객체
* @param list - update TextNode 리스트
* @param path - 신규생성 XML문서 경로
* @throws TransformerException
* @throws TransformerConfigurationException
* @throws FileNotFoundException
*/
public void updTextElement(Document doc,List list,String path)
throws TransformerException,TransformerConfigurationException,FileNotFoundException,IOException
{
StreamResult sTResult = null;
FileOutputStream fos = null;
Element root=doc.getRootElement();
updTextNode(root,list);
TransformerFactory transformerFactory= TransformerFactory.newInstance();
Transformer serializer = transformerFactory.newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING,"euc-kr");
serializer.setOutputProperty(OutputKeys.INDENT,"yes");
if(path != null)
{
fos = new FileOutputStream(path);
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
else
{
fos = new FileOutputStream(savedPath+"updTEXT.xml");
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
}
/**
* TextNode Update
* @param element - 조회대상 Element
* @param list - update TextNode 리스트
*/
public void updTextNode(Element element,List list)
{
List childList = element.getChildren();
if(childList.size() != 0)
{
for(int yy=0; yy < childList.size(); yy++)
{
Element tmp = (Element)childList.get(yy);
for(int tt=0 ; tt < list.size(); tt++)
{
SharedObject sobj = (SharedObject)list.get(tt);
if(tmp.getValue().equals((String)sobj.getKey()))
{
tmp.setText((String)sobj.getValue());
break;
}
}
updTextNode(tmp, list);
}
}else
{
for(int tt=0 ; tt < list.size(); tt++)
{
SharedObject sobj = (SharedObject)list.get(tt);
if(element.getValue().equals((String)sobj.getKey()))
{
element.setText((String)sobj.getValue());
break;
}
}
}
}
/**
* 신규 Node 추가
* @param element - 조회대상 Element
* @param addNDName - 노드이름
* @param list - add TextNode 리스트
*/
public void addNode(Element element,String addNDName,List list)
{
List childList = element.getChildren();
if(childList.size() != 0)
{
for(int yy=0; yy < childList.size(); yy++)
{
Element tmp = (Element)childList.get(yy);
if(tmp.getName().equals(addNDName))
{
for(int tt=0 ; tt < list.size(); tt++)
{
SharedObject sobj = (SharedObject)list.get(tt);
Element enew= new Element((String)sobj.getKey());
enew.setText((String)sobj.getValue());
tmp.addContent(enew);
}
}
addNode(tmp, addNDName, list);
}
}else
{
if(element.getName().equals(addNDName))
{
for(int tt=0 ; tt < list.size(); tt++)
{
SharedObject sobj = (SharedObject)list.get(tt);
Element enew= new Element((String)sobj.getKey());
enew.setText((String)sobj.getValue());
element.addContent(enew);
}
}
}
}
/**
* 노드삭제
* @param element - 조회대상 Element
* @param name - 노드명
*/
public void removeNode(Element element, String name)
{
List list = element.getChildren();
if (list.size() !=0)
{
for (int i=0; i<list.size(); i++) {
Element tmp_elm = (Element)list.get(i);
if(tmp_elm.getName().equals(name))
tmp_elm.getParentElement().removeChild(name);
else
removeNode(tmp_elm, name);
}
} else {
// Visit the children
// logger.debug("element Name1:"+element.getName());
if(element.getName().equals(name))
element.getParentElement().removeChild(name);
}
}
/**
* Element 삭제
* @param doc - document 객체
* @param nodeName - 노드명
* @param path - 신규생성 XML문서 경로
* @throws TransformerException
* @throws TransformerConfigurationException
* @throws FileNotFoundException
*/
public void delElement(Document doc,String nodeName,String path)
throws TransformerException,TransformerConfigurationException,FileNotFoundException,IOException
{
StreamResult sTResult = null;
FileOutputStream fos = null;
Element element = doc.getRootElement();
removeNode(element,nodeName);
TransformerFactory transformerFactory= TransformerFactory.newInstance();
Transformer serializer = transformerFactory.newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING,"euc-kr");
serializer.setOutputProperty(OutputKeys.INDENT,"yes");
if(path != null)
{
fos = new FileOutputStream(path);
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
else
{
fos = new FileOutputStream(savedPath+"delXML.xml");
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
}
/**
* 노드변경
* @param element - 조회대상 Element
* @param oldNode - 변경할 노드명
* @param newNodename - 신규 노드명
*/
public void chgNode(Element element, String oldNode, String newNodename)
{
List list = element.getChildren();
if (list.size() !=0)
{
for (int i=0; i<list.size(); i++) {
Element tmp_elm = (Element)list.get(i);
if(element.getName().equals(oldNode))
element.setName(newNodename);
else
chgNode(tmp_elm, oldNode,newNodename);
}
} else {
// Visit the children
// logger.debug("element Name1:"+element.getName());
if(element.getName().equals(oldNode))
element.setName(newNodename);
}
}
/**
* Element Update
* @param doc - document 객체
* @param oldNodename - 변경할 노드명
* @param newNodeName - 신규 노드명
* @param path - 신규생성 XML문서 경로
* @throws TransformerException
* @throws TransformerConfigurationException
* @throws FileNotFoundException
*/
public void updElement(Document doc,String oldNodename,String newNodeName,String path)
throws TransformerException,TransformerConfigurationException,FileNotFoundException,IOException
{
StreamResult sTResult = null;
FileOutputStream fos = null;
Element root=doc.getRootElement();
chgNode(root,oldNodename ,newNodeName);
TransformerFactory transformerFactory= TransformerFactory.newInstance();
Transformer serializer = transformerFactory.newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING,"euc-kr");
serializer.setOutputProperty(OutputKeys.INDENT,"yes");
if(path != null)
{
fos = new FileOutputStream(path);
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
else
{
fos = new FileOutputStream(savedPath+"updElement.xml");
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
}
/**
* XML문서 생성
* @param doc - document 객체
* @param newNodeName - Root 노드명
* @param list - Element 리스트
* @param path - 신규생성 XML문서 경로
* @throws TransformerException
* @throws TransformerConfigurationException
* @throws FileNotFoundException
*/
public void createNewXML(Document doc,String newNodeName,List list,String path)
throws TransformerException,TransformerConfigurationException,FileNotFoundException,IOException
{
StreamResult sTResult = null;
FileOutputStream fos = null;
Element root = new Element(newNodeName);
doc.addContent(root);
createXML(root,list);
TransformerFactory transformerFactory= TransformerFactory.newInstance();
Transformer serializer = transformerFactory.newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING,"euc-kr");
serializer.setOutputProperty(OutputKeys.INDENT,"yes");
if(path != null)
{
fos = new FileOutputStream(path);
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
else
{
fos = new FileOutputStream(savedPath+"newXML.xml");
sTResult = new StreamResult(fos);
serializer.transform(new JDOMSource(doc),sTResult);
fos.close();
}
}
/**
* XML 생성
* @param root - Root Element
* @param list - Element 리스트
*/
public void createXML(Element root,List list)
{
for(int i=0; i<list.size() ; i++){
SharedObject sobj = (SharedObject)list.get(i);
Element elm = new Element(sobj.getKey());
elm.setText((String)sobj.getValue());
root.addContent(elm);
}
}
}