1515import javax .xml .transform .TransformerFactory ;
1616import javax .xml .transform .dom .DOMSource ;
1717import javax .xml .transform .stream .StreamResult ;
18+ import java .io .ByteArrayOutputStream ;
19+ import java .io .OutputStream ;
20+ import java .io .OutputStreamWriter ;
1821import java .io .StringReader ;
1922import java .io .StringWriter ;
2023import java .util .ArrayList ;
@@ -28,6 +31,7 @@ public class JaxpServiceResponseUnmarshaller implements ServiceResponseUnmarshal
2831
2932 protected final Logger logger = LoggerFactory .getLogger (getClass ());
3033 private DocumentBuilder documentBuilder ;
34+ private TransformerFactory transformerFactory ;
3135 private static int ELEMENT_TYPE = 1 ;
3236
3337 @ Override
@@ -91,14 +95,23 @@ public TestSuiteResult parseTestSuiteResult(String xml) {
9195
9296 @ Override
9397 public JUnitTestSuite parseJUnitTestSuiteResult (String xml ) {
94- Element root = parse (xml ).getDocumentElement ();
98+ Document doc = parse (xml );
99+ Element root = doc .getDocumentElement ();
95100 int errors = Integer .parseInt (root .getAttribute ("errors" ));
96101 int failures = Integer .parseInt (root .getAttribute ("failures" ));
97102 String hostname = root .getAttribute ("hostname" );
98103 String name = root .getAttribute ("name" );
99104 int tests = Integer .parseInt (root .getAttribute ("tests" ));
100105 double time = Double .parseDouble (root .getAttribute ("time" ));
101- JUnitTestSuite suite = new JUnitTestSuite (xml , errors , failures , hostname , name , tests , time );
106+
107+ String prettyXml = xml ;
108+ try {
109+ prettyXml = prettyPrintXml (doc );
110+ } catch (Exception ex ) {
111+ logger .warn ("Unable to pretty-print XML; cause: " + ex .getMessage ());
112+ }
113+
114+ JUnitTestSuite suite = new JUnitTestSuite (prettyXml , errors , failures , hostname , name , tests , time );
102115
103116 NodeList testCases = root .getChildNodes ();
104117 for (int i = 0 ; i < testCases .getLength (); i ++) {
@@ -124,8 +137,10 @@ public JUnitTestSuite parseJUnitTestSuiteResult(String xml) {
124137
125138 protected String toXml (Node node ) {
126139 try {
127- TransformerFactory transFactory = TransformerFactory .newInstance ();
128- Transformer transformer = transFactory .newTransformer ();
140+ if (transformerFactory == null ) {
141+ transformerFactory = TransformerFactory .newInstance ();
142+ }
143+ Transformer transformer = transformerFactory .newTransformer ();
129144 StringWriter buffer = new StringWriter ();
130145 transformer .setOutputProperty (OutputKeys .OMIT_XML_DECLARATION , "yes" );
131146 transformer .transform (new DOMSource (node ), new StreamResult (buffer ));
@@ -156,4 +171,25 @@ protected Document parse(String xml) {
156171 }
157172 }
158173
174+ /**
175+ * Added this in 1.4.0 to handle pretty-printing the entire XML document, while {@code toXml} is only for the
176+ * embedded failure XML. Did not want to try reusing that for the whole XML document.
177+ *
178+ * @param doc
179+ * @return
180+ * @throws Exception
181+ */
182+ private String prettyPrintXml (Document doc ) throws Exception {
183+ if (transformerFactory == null ) {
184+ transformerFactory = TransformerFactory .newInstance ();
185+ }
186+ Transformer transformer = transformerFactory .newTransformer ();
187+ transformer .setOutputProperty (OutputKeys .METHOD , "xml" );
188+ transformer .setOutputProperty (OutputKeys .INDENT , "yes" );
189+ transformer .setOutputProperty ("{http://xml.apache.org/xslt}indent-amount" , "2" );
190+
191+ ByteArrayOutputStream baos = new ByteArrayOutputStream ();
192+ transformer .transform (new DOMSource (doc ), new StreamResult (new OutputStreamWriter (baos )));
193+ return new String (baos .toByteArray ());
194+ }
159195}
0 commit comments