package com.aionemu.packetsamurai.logrepo.communication; import java.io.ByteArrayOutputStream; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javolution.util.FastList; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSOutput; import org.w3c.dom.ls.LSSerializer; /** * * @author Gilles Duboscq * */ public class CompoundXmlRequest { private List<Request> _requests; private int _currentId; public CompoundXmlRequest() { _requests = new FastList<Request>(); } public Request createRequest(String type) { Request req = new Request(_currentId++, type); _requests.add(req); return req; } public String toXml() { Document document; DocumentBuilder docBuilder; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { docBuilder = factory.newDocumentBuilder(); document = docBuilder.newDocument(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } DOMImplementationLS implLS = (DOMImplementationLS) docBuilder.getDOMImplementation(); LSSerializer domWriter = implLS.createLSSerializer(); LSOutput output = implLS.createLSOutput(); //DOMException: FEATURE_NOT_SUPPORTED: The parameter format-pretty-print is recognized but the requested value cannot be set. //domWriter.getDomConfig().setParameter(Constants.DOM_FORMAT_PRETTY_PRINT, Boolean.TRUE); output.setEncoding("UTF-8"); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); output.setByteStream(outStream); Element root = document.createElement("requests"); for(Request req : _requests) { Element reqNode = document.createElement("request"); reqNode.setAttribute("id", Integer.toString(req.getId())); reqNode.setAttribute("type", req.getType()); for(RequestPart part : req.getParts()) { Element partNode = null; if(part instanceof RequestForPart) { partNode = document.createElement("for"); writeForPart(partNode, (RequestForPart) part, document); } else { partNode = document.createElement("part"); partNode.setAttribute("name", part.getName()); partNode.setAttribute("value", part.getValue()); } reqNode.appendChild(partNode); } root.appendChild(reqNode); } document.appendChild(root); domWriter.write(document, output); return outStream.toString(); } public void writeForPart(Element forNode, RequestForPart forPart, Document doc) { for(RequestPart part : forPart.getSubParts()) { Element partNode = null; if(part instanceof RequestForPart) { partNode = doc.createElement("for"); partNode.setAttribute("name", part.getName()); writeForPart(partNode, (RequestForPart) part, doc); } else { partNode = doc.createElement("part"); partNode.setAttribute("name", part.getName()); partNode.setAttribute("value", part.getValue()); } forNode.appendChild(partNode); } } }