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