1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws;
18
19 import java.io.ByteArrayInputStream;
20 import java.io.ByteArrayOutputStream;
21 import java.io.IOException;
22 import java.io.InputStreamReader;
23 import java.io.Reader;
24 import java.io.StringWriter;
25 import javax.xml.parsers.DocumentBuilder;
26 import javax.xml.parsers.DocumentBuilderFactory;
27 import javax.xml.stream.XMLEventReader;
28 import javax.xml.stream.XMLEventWriter;
29 import javax.xml.stream.XMLInputFactory;
30 import javax.xml.stream.XMLOutputFactory;
31 import javax.xml.stream.XMLStreamReader;
32 import javax.xml.stream.XMLStreamWriter;
33 import javax.xml.transform.Transformer;
34 import javax.xml.transform.TransformerFactory;
35 import javax.xml.transform.dom.DOMResult;
36 import javax.xml.transform.dom.DOMSource;
37 import javax.xml.transform.sax.SAXSource;
38 import javax.xml.transform.stream.StreamResult;
39 import javax.xml.transform.stream.StreamSource;
40
41 import org.custommonkey.xmlunit.XMLTestCase;
42 import org.custommonkey.xmlunit.XMLUnit;
43 import org.springframework.core.io.ClassPathResource;
44 import org.springframework.core.io.Resource;
45 import org.springframework.util.FileCopyUtils;
46 import org.springframework.xml.sax.SaxUtils;
47 import org.springframework.xml.transform.StaxResult;
48 import org.springframework.xml.transform.StaxSource;
49 import org.springframework.xml.transform.StringResult;
50 import org.w3c.dom.Document;
51 import org.xml.sax.InputSource;
52 import org.xml.sax.XMLReader;
53 import org.xml.sax.helpers.DefaultHandler;
54 import org.xml.sax.helpers.XMLReaderFactory;
55
56 public abstract class AbstractWebServiceMessageTestCase extends XMLTestCase {
57
58 protected Transformer transformer;
59
60 protected WebServiceMessage webServiceMessage;
61
62 private Resource payload;
63
64 private String getExpectedString() throws IOException {
65 StringWriter expectedWriter = new StringWriter();
66 FileCopyUtils.copy(new InputStreamReader(payload.getInputStream(), "UTF-8"), expectedWriter);
67 return expectedWriter.toString();
68 }
69
70 protected final void setUp() throws Exception {
71 TransformerFactory transformerFactory = TransformerFactory.newInstance();
72 transformer = transformerFactory.newTransformer();
73 webServiceMessage = createWebServiceMessage();
74 payload = new ClassPathResource("payload.xml", AbstractWebServiceMessageTestCase.class);
75 XMLUnit.setIgnoreWhitespace(true);
76 }
77
78 public void testDomPayload() throws Exception {
79 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
80 documentBuilderFactory.setNamespaceAware(true);
81 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
82 Document payloadDocument = documentBuilder.parse(SaxUtils.createInputSource(payload));
83 DOMSource domSource = new DOMSource(payloadDocument);
84 transformer.transform(domSource, webServiceMessage.getPayloadResult());
85 Document resultDocument = documentBuilder.newDocument();
86 DOMResult domResult = new DOMResult(resultDocument);
87 transformer.transform(webServiceMessage.getPayloadSource(), domResult);
88 assertXMLEqual(payloadDocument, resultDocument);
89 validateMessage();
90 }
91
92 public void testEventReaderPayload() throws Exception {
93 XMLInputFactory inputFactory = XMLInputFactory.newInstance();
94 XMLEventReader eventReader = inputFactory.createXMLEventReader(payload.getInputStream());
95 StaxSource staxSource = new StaxSource(eventReader);
96 transformer.transform(staxSource, webServiceMessage.getPayloadResult());
97 StringWriter stringWriter = new StringWriter();
98 XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
99 XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(stringWriter);
100 StaxResult staxResult = new StaxResult(eventWriter);
101 transformer.transform(webServiceMessage.getPayloadSource(), staxResult);
102 eventWriter.flush();
103 assertXMLEqual(getExpectedString(), stringWriter.toString());
104 validateMessage();
105 }
106
107 public void testReaderPayload() throws Exception {
108 Reader reader = new InputStreamReader(payload.getInputStream(), "UTF-8");
109 StreamSource streamSource = new StreamSource(reader, payload.getURL().toString());
110 transformer.transform(streamSource, webServiceMessage.getPayloadResult());
111 StringWriter resultWriter = new StringWriter();
112 StreamResult streamResult = new StreamResult(resultWriter);
113 transformer.transform(webServiceMessage.getPayloadSource(), streamResult);
114 assertXMLEqual(getExpectedString(), resultWriter.toString());
115 }
116
117 public void testSaxPayload() throws Exception {
118 SAXSource saxSource = new SAXSource(SaxUtils.createInputSource(payload));
119 transformer.transform(saxSource, webServiceMessage.getPayloadResult());
120 StringResult stringResult = new StringResult();
121 transformer.transform(webServiceMessage.getPayloadSource(), stringResult);
122 assertXMLEqual(getExpectedString(), stringResult.toString());
123 validateMessage();
124 }
125
126 public void testStreamPayload() throws Exception {
127 StreamSource streamSource = new StreamSource(payload.getInputStream(), payload.getURL().toString());
128 transformer.transform(streamSource, webServiceMessage.getPayloadResult());
129 ByteArrayOutputStream resultStream = new ByteArrayOutputStream();
130 StreamResult streamResult = new StreamResult(resultStream);
131 transformer.transform(webServiceMessage.getPayloadSource(), streamResult);
132 ByteArrayOutputStream expectedStream = new ByteArrayOutputStream();
133 FileCopyUtils.copy(payload.getInputStream(), expectedStream);
134 assertXMLEqual(expectedStream.toString("UTF-8"), resultStream.toString("UTF-8"));
135 validateMessage();
136 }
137
138 public void testStreamReaderPayload() throws Exception {
139 XMLInputFactory inputFactory = XMLInputFactory.newInstance();
140 XMLStreamReader streamReader = inputFactory.createXMLStreamReader(payload.getInputStream());
141 StaxSource staxSource = new StaxSource(streamReader);
142 transformer.transform(staxSource, webServiceMessage.getPayloadResult());
143 StringWriter stringWriter = new StringWriter();
144 XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
145 XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(stringWriter);
146 StaxResult staxResult = new StaxResult(streamWriter);
147 transformer.transform(webServiceMessage.getPayloadSource(), staxResult);
148 streamWriter.flush();
149 assertXMLEqual(getExpectedString(), stringWriter.toString());
150 validateMessage();
151 }
152
153 private void validateMessage() throws Exception {
154 XMLReader xmlReader = XMLReaderFactory.createXMLReader();
155 xmlReader.setContentHandler(new DefaultHandler());
156 ByteArrayOutputStream os = new ByteArrayOutputStream();
157 webServiceMessage.writeTo(os);
158 ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
159 xmlReader.parse(new InputSource(is));
160 }
161
162 protected abstract WebServiceMessage createWebServiceMessage() throws Exception;
163 }