package edu.asu.spring.quadriga.service.network.impl;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import edu.asu.spring.quadriga.domain.factory.networks.INetworkXMLFactory;
import edu.asu.spring.quadriga.domain.network.INetworkXML;
import edu.asu.spring.quadriga.domain.workspace.ITextFile;
import edu.asu.spring.quadriga.exceptions.NetworkXMLParseException;
import edu.asu.spring.quadriga.exceptions.TextFileParseException;
import edu.asu.spring.quadriga.service.network.INetworkXMLParser;
import edu.asu.spring.quadriga.utilities.ITextXMLParser;
/**
*
* @author skollur1
*
*/
@Service
public class NetworkXMLParser implements INetworkXMLParser {
@Autowired
private INetworkXMLFactory nwXMLFactory;
@Autowired
private ITextXMLParser textXMLParser;
@Override
@Transactional
public INetworkXML parseXML(String xml, String projectid, String workspaceid)
throws NetworkXMLParseException, TextFileParseException {
INetworkXML networkXML = nwXMLFactory.createNetworkXMLObject();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
Document document = null;
try {
builder = factory.newDocumentBuilder();
document = builder.parse(new InputSource(new StringReader(xml)));
} catch (ParserConfigurationException | SAXException | IOException e) {
throw new NetworkXMLParseException(e);
}
NodeList textNodeList = document.getElementsByTagName("text");
if (textNodeList.getLength() == 0) {
networkXML.setNetworkXMLString(xml);
return networkXML;
}
ITextFile txtfile = textXMLParser.parseTextXML(xml, workspaceid, projectid);
NodeList handle = document.getElementsByTagName("handle");
NodeList fileName = document.getElementsByTagName("file_name");
networkXML.setTextFile(txtfile);
Element e = document.getDocumentElement();
e.removeChild(textNodeList.item(0));
e.removeChild(handle.item(0));
e.removeChild(fileName.item(0));
networkXML.setNetworkXMLString(documentToString(document));
return networkXML;
}
private String documentToString(Document doc) throws NetworkXMLParseException {
DOMSource domSource = new DOMSource(doc);
Transformer transformer;
StringWriter sw = new StringWriter();
try {
transformer = TransformerFactory.newInstance().newTransformer();
StreamResult sr = new StreamResult(sw);
transformer.transform(domSource, sr);
} catch (TransformerFactoryConfigurationError | TransformerException e) {
throw new NetworkXMLParseException("Error Converting document to XML");
}
return sw.toString();
}
}