Details
Description
We are looking for option using which serving WSDL can shown as in-lined or flatten. e.g
I have schema as follows:
customer.xsd
------------------
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/customer"
xmlns:tns="http://www.example.org/customer" elementFormDefault="qualified">
<complexType name="customer">
<sequence>
<element name="name" type="string"></element>
<element name="id" type="string"></element>
<element name="contact" type="string"></element>
</sequence>
</complexType>
</schema>
-------------------
And the WSDL content is as follows:
-------------------
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="urn:CustomerService/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CustomerService"
targetNamespace="urn:CustomerService/">
<wsdl:types>
<xsd:schema targetNamespace="urn:CustomerService/"
xmlns:pref="http://www.example.org/customer">
<xsd:import schemaLocation="customer.xsd"
namespace="http://www.example.org/customer"></xsd:import>
<xsd:element name="addCustomerReqEl" type="pref:customer"></xsd:element>
<xsd:element name="addCustomerRespEl" type="tns:CustomerRespType">
</xsd:element>
<xsd:complexType name="CustomerRespType">
<xsd:sequence>
<xsd:element name="customer" type="pref:customer"></xsd:element>
<xsd:element name="status" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="addCustomerRequest">
<wsdl:part element="tns:addCustomerReqEl" name="parameters" />
</wsdl:message>
<wsdl:message name="addCustomerResponse">
<wsdl:part element="tns:addCustomerRespEl" name="parameters" />
</wsdl:message>
<wsdl:portType name="CustomerService">
<wsdl:operation name="addCustomer">
<wsdl:input message="tns:addCustomerRequest" />
<wsdl:output message="tns:addCustomerResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="CustomerServiceSOAP" type="tns:CustomerService">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="addCustomer">
<soap:operation soapAction="urn:CustomerService/addCustomer" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="CustomerService">
<wsdl:port binding="tns:CustomerServiceSOAP" name="CustomerServiceSOAP">
<soap:address location="http://localhost:8080/CustomerService" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
---------------------------------
When I deploy this WSDL using spring, camel and CXF as web-service, the serving WSDL (http://localhost:8080/CustomerService?WSDL) content shows schema location as http location (http://localhost:8080/CustomerService?xsd=customer.xsd)
--------------------------------
My Requirement:
- I want the imported schema content to be in-lined / flatten inside WSDL.
- If imported schema internally imports/ includes another schema that also need to be in-lined
- Also in-lined WSDL will show all included schema as merged in to single schema section to avoid conflicts.
For the above WSDL when it gets served we may have parameter to the URL e.g. http://localhost:8080/CustomerService?WSDL&flat=1 and it should give me flat WSDL as follows:
-------------------
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="urn:CustomerService/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CustomerService"
targetNamespace="urn:CustomerService/">
<wsdl:types>
<xsd:schema targetNamespace="urn:CustomerService/"
xmlns:pref="http://www.example.org/customer">
<xsd:import namespace="http://www.example.org/customer"></xsd:import>
<xsd:element name="addCustomerReqEl" type="pref:customer"></xsd:element>
<xsd:element name="addCustomerRespEl" type="tns:CustomerRespType">
</xsd:element>
<xsd:complexType name="CustomerRespType">
<xsd:sequence>
<xsd:element name="customer" type="pref:customer"></xsd:element>
<xsd:element name="status" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
<!-- Here the content of Customer.xsd is in-lined / flatten -->
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/customer" xmlns:tns="http://www.example.org/customer"
elementFormDefault="qualified">
<complexType name="customer">
<sequence>
<element name="name" type="string"></element>
<element name="id" type="string"></element>
<element name="contact" type="string"></element>
</sequence>
</complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="addCustomerRequest">
<wsdl:part element="tns:addCustomerReqEl" name="parameters" />
</wsdl:message>
<wsdl:message name="addCustomerResponse">
<wsdl:part element="tns:addCustomerRespEl" name="parameters" />
</wsdl:message>
<wsdl:portType name="CustomerService">
<wsdl:operation name="addCustomer">
<wsdl:input message="tns:addCustomerRequest" />
<wsdl:output message="tns:addCustomerResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="CustomerServiceSOAP" type="tns:CustomerService">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="addCustomer">
<soap:operation soapAction="urn:CustomerService/addCustomer" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="CustomerService">
<wsdl:port binding="tns:CustomerServiceSOAP" name="CustomerServiceSOAP">
<soap:address location="http://www.example.org/" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>