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.Result;
34 import javax.xml.transform.Source;
35 import javax.xml.transform.Transformer;
36 import javax.xml.transform.TransformerFactory;
37 import javax.xml.transform.dom.DOMResult;
38 import javax.xml.transform.dom.DOMSource;
39 import javax.xml.transform.sax.SAXSource;
40 import javax.xml.transform.stream.StreamResult;
41 import javax.xml.transform.stream.StreamSource;
42
43 import org.springframework.core.io.ClassPathResource;
44 import org.springframework.core.io.Resource;
45 import org.springframework.util.FileCopyUtils;
46 import org.springframework.util.xml.StaxUtils;
47 import org.springframework.xml.sax.SaxUtils;
48 import org.springframework.xml.transform.StringResult;
49
50 import org.custommonkey.xmlunit.XMLUnit;
51 import org.junit.Before;
52 import org.junit.Test;
53 import org.w3c.dom.Document;
54 import org.xml.sax.InputSource;
55 import org.xml.sax.XMLReader;
56 import org.xml.sax.helpers.DefaultHandler;
57 import org.xml.sax.helpers.XMLReaderFactory;
58
59 import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
60
61 public abstract class AbstractWebServiceMessageTestCase {
62
63 protected Transformer transformer;
64
65 protected WebServiceMessage webServiceMessage;
66
67 private Resource payload;
68
69 private String getExpectedString() throws IOException {
70 StringWriter expectedWriter = new StringWriter();
71 FileCopyUtils.copy(new InputStreamReader(payload.getInputStream(), "UTF-8"), expectedWriter);
72 return expectedWriter.toString();
73 }
74
75 @Before
76 public final void setUp() throws Exception {
77 TransformerFactory transformerFactory = TransformerFactory.newInstance();
78 transformer = transformerFactory.newTransformer();
79 webServiceMessage = createWebServiceMessage();
80 payload = new ClassPathResource("payload.xml", AbstractWebServiceMessageTestCase.class);
81 XMLUnit.setIgnoreWhitespace(true);
82 }
83
84 @Test
85 public void testDomPayload() throws Exception {
86 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
87 documentBuilderFactory.setNamespaceAware(true);
88 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
89 Document payloadDocument = documentBuilder.parse(SaxUtils.createInputSource(payload));
90 DOMSource domSource = new DOMSource(payloadDocument);
91 transformer.transform(domSource, webServiceMessage.getPayloadResult());
92 Document resultDocument = documentBuilder.newDocument();
93 DOMResult domResult = new DOMResult(resultDocument);
94 transformer.transform(webServiceMessage.getPayloadSource(), domResult);
95 assertXMLEqual(payloadDocument, resultDocument);
96 validateMessage();
97 }
98
99 @Test
100 public void testEventReaderPayload() throws Exception {
101 XMLInputFactory inputFactory = XMLInputFactory.newInstance();
102 XMLEventReader eventReader = inputFactory.createXMLEventReader(payload.getInputStream());
103 Source staxSource = StaxUtils.createCustomStaxSource(eventReader);
104 transformer.transform(staxSource, webServiceMessage.getPayloadResult());
105 StringWriter stringWriter = new StringWriter();
106 XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
107 XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(stringWriter);
108 Result staxResult = StaxUtils.createCustomStaxResult(eventWriter);
109 transformer.transform(webServiceMessage.getPayloadSource(), staxResult);
110 eventWriter.flush();
111 assertXMLEqual(getExpectedString(), stringWriter.toString());
112 validateMessage();
113 }
114
115 @Test
116 public void testReaderPayload() throws Exception {
117 Reader reader = new InputStreamReader(payload.getInputStream(), "UTF-8");
118 StreamSource streamSource = new StreamSource(reader, payload.getURL().toString());
119 transformer.transform(streamSource, webServiceMessage.getPayloadResult());
120 StringWriter resultWriter = new StringWriter();
121 StreamResult streamResult = new StreamResult(resultWriter);
122 transformer.transform(webServiceMessage.getPayloadSource(), streamResult);
123 assertXMLEqual(getExpectedString(), resultWriter.toString());
124 }
125
126 @Test
127 public void testSaxPayload() throws Exception {
128 SAXSource saxSource = new SAXSource(SaxUtils.createInputSource(payload));
129 transformer.transform(saxSource, webServiceMessage.getPayloadResult());
130 StringResult stringResult = new StringResult();
131 transformer.transform(webServiceMessage.getPayloadSource(), stringResult);
132 assertXMLEqual(getExpectedString(), stringResult.toString());
133 validateMessage();
134 }
135
136 @Test
137 public void testStreamPayload() throws Exception {
138 StreamSource streamSource = new StreamSource(payload.getInputStream(), payload.getURL().toString());
139 transformer.transform(streamSource, webServiceMessage.getPayloadResult());
140 ByteArrayOutputStream resultStream = new ByteArrayOutputStream();
141 StreamResult streamResult = new StreamResult(resultStream);
142 transformer.transform(webServiceMessage.getPayloadSource(), streamResult);
143 ByteArrayOutputStream expectedStream = new ByteArrayOutputStream();
144 FileCopyUtils.copy(payload.getInputStream(), expectedStream);
145 assertXMLEqual(expectedStream.toString("UTF-8"), resultStream.toString("UTF-8"));
146 validateMessage();
147 }
148
149 @Test
150 public void testStreamReaderPayload() throws Exception {
151 XMLInputFactory inputFactory = XMLInputFactory.newInstance();
152 XMLStreamReader streamReader = inputFactory.createXMLStreamReader(payload.getInputStream());
153 Source staxSource = StaxUtils.createCustomStaxSource(streamReader);
154 transformer.transform(staxSource, webServiceMessage.getPayloadResult());
155 StringWriter stringWriter = new StringWriter();
156 XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
157 XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(stringWriter);
158 Result staxResult = StaxUtils.createCustomStaxResult(streamWriter);
159 transformer.transform(webServiceMessage.getPayloadSource(), staxResult);
160 streamWriter.flush();
161 assertXMLEqual(getExpectedString(), stringWriter.toString());
162 validateMessage();
163 }
164
165 private void validateMessage() throws Exception {
166 XMLReader xmlReader = XMLReaderFactory.createXMLReader();
167 xmlReader.setContentHandler(new DefaultHandler());
168 ByteArrayOutputStream os = new ByteArrayOutputStream();
169 webServiceMessage.writeTo(os);
170 ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
171 xmlReader.parse(new InputSource(is));
172 }
173
174 protected abstract WebServiceMessage createWebServiceMessage() throws Exception;
175 }