1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.server.endpoint.interceptor;
18
19 import java.io.ByteArrayInputStream;
20 import java.io.ByteArrayOutputStream;
21 import javax.xml.transform.Source;
22 import javax.xml.transform.Templates;
23 import javax.xml.transform.Transformer;
24 import javax.xml.transform.TransformerException;
25 import javax.xml.transform.TransformerFactory;
26 import javax.xml.transform.stream.StreamResult;
27 import javax.xml.transform.stream.StreamSource;
28
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.xml.sax.XMLReader;
32 import org.xml.sax.helpers.XMLReaderFactory;
33
34 import org.springframework.beans.factory.InitializingBean;
35 import org.springframework.core.io.Resource;
36 import org.springframework.util.Assert;
37 import org.springframework.ws.WebServiceMessage;
38 import org.springframework.ws.context.MessageContext;
39 import org.springframework.ws.server.EndpointInterceptor;
40 import org.springframework.xml.transform.ResourceSource;
41 import org.springframework.xml.transform.TransformerObjectSupport;
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 public class PayloadTransformingInterceptor extends TransformerObjectSupport
58 implements EndpointInterceptor, InitializingBean {
59
60 private static final Log logger = LogFactory.getLog(PayloadTransformingInterceptor.class);
61
62 private Resource requestXslt;
63
64 private Resource responseXslt;
65
66 private Templates requestTemplates;
67
68 private Templates responseTemplates;
69
70
71 public void setRequestXslt(Resource requestXslt) {
72 this.requestXslt = requestXslt;
73 }
74
75
76 public void setResponseXslt(Resource responseXslt) {
77 this.responseXslt = responseXslt;
78 }
79
80
81
82
83
84
85
86
87
88 public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
89 if (requestTemplates != null) {
90 WebServiceMessage request = messageContext.getRequest();
91 Transformer transformer = requestTemplates.newTransformer();
92 transformMessage(request, transformer);
93 logger.debug("Request message transformed");
94 }
95 return true;
96 }
97
98
99
100
101
102
103
104
105
106 public boolean handleResponse(MessageContext messageContext, Object endpoint) throws Exception {
107 if (responseTemplates != null) {
108 WebServiceMessage response = messageContext.getResponse();
109 Transformer transformer = responseTemplates.newTransformer();
110 transformMessage(response, transformer);
111 logger.debug("Response message transformed");
112 }
113 return true;
114 }
115
116 private void transformMessage(WebServiceMessage message, Transformer transformer) throws TransformerException {
117 ByteArrayOutputStream os = new ByteArrayOutputStream();
118 transformer.transform(message.getPayloadSource(), new StreamResult(os));
119 ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
120 transform(new StreamSource(is), message.getPayloadResult());
121 }
122
123
124 public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception {
125 return true;
126 }
127
128 public void afterPropertiesSet() throws Exception {
129 if (requestXslt == null && responseXslt == null) {
130 throw new IllegalArgumentException("Setting either 'requestXslt' or 'responseXslt' is required");
131 }
132 TransformerFactory transformerFactory = TransformerFactory.newInstance();
133 XMLReader xmlReader = XMLReaderFactory.createXMLReader();
134 xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
135 if (requestXslt != null) {
136 Assert.isTrue(requestXslt.exists(), "requestXslt \"" + requestXslt + "\" does not exit");
137 if (logger.isInfoEnabled()) {
138 logger.info("Transforming request using " + requestXslt);
139 }
140 Source requestSource = new ResourceSource(xmlReader, requestXslt);
141 requestTemplates = transformerFactory.newTemplates(requestSource);
142 }
143 if (responseXslt != null) {
144 Assert.isTrue(responseXslt.exists(), "responseXslt \"" + responseXslt + "\" does not exit");
145 if (logger.isInfoEnabled()) {
146 logger.info("Transforming response using " + responseXslt);
147 }
148 Source responseSource = new ResourceSource(xmlReader, responseXslt);
149 responseTemplates = transformerFactory.newTemplates(responseSource);
150 }
151 }
152 }