- From: Arthur Ryman <ryman@ca.ibm.com>
- Date: Mon, 28 Mar 2005 16:42:24 -0500
- To: www-ws-desc@w3.org
- Message-ID: <OFED768ADA.5136FCC4-ON85256FD2.00740D8D-85256FD2.00773B5B@ca.ibm.com>
In the process of writing the Primer section on Service References, I have
found a problem in the solution we adopted. The context of this topic is
that some services may reference to other services, and we were defining a
way that WSDL could be used to describe the interface and binding of the
service that was being refered to.
Recall that the we decided to go with Roberto's counter-proposal [1] which
was based on the idea of using XSD to restrict wsdl:ServiceType and
wsdl:Endpoint to have fixed values for @interface and @binding, and to
transmit service references using the restricted wsd:ServiceType.
If you just want to say that a message contains a reference to another
service and you don't want to contrains the interface or binding, then you
directly re-use the wsdl:ServiceType in the message.
If you want to describe the interface of the service, then you create a
new type that restricts the value of the @interface attribute to have a
fixed value which is the QName of the interface. This works, e.g.
If you also want to describe the binding of the service, then you create a
new type that restricts the value of the @binding attribute of
wsdl:EndpointType. You can do that, but there is no way you can actually
use this type to restrict the <wsdl:endpoint> element. Here is a sample.
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace=
"http://greath.example.com/2004/schemas/reservationDetails"
xmlns:tns=
"http://greath.example.com/2004/schemas/reservationDetails"
xmlns:wdetails=
"http://greath.example.com/2004/services/reservationDetails"
xmlns:wsdl="http://www.w3.org/2004/08/wsdl">
<import namespace="http://www.w3.org/2004/08/wsdl"
schemaLocation="wsdl20-1.xsd" />
<complexType name="ReservationDetailsEndpointType">
<complexContent>
<restriction base="wsdl:EndpointType">
<attribute name="binding" type="QName" use
="required"
fixed=
"wdetails:reservationDetailsSOAPBinding" />
</restriction>
</complexContent>
</complexType>
<complexType name="ReservationDetailsServiceType">
<complexContent>
<restriction base="wsdl:ServiceType">
<sequence>
<element name="endpoint"
type=
"tns:ReservationDetailsEndpointType" />
</sequence>
<attribute name="interface" type="QName"
use="required"
fixed=
"wdetails:reservationDetailsInterface" />
</restriction>
</complexContent>
</complexType>
</schema>
The problem is that within the <restriction> of wsdl:ServiceType, the
<element name="endpoint" ...> refers the QName tns:endpoint, not
wsdl:endpoint because we use elementFormDefault="qualified". This is
actually a valid restriction since the content model of wsdl:ServiceType
allows elements from other namespaces. However, this does not restrict the
wsdl:endpoint element to have the fixed binding value. FYI, here is a
chunk of a valid instance document according to this restricted service
type.
<reservation>
<details:confirmationNumber>HSG635</
details:confirmationNumber>
<details:checkInDate>2005-06-27</details:checkInDate>
<details:checkOutDate>2005-06-28</details:checkOutDate>
<details:reservationDetailsService
interface="wdetails:reservationDetailsInterface">
<details:endpoint name="SOAP"
binding=
"wdetails:reservationDetailsSOAPBinding"
address=
"http://greath.example.com/2004/reservation/HSG635"/>
</details:reservationDetailsService>
</reservation>
There is a fix however. The reason that we were able to restrict the
attribute values is that they are unqualified. Therefore, if we changed
our WSDL schema to use elementFormDefault="unqualified", and we ensured
that <endpoint> was a local element, then we could restrict it. However,
for consistency, we should probably also make the other nested elements
unqualified, i.e. just keep the top-level elements (<interface>,
<binding>, <service>, etc.) qualified. We can still have named complex
types for all the elements though.
Arthur Ryman,
Rational Desktop Tools Development
phone: +1-905-413-3077, TL 969-3077
assistant: +1-905-413-2411, TL 969-2411
fax: +1-905-413-4920, TL 969-4920
mobile: +1-416-939-5063, text: 4169395063@fido.ca
intranet: http://labweb.torolab.ibm.com/DRY6/
Received on Monday, 28 March 2005 21:42:56 UTC