Pavol Mederly created CXF-6034:
----------------------------------
Summary: Wrong schemaLocation if jax-ws-catalog is used
Key: CXF-6034
URL: https://issues.apache.org/jira/browse/CXF-6034
Project: CXF
Issue Type: Bug
Components: Simple Frontend
Affects Versions: 3.0.1
Reporter: Pavol Mederly
When
- using a WSDL-first approach,
- defining endpoints so that *your* (not generated) WSDL is provided,
- using jax-ws-catalog
the WSDL given out to the client is sometimes incorrect.
Specifically, having entries in jax-ws-catalog like these
{code}
<public publicId="http://test.com/main/schema" uri="../main/schema.xsd" />
<system systemId="http://test.com/main/schema" uri="../main/schema.xsd" />
<public publicId="http://test.com/auxiliary/schema"
uri="../auxiliary/auxiliary.xsd" />
<system systemId="http://test.com/auxiliary/schema"
uri="../auxiliary/auxiliary.xsd" />
{code}
And having XSD imports in your types section of WSDL like these:
{code}
<xs:schema targetNamespace="http://test.com/main/customer-service" ...>
<!-- this fails -->
<xsd:import namespace="http://test.com/main/schema"
schemaLocation="http://test.com/main/schema"/>
<!-- this works -->
<xsd:import namespace="http://test.com/auxiliary/schema"
schemaLocation="http://test.com/auxiliary/schema"/>
</xs:schema>
{code}
The resulting WSDL is like this (showing only the relevant part):
{code}
<xs:schema targetNamespace="http://test.com/main/customer-service" ...>
<!-- this fails -->
<xsd:import namespace="http://test.com/main/schema"
schemaLocation="http://test.com/main/schema"/>
<!-- this works -->
<xsd:import namespace="http://test.com/auxiliary/schema"
schemaLocation="http://localhost:9090/CustomerServicePort?xsd=http://test.com/auxiliary/schema"/
</xs:schema>
{code}
(note the wrong schemaLocation attribute in the first import)
The problem occurs when the URI of the resource being imported is the same as
(except for its last segment) the URI of the WSDL itself. In this case,
*http://test.com/main/*schema vs. *http://test.com/main/*customer-service.
I was able to fix this preliminarily by disabling "optimization" used in
WSDLGetUtils.findSchemaLocation, namely this code:
{code}
if (docBase != null && imp.getReferencedSchema() != null) {
try {
String baseURI = URLDecoder.decode(UrlUtils.getStem(docBase),
"utf-8");
String importURI =
URLDecoder.decode(imp.getReferencedSchema().getDocumentBaseURI(), "utf-8");
if (importURI.contains(baseURI)) {
schemaLocationURI = importURI.substring(baseURI.length() +
1);
}
} catch (Exception e) {
//ignore
}
}
{code}
However, I'm sure this is in fact a workaround; there should exist a cleaner
solution.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)