Skip to content

Commit 028c763

Browse files
committed
refactor(soap): reuses EntityResolver for the same WSDL file.
1 parent fe52343 commit 028c763

File tree

8 files changed

+43
-16
lines changed

8 files changed

+43
-16
lines changed

mock/soap/src/main/java/io/gatehill/imposter/plugin/soap/parser/AbstractWsdlParser.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import org.jdom2.Document
5555
import org.jdom2.Element
5656
import org.jdom2.Namespace
5757
import org.jdom2.output.XMLOutputter
58+
import org.xml.sax.EntityResolver
5859
import java.io.File
5960
import javax.xml.namespace.QName
6061

@@ -64,6 +65,7 @@ import javax.xml.namespace.QName
6465
abstract class AbstractWsdlParser(
6566
private val wsdlFile: File,
6667
protected val document: Document,
68+
private val entityResolver: EntityResolver,
6769
) : WsdlParser {
6870
protected val logger: Logger = LogManager.getLogger(this::class.java)
6971

@@ -75,10 +77,15 @@ abstract class AbstractWsdlParser(
7577
val schemas = mutableListOf<SchemaDocument>()
7678
schemas += findEmbeddedTypesSchemas()
7779

78-
// TODO consider only those referenced by 'xs:import'
80+
// TODO consider only those referenced by 'xs:import' or 'xs:include'
7981
val xsds = wsdlFile.parentFile.listFiles { _, name -> name.endsWith(".xsd") }?.toList() ?: emptyList()
8082
schemas += xsds.map { schemaFile ->
81-
SchemaDocument.Factory.parse(schemaFile, XmlOptions().setLoadLineNumbers().setLoadMessageDigest())
83+
val options = XmlOptions()
84+
.setLoadLineNumbers()
85+
.setLoadMessageDigest()
86+
.setEntityResolver(entityResolver)
87+
88+
SchemaDocument.Factory.parse(schemaFile, options)
8289
}
8390

8491
logger.debug("Discovered {} schema(s) for WSDL: {}", schemas.size, wsdlFile)
@@ -117,7 +124,9 @@ abstract class AbstractWsdlParser(
117124
throw IllegalStateException("Cannot build XSD from empty schema list")
118125
}
119126
val compileOptions = XmlOptions()
120-
.setEntityResolver(WsdlRelativeXsdEntityResolver(wsdlFile.parentFile))
127+
.setLoadLineNumbers()
128+
.setLoadMessageDigest()
129+
.setEntityResolver(entityResolver)
121130
try {
122131
return XmlBeans.compileXsd(schemas, XmlBeans.getBuiltinTypeSystem(), compileOptions)
123132
} catch (e: Exception) {

mock/soap/src/main/java/io/gatehill/imposter/plugin/soap/parser/VersionAwareWsdlParser.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,18 +62,17 @@ class VersionAwareWsdlParser(wsdlFile: File) : WsdlParser {
6262
private val delegate: WsdlParser
6363

6464
init {
65-
val document = SAXBuilder().apply {
66-
entityResolver = WsdlRelativeXsdEntityResolver(wsdlFile.parentFile)
67-
}.build(wsdlFile)
65+
val entityResolver = WsdlRelativeXsdEntityResolver(wsdlFile.parentFile)
66+
val document = SAXBuilder().apply { setEntityResolver(entityResolver) }.build(wsdlFile)
6867

6968
val wsdlNamespaces = document.rootElement.namespacesInScope.filter {
7069
it.uri == Wsdl2Parser.wsdl2Namespace || it.uri == Wsdl1Parser.wsdl1Namespace
7170
}
7271
delegate = when (wsdlNamespaces.size) {
7372
0 -> throw IllegalStateException("No WSDL namespace found on root element")
7473
1 -> when (wsdlNamespaces.first().uri) {
75-
Wsdl1Parser.wsdl1Namespace -> Wsdl1Parser(wsdlFile, document)
76-
Wsdl2Parser.wsdl2Namespace -> Wsdl2Parser(wsdlFile, document)
74+
Wsdl1Parser.wsdl1Namespace -> Wsdl1Parser(wsdlFile, document, entityResolver)
75+
Wsdl2Parser.wsdl2Namespace -> Wsdl2Parser(wsdlFile, document, entityResolver)
7776
else -> throw IllegalStateException("Unsupported WSDL namespace on root element")
7877
}
7978
else -> throw IllegalStateException("More than one WSDL namespace found on root element: $wsdlNamespaces")

mock/soap/src/main/java/io/gatehill/imposter/plugin/soap/parser/Wsdl1Parser.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,18 @@
4343

4444
package io.gatehill.imposter.plugin.soap.parser
4545

46-
import io.gatehill.imposter.plugin.soap.model.*
46+
import io.gatehill.imposter.plugin.soap.model.BindingType
47+
import io.gatehill.imposter.plugin.soap.model.WsdlBinding
48+
import io.gatehill.imposter.plugin.soap.model.WsdlEndpoint
49+
import io.gatehill.imposter.plugin.soap.model.WsdlInterface
50+
import io.gatehill.imposter.plugin.soap.model.WsdlOperation
51+
import io.gatehill.imposter.plugin.soap.model.WsdlService
4752
import io.gatehill.imposter.plugin.soap.util.SoapUtil
4853
import io.gatehill.imposter.util.BodyQueryUtil
4954
import org.jdom2.Document
5055
import org.jdom2.Element
5156
import org.jdom2.Namespace
57+
import org.xml.sax.EntityResolver
5258
import java.io.File
5359
import java.net.URI
5460
import javax.xml.namespace.QName
@@ -61,7 +67,8 @@ import javax.xml.namespace.QName
6167
class Wsdl1Parser(
6268
wsdlFile: File,
6369
document: Document,
64-
) : AbstractWsdlParser(wsdlFile, document) {
70+
entityResolver: EntityResolver,
71+
) : AbstractWsdlParser(wsdlFile, document, entityResolver) {
6572

6673
override val version = WsdlParser.WsdlVersion.V1
6774

mock/soap/src/main/java/io/gatehill/imposter/plugin/soap/parser/Wsdl2Parser.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,17 @@
4343

4444
package io.gatehill.imposter.plugin.soap.parser
4545

46-
import io.gatehill.imposter.plugin.soap.model.*
46+
import io.gatehill.imposter.plugin.soap.model.BindingType
47+
import io.gatehill.imposter.plugin.soap.model.WsdlBinding
48+
import io.gatehill.imposter.plugin.soap.model.WsdlEndpoint
49+
import io.gatehill.imposter.plugin.soap.model.WsdlInterface
50+
import io.gatehill.imposter.plugin.soap.model.WsdlOperation
51+
import io.gatehill.imposter.plugin.soap.model.WsdlService
4752
import io.gatehill.imposter.util.BodyQueryUtil
4853
import org.jdom2.Document
4954
import org.jdom2.Element
5055
import org.jdom2.Namespace
56+
import org.xml.sax.EntityResolver
5157
import java.io.File
5258
import java.net.URI
5359
import javax.xml.namespace.QName
@@ -59,8 +65,9 @@ import javax.xml.namespace.QName
5965
*/
6066
class Wsdl2Parser(
6167
wsdlFile: File,
62-
document: Document
63-
) : AbstractWsdlParser(wsdlFile, document) {
68+
document: Document,
69+
entityResolver: EntityResolver,
70+
) : AbstractWsdlParser(wsdlFile, document, entityResolver) {
6471

6572
override val version = WsdlParser.WsdlVersion.V2
6673

mock/soap/src/main/java/io/gatehill/imposter/plugin/soap/service/SoapExampleService.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ class SoapExampleService {
9595
val errors = mutableListOf<XmlError>()
9696

9797
val compileOptions = XmlOptions()
98+
.setLoadLineNumbers()
99+
.setLoadMessageDigest()
98100
.setEntityResolver(WsdlRelativeXsdEntityResolver(wsdlDir))
99101
.setErrorListener(errors)
100102

mock/soap/src/test/java/io/gatehill/imposter/plugin/soap/parser/Wsdl1Soap11ParserTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ class Wsdl1Soap11ParserTest {
6464
fun setUp() {
6565
val wsdlFile = File(Wsdl1Soap11ParserTest::class.java.getResource("/wsdl1-soap11/service.wsdl")!!.toURI())
6666
val document = SAXBuilder().build(wsdlFile)
67-
parser = Wsdl1Parser(wsdlFile, document)
67+
val entityResolver = WsdlRelativeXsdEntityResolver(wsdlFile.parentFile)
68+
parser = Wsdl1Parser(wsdlFile, document, entityResolver)
6869
}
6970

7071
@Test

mock/soap/src/test/java/io/gatehill/imposter/plugin/soap/parser/Wsdl1Soap12ParserTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ class Wsdl1Soap12ParserTest {
6464
fun setUp() {
6565
val wsdlFile = File(Wsdl1Soap12ParserTest::class.java.getResource("/wsdl1-soap12/service.wsdl")!!.toURI())
6666
val document = SAXBuilder().build(wsdlFile)
67-
parser = Wsdl1Parser(wsdlFile, document)
67+
val entityResolver = WsdlRelativeXsdEntityResolver(wsdlFile.parentFile)
68+
parser = Wsdl1Parser(wsdlFile, document, entityResolver)
6869
}
6970

7071
@Test

mock/soap/src/test/java/io/gatehill/imposter/plugin/soap/parser/Wsdl2Soap12ParserTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ class Wsdl2Soap12ParserTest {
6464
fun setUp() {
6565
val wsdlFile = File(Wsdl2Soap12ParserTest::class.java.getResource("/wsdl2-soap12/service.wsdl")!!.toURI())
6666
val document = SAXBuilder().build(wsdlFile)
67-
parser = Wsdl2Parser(wsdlFile, document)
67+
val entityResolver = WsdlRelativeXsdEntityResolver(wsdlFile.parentFile)
68+
parser = Wsdl2Parser(wsdlFile, document, entityResolver)
6869
}
6970

7071
@Test

0 commit comments

Comments
 (0)