package com.koushikdutta.async.http.body; import com.koushikdutta.async.DataEmitter; import com.koushikdutta.async.DataSink; import com.koushikdutta.async.Util; import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.future.FutureCallback; import com.koushikdutta.async.http.AsyncHttpRequest; import com.koushikdutta.async.parser.DocumentParser; import org.w3c.dom.Document; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; /** * Created by koush on 8/30/13. */ public class DocumentBody implements AsyncHttpRequestBody<Document> { public DocumentBody() { this(null); } public DocumentBody(Document document) { this.document = document; } ByteArrayOutputStream bout; private void prepare() { if (bout != null) return; try { DOMSource source = new DOMSource(document); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); bout = new ByteArrayOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(bout); StreamResult result = new StreamResult(writer); transformer.transform(source, result); writer.flush(); } catch (Exception e) { } } @Override public void write(AsyncHttpRequest request, DataSink sink, CompletedCallback completed) { prepare(); byte[] bytes = bout.toByteArray(); Util.writeAll(sink, bytes, completed); } @Override public void parse(DataEmitter emitter, final CompletedCallback completed) { new DocumentParser().parse(emitter).setCallback(new FutureCallback<Document>() { @Override public void onCompleted(Exception e, Document result) { document = result; completed.onCompleted(e); } }); } public static final String CONTENT_TYPE = "application/xml"; @Override public String getContentType() { return CONTENT_TYPE; } @Override public boolean readFullyOnRequest() { return true; } @Override public int length() { prepare(); return bout.size(); } Document document; @Override public Document get() { return document; } }