Skip to content

Commit a7fb4bb

Browse files
committed
SWS-203
1 parent 566c8be commit a7fb4bb

File tree

7 files changed

+203
-6
lines changed

7 files changed

+203
-6
lines changed

core/src/main/java/org/springframework/ws/server/endpoint/interceptor/PayloadTransformingInterceptor.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import org.springframework.ws.context.MessageContext;
3131
import org.springframework.ws.server.EndpointInterceptor;
3232
import org.springframework.xml.transform.ResourceSource;
33+
import org.xml.sax.XMLReader;
34+
import org.xml.sax.helpers.XMLReaderFactory;
3335

3436
/**
3537
* Interceptor that transforms the payload of <code>WebServiceMessage</code>s using XSLT stylesheet. Allows for seperate
@@ -113,20 +115,22 @@ public void afterPropertiesSet() throws Exception {
113115
throw new IllegalArgumentException("Setting either 'requestXslt' or 'responseXslt' is required");
114116
}
115117
TransformerFactory transformerFactory = TransformerFactory.newInstance();
118+
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
119+
xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
116120
if (requestXslt != null) {
117121
Assert.isTrue(requestXslt.exists(), "requestXslt \"" + requestXslt + "\" does not exit");
118122
if (logger.isInfoEnabled()) {
119123
logger.info("Transforming request using " + requestXslt);
120124
}
121-
Source requestSource = new ResourceSource(requestXslt);
125+
Source requestSource = new ResourceSource(xmlReader, requestXslt);
122126
requestTemplates = transformerFactory.newTemplates(requestSource);
123127
}
124128
if (responseXslt != null) {
125129
Assert.isTrue(responseXslt.exists(), "responseXslt \"" + responseXslt + "\" does not exit");
126130
if (logger.isInfoEnabled()) {
127131
logger.info("Transforming response using " + responseXslt);
128132
}
129-
Source responseSource = new ResourceSource(responseXslt);
133+
Source responseSource = new ResourceSource(xmlReader, responseXslt);
130134
responseTemplates = transformerFactory.newTemplates(responseSource);
131135
}
132136
}

core/src/main/java/org/springframework/ws/wsdl/wsdl11/SimpleWsdl11Definition.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@
1818

1919
import java.io.IOException;
2020
import javax.xml.transform.Source;
21-
import javax.xml.transform.sax.SAXSource;
2221

2322
import org.springframework.beans.factory.InitializingBean;
2423
import org.springframework.core.io.Resource;
2524
import org.springframework.util.Assert;
2625
import org.springframework.ws.wsdl.WsdlDefinitionException;
27-
import org.springframework.xml.sax.SaxUtils;
26+
import org.springframework.xml.transform.ResourceSource;
27+
import org.xml.sax.SAXException;
28+
import org.xml.sax.XMLReader;
29+
import org.xml.sax.helpers.XMLReaderFactory;
2830

2931
/**
3032
* The default {@link Wsdl11Definition} implementation.
@@ -64,7 +66,12 @@ public void afterPropertiesSet() throws Exception {
6466

6567
public Source getSource() {
6668
try {
67-
return new SAXSource(SaxUtils.createInputSource(this.wsdlResource));
69+
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
70+
xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
71+
return new ResourceSource(xmlReader, wsdlResource);
72+
}
73+
catch (SAXException ex) {
74+
throw new WsdlDefinitionException("Could not create XMLReader", ex);
6875
}
6976
catch (IOException ex) {
7077
throw new WsdlDefinitionException("Could not create source from " + this.wsdlResource, ex);

core/src/test/java/org/springframework/ws/transport/http/WsdlDefinitionHandlerAdapterTest.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,26 @@
1616

1717
package org.springframework.ws.transport.http;
1818

19+
import java.io.ByteArrayInputStream;
20+
import java.io.InputStream;
1921
import java.net.URI;
2022
import javax.servlet.ServletException;
23+
import javax.wsdl.Definition;
24+
import javax.wsdl.factory.WSDLFactory;
25+
import javax.wsdl.xml.WSDLReader;
2126
import javax.xml.parsers.DocumentBuilder;
2227
import javax.xml.parsers.DocumentBuilderFactory;
2328

2429
import org.custommonkey.xmlunit.XMLTestCase;
2530
import org.easymock.MockControl;
31+
import org.springframework.core.io.ClassPathResource;
2632
import org.springframework.mock.web.MockHttpServletRequest;
2733
import org.springframework.mock.web.MockHttpServletResponse;
2834
import org.springframework.ws.wsdl.WsdlDefinition;
35+
import org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition;
2936
import org.springframework.xml.transform.StringSource;
3037
import org.w3c.dom.Document;
38+
import org.xml.sax.InputSource;
3139

3240
public class WsdlDefinitionHandlerAdapterTest extends XMLTestCase {
3341

@@ -149,4 +157,71 @@ public void testTransformLocationEmptyContextRelativeUrl() throws Exception {
149157
assertNotNull("No result", result);
150158
assertEquals("Invalid result", new URI("http://example.com:8080/service"), new URI(result));
151159
}
160+
161+
public void testHandleSimpleWsdl11DefinitionWithoutTransformLocations() throws Exception {
162+
adapter.setTransformLocations(false);
163+
request.setMethod("GET");
164+
request.setScheme("http");
165+
request.setServerName("example.com");
166+
request.setServerPort(8080);
167+
request.setContextPath("/context");
168+
request.setServletPath("/service.wsdl");
169+
request.setPathInfo(null);
170+
request.setRequestURI("/context/service.wsdl");
171+
172+
SimpleWsdl11Definition definition =
173+
new SimpleWsdl11Definition(new ClassPathResource("echo-input.wsdl", getClass()));
174+
175+
adapter.handle(request, response, definition);
176+
InputStream inputStream = new ByteArrayInputStream(response.getContentAsByteArray());
177+
178+
WSDLFactory factory = WSDLFactory.newInstance();
179+
WSDLReader reader = factory.newWSDLReader();
180+
Definition wsdl4jDefinition = reader.readWSDL(null, new InputSource(inputStream));
181+
assertNotNull("No definition read", wsdl4jDefinition);
182+
183+
inputStream = new ByteArrayInputStream(response.getContentAsByteArray());
184+
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
185+
documentBuilderFactory.setNamespaceAware(true);
186+
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
187+
Document resultingDocument = documentBuilder.parse(inputStream);
188+
189+
documentBuilder = documentBuilderFactory.newDocumentBuilder();
190+
Document expectedDocument = documentBuilder.parse(getClass().getResourceAsStream("echo-input.wsdl"));
191+
assertXMLEqual("Invalid WSDL returned", expectedDocument, resultingDocument);
192+
}
193+
194+
public void testHandleSimpleWsdl11DefinitionWithTransformLocation() throws Exception {
195+
adapter.setTransformLocations(true);
196+
request.setMethod("GET");
197+
request.setScheme("http");
198+
request.setServerName("example.com");
199+
request.setServerPort(8080);
200+
request.setContextPath("/context");
201+
request.setServletPath("/service.wsdl");
202+
request.setPathInfo(null);
203+
request.setRequestURI("/context/service.wsdl");
204+
205+
SimpleWsdl11Definition definition =
206+
new SimpleWsdl11Definition(new ClassPathResource("echo-input.wsdl", getClass()));
207+
208+
adapter.handle(request, response, definition);
209+
InputStream inputStream = new ByteArrayInputStream(response.getContentAsByteArray());
210+
211+
WSDLFactory factory = WSDLFactory.newInstance();
212+
WSDLReader reader = factory.newWSDLReader();
213+
Definition wsdl4jDefinition = reader.readWSDL(null, new InputSource(inputStream));
214+
assertNotNull("No definition read", wsdl4jDefinition);
215+
216+
inputStream = new ByteArrayInputStream(response.getContentAsByteArray());
217+
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
218+
documentBuilderFactory.setNamespaceAware(true);
219+
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
220+
Document resultingDocument = documentBuilder.parse(inputStream);
221+
222+
documentBuilder = documentBuilderFactory.newDocumentBuilder();
223+
Document expectedDocument = documentBuilder.parse(getClass().getResourceAsStream("echo-expected.wsdl"));
224+
assertXMLEqual("Invalid WSDL returned", expectedDocument, resultingDocument);
225+
}
226+
152227
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
3+
xmlns:schema="http://www.springframework.org/spring-ws/samples/echo"
4+
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
5+
targetNamespace="http://www.springframework.org/spring-ws/samples/echo">
6+
<wsdl:types>
7+
<schema xmlns="http://www.w3.org/2001/XMLSchema"
8+
xmlns:tns="http://www.springframework.org/spring-ws/samples/echo" attributeFormDefault="qualified"
9+
elementFormDefault="qualified" targetNamespace="http://www.springframework.org/spring-ws/samples/echo">
10+
<element name="echoRequest">
11+
<simpleType>
12+
<restriction base="string">
13+
<pattern value="([A-Z]|[a-z])+"/>
14+
</restriction>
15+
</simpleType>
16+
</element>
17+
<element name="echoResponse" type="string"/>
18+
</schema>
19+
</wsdl:types>
20+
<wsdl:message name="echoResponse">
21+
<wsdl:part name="echoResponse" element="schema:echoResponse"/>
22+
</wsdl:message>
23+
<wsdl:message name="echoRequest">
24+
<wsdl:part name="echoRequest" element="schema:echoRequest"/>
25+
</wsdl:message>
26+
<wsdl:portType name="Echo">
27+
<wsdl:operation name="echo">
28+
<wsdl:input name="echoRequest" message="schema:echoRequest"/>
29+
<wsdl:output name="echoResponse" message="schema:echoResponse"/>
30+
</wsdl:operation>
31+
</wsdl:portType>
32+
<wsdl:binding name="EchoBinding" type="schema:Echo">
33+
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
34+
<wsdl:operation name="echo">
35+
<soap:operation soapAction="test"/>
36+
<wsdl:input name="echoRequest">
37+
<soap:body use="literal"/>
38+
</wsdl:input>
39+
<wsdl:output name="echoResponse">
40+
<soap:body use="literal"/>
41+
</wsdl:output>
42+
</wsdl:operation>
43+
</wsdl:binding>
44+
<wsdl:service name="EchoService">
45+
<wsdl:port name="EchoPort" binding="schema:EchoBinding">
46+
<soap:address location="http://example.com:8080/echo/services"/>
47+
</wsdl:port>
48+
</wsdl:service>
49+
</wsdl:definitions>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
3+
xmlns:schema="http://www.springframework.org/spring-ws/samples/echo"
4+
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
5+
targetNamespace="http://www.springframework.org/spring-ws/samples/echo">
6+
<wsdl:types>
7+
<schema xmlns="http://www.w3.org/2001/XMLSchema"
8+
xmlns:tns="http://www.springframework.org/spring-ws/samples/echo" attributeFormDefault="qualified"
9+
elementFormDefault="qualified" targetNamespace="http://www.springframework.org/spring-ws/samples/echo">
10+
<element name="echoRequest">
11+
<simpleType>
12+
<restriction base="string">
13+
<pattern value="([A-Z]|[a-z])+"/>
14+
</restriction>
15+
</simpleType>
16+
</element>
17+
<element name="echoResponse" type="string"/>
18+
</schema>
19+
</wsdl:types>
20+
<wsdl:message name="echoResponse">
21+
<wsdl:part name="echoResponse" element="schema:echoResponse"/>
22+
</wsdl:message>
23+
<wsdl:message name="echoRequest">
24+
<wsdl:part name="echoRequest" element="schema:echoRequest"/>
25+
</wsdl:message>
26+
<wsdl:portType name="Echo">
27+
<wsdl:operation name="echo">
28+
<wsdl:input name="echoRequest" message="schema:echoRequest"/>
29+
<wsdl:output name="echoResponse" message="schema:echoResponse"/>
30+
</wsdl:operation>
31+
</wsdl:portType>
32+
<wsdl:binding name="EchoBinding" type="schema:Echo">
33+
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
34+
<wsdl:operation name="echo">
35+
<soap:operation soapAction="test"/>
36+
<wsdl:input name="echoRequest">
37+
<soap:body use="literal"/>
38+
</wsdl:input>
39+
<wsdl:output name="echoResponse">
40+
<soap:body use="literal"/>
41+
</wsdl:output>
42+
</wsdl:operation>
43+
</wsdl:binding>
44+
<wsdl:service name="EchoService">
45+
<wsdl:port name="EchoPort" binding="schema:EchoBinding">
46+
<soap:address location="http://localhost:8080/echo/services"/>
47+
</wsdl:port>
48+
</wsdl:service>
49+
</wsdl:definitions>

xml/src/main/java/org/springframework/xml/transform/ResourceSource.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.springframework.core.io.Resource;
2323
import org.springframework.xml.sax.SaxUtils;
24+
import org.xml.sax.XMLReader;
2425

2526
/**
2627
* Convenient subclass of {@link SAXSource} that reads from a Spring {@link Resource}. The resource to be read can be
@@ -40,4 +41,12 @@ public ResourceSource(Resource content) throws IOException {
4041
super(SaxUtils.createInputSource(content));
4142
}
4243

44+
/**
45+
* Initializes a new instance of the <code>ResourceSource</code> with the given {@link XMLReader} and resource.
46+
*
47+
* @param content the content
48+
*/
49+
public ResourceSource(XMLReader reader, Resource content) throws IOException {
50+
super(reader, SaxUtils.createInputSource(content));
51+
}
4352
}

xml/src/main/java/org/springframework/xml/validation/SchemaLoaderUtils.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.springframework.util.Assert;
2626
import org.springframework.xml.transform.ResourceSource;
2727
import org.xml.sax.SAXException;
28+
import org.xml.sax.XMLReader;
29+
import org.xml.sax.helpers.XMLReaderFactory;
2830

2931
/**
3032
* Convenient utility methods for loading of {@link Schema} objects, performing standard handling of input streams.
@@ -64,10 +66,12 @@ public static Schema loadSchema(Resource[] resources, String schemaLanguage) thr
6466
Assert.notEmpty(resources, "No resources given");
6567
Assert.hasLength(schemaLanguage, "No schema language provided");
6668
Source[] schemaSources = new Source[resources.length];
69+
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
70+
xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
6771
for (int i = 0; i < resources.length; i++) {
6872
Assert.notNull(resources[i], "Resource is null");
6973
Assert.isTrue(resources[i].exists(), "Resource " + resources[i] + " does not exist");
70-
schemaSources[i] = new ResourceSource(resources[i]);
74+
schemaSources[i] = new ResourceSource(xmlReader, resources[i]);
7175
}
7276
SchemaFactory schemaFactory = SchemaFactory.newInstance(schemaLanguage);
7377
return schemaFactory.newSchema(schemaSources);

0 commit comments

Comments
 (0)