Re: Counterproposal for service references

I think it is healty to present this to this group. I believe that late 
binding of "binding "information can not be addressed appropriately with 
our (IBM, Oracle, Sonic) previous proposal either that we presented in 
the last f2f. This is my response to Roberto's proposal [2] which I 
originally sent to  Roberto, Glen and Arthur and I would like to presend 
in light of Arthur's objections [3]. I don't believe using the 
wsdl:reference element is the best solution either, but has its uses for 
assigning a single binding information to a reference when WSDL is built 
in stages and binding is assigned later on during the development to a
service reference.

This is a reconciliation proposal that I think will accomodate 
everybody. I copy it verbatim.

--umit

[2] http://lists.w3.org/Archives/Public/www-ws-desc/2003Oct/0345.html
[3] http://lists.w3.org/Archives/Public/www-ws-desc/2003Nov/0041.html

-------------------------------------------------------------------

We have three cases that we need to support for web service references:

(1) fully static (interface and binding are known)
(2) semi static (interface is known)
(3) dynamic (nothing is known about the reference, except the fact that
the message contains a reference). 


-- WSDL designates a reference type for designating a service reference.
There are two base types that are covered by WSDL:

(a) wsdl:Service. This type and all types derived from it is applicable
and recognized as a reference type. 

(b) xsd:anyURI. 

(c) Any other type. 

Roberto/Glen proposal introduces the following attributes three
attributes in wsdlx namespace. (now where is my repository so that I
can pinpoint to the proposal by a reference :-))

a1. <xs:attribute name="interface" type="xs:QName" use="required"/>

a2. <xs:attribute name="binding" type="xs:QName" use="required"/>
         
a3. <xs:attribute name="serviceReference" use="required" fixed="true"/>

	P1. I propose that we use only the wsdl namespace for defining
	new types/attributes. This is not an extension. 

	P2. I propose we eliminate a3 as it is not required at all. If
	we have a type derived from (a-c) and they either use the
	attributes (a1-a2) which designates the type to be a
	reference, or they don't. The presence of the other
	indicators, such as declaration of interface and/or binding
	tells us that they are a reference. For wsdl:Service type
	derivations, I don't understand the value of it and I propose
	we omit it.

	P3. I propose WSDL to adopt a global "interface" attribute in
	sync with Roberto/Glen proposal.  Here is my reasoning.

We have three cases, 1-3, 

b. xs:anyURI derivations. This can be used only with case 1. 

We require that each a new type is derived from the interface anyway. (IBM/Oracle proposal) [1] as follows

<xs:simpleType name="ManagerReference">
	<xs:restriction type="xs:anyURI"/>
</xs:simpleType>

the number of additional schema types is equivalent to the number of referenced interfaces and bindings. 

This is also true with the Roberto/Glen approach: 

<xs:complexType name="ManagerReference">
     <xs:simpleContent>
       <xs:extension base="xsd:anyURI">
         <xs:attribute name="interface" type="tns:ManagerInterface" 
             use="required"/>
     </xs:extension>
    </xs:simpleContent>
</xs:complexType>

<xs:complexType>
 
This does not bother me, because at the abstract level of WSDL you
need to define a separate schema type for each type. From this
perspective, whether you define this separately as we proposed in [1]
or as in the new proposal does not matter. You end up having exactly
the same number of new derived types for each interface. Further, my
argument is that even if one may be designing their WSDL in several
stages, first abstract types, and then binding, then endpoint
addresses for deployment, designing the WSDL and the data types belong
to the same stage in development. 

From the schema processors point of view, there are additional derived
types to deal with. I can see one particular advantage with the
Roberto/Glen proposal. This is because a special hint for PSVI step is
present in the schema with the presence of this attribute and its
value. This is not true in our proposal [1]. I consider this
equivalent to having a schema annotation. However, we should also propose 
the following change to WSDL schema: 

	P4: The current WSDL schema should be changed to use the 
	attribute defined by P3 in the defn of wsdl:Service type. In
	this manner, the attribute defn is used consistently
	everywhere.

a. wsdl:Service: As I am lead to believe that we need to specify this
with a restriction. Yet Roberto/Glen proposal is by schema
extension. I think this is a typo.

For each type of reference indicated by the interface of the service
and there needs to be a one-to-one mapping. With P4, wsdl:Service type
can further restrict the type as a fixed value.  I really like this
because we use full facility of the schema. Further, P4 allows reusing
the same attribute defn both for URIs and in wsdl:Service type.

Summary: I propose that we utilize the global attribute declarations
which should be part of the wsdl schema as part of declaring the
interface with P1-P4.

Contentious Issue: Declaration of the binding. (a2) !!!

Roberto/Glen propose that we do this by using the attribute a2. In
[1], we have used wsdl:reference element to do exactly the same thing. 

Arthur argues that it is not a great idea to combine the binding
information in the schema as binding can be declared independent of
the abstract level development (Arthur don't want to represent you
incorrectly, but this is my assessment). 

Arthur has one valid point. For example, if I develop my abstract
layer in WSDL using the techniques described above, I will be ending
up with 

<xs:simpleType name="ClaimsDeptReference">
	<xs:restriction type="xs:anyURI"/>
</xs:simpleType>


<interface name="PatientRecords">
   <operation name="findPatientsClaimDept" pattern="...">
    <input messageReference=".." body="tns:patientClaimsInquiry"/>
    <output messageReference=".."   body="tns:ClaimsDeptReference"/>
   </operation>
</interface> 

in my schema, and some other party who declares the binding can assign 
the binding of choice later in the binding section of WSDL by using 
wsdl:reference element. 

However, I observe that this only works when you know in advance that
you will always have one binding, not more. This is because the
reference in the message can not be associated with more than one
binding in the fully static case (1). This is a problem for URI
derived types, because I can not assign two different bindings,
i.e. SMTP and SOAP/HTTP binding to the same interface at the same
time. One schema type is the placeholder for one binding, nothing more
nothing less. As a result, I will have to do the following:

<xs:simpleType name="ClaimsDeptReference">
	<xs:restriction type="xs:anyURI"/>
</xs:simpleType>

<xs:simpleType name="ClaimsDeptEmailReference">
	<xs:restriction type="xs:anyURI"/>
</xs:simpleType>


<interface name="PatientRecords">
   <operation name="findPatientsClaimDept">
    <input messageR.. body="tns:patientClaimsInquiry"/>
    <output message   body="tns:ClaimsDeptReference"/>
   </operation>
   
  <operation name="findPatientsClaimDeptForEmail">
    <input messageR.. body="tns:patientClaimsInquiry"/>
    <output message   body="tns:ClaimsDeptEmailReference"/>
   </operation>
</interface> 

(I know that this modification is against what I proposed with R2004
as the same input element is used with two different operations, but
lets forget this for a moment as it is not relevant for this
discussion. :-))

The binding for operations, findPatientsClaimDept and
findPatientsClaimDeptForEmail will have two different wsdl:reference
elements, first for tns:ClaimsDeptEmailReference and the other for
tns:ClaimsDeptReference.

At the abstract layer I had to modify my interface and add schema
types to accomodate this case.

This is NOT different than what Roberto/Glen is proposing, because in
that case, an interface and the binding will be part of the schema and
you will end up with the same number of schema types. 

So regardless of what we do in associating the binding with the type,
we end up with the same number of types and further the interface
needs to be modified. Note that this is true for problem (1) and using type
(b). When we use type (a) wsdl:Service, we don't have to modify the
interface, we can omit the declaration of the binding altogether and
it works.

One argument in favor of leaving wsdl:reference declarations is that
the case I am presenting may not be too common, and folks who will use
URIs care about HTTP binding only. Even if this is the case, I am in
favor of reuse. So having said all this, I came to the conclusion that 
we should allow both methodologies with the following modifications: 

	P5: We introduce the global attribute a2 into the WSDL
	schema. (This is not global right now, but used in the schema
	in a local declaration). We also change the defn of
	wsdl:Service type to use this new attribute.

        P6: We change the definition of wsdl:reference to utilize P5. 
	<wsdl:reference type="xs:Qname" wsdl:binding=.../>. This
	element is allowed to be used with reference to types other than
	wsdl:Service.

	P7: WSDL/Schema authors are allowed to use wsdl:binding
	attribute in their schema to annotate the binding that they
	require. (per Roberto/Glen proposal). 

The caveat is of course you can use either P6 or P7, but not both. 

Arthur, I know you are in favor of declaring everything in wsdl but I
believe this solution addresses your concern. Roberto/Glen i am well
aware that you would like to solve the problem entirely in Schema,
however this approach namely P5-P6, solves the problem of adding
binding information when WSDL is not developed in its entirety. I know
that you guys prefer an option where wsdl:reference elements were
completely removed, but this will cover the cases that I believe
Arthur is concerned about. 

None of the approaches are clean, as they all require introducing
additional types as there are interface+binding pairs as far as static
definition of references are concerned. I observe that wsdl:Service
type does not have this problem. Again, for the sake of addressing the
needs of URI/REST community, I am comfortable with this compramise. 

If all of us agree with points, except P6, I request thinking
through whether you could live with a not-to-perfect-but-ok solution
from your perspectives and let me know what you think. I fear that
otherwise we will end up having no solution in WSDL 2.0 for
references, which is a bad idea. 

I can live with P6 and/or P7.  I note again that this will be only
necessary for URI (and perhaps other types), but not wsdl:Service. So
it is optional. 

I will not be in favor of any solution which does not include wsdl:Service. 

If you have noted, I am in favor of NOT introducing a derived type
from wsdl:Service, and/or anyURI. This is because of my views in
P2. Frankly, I also think that it will get more resistence from the
wg. 


[1] http://lists.w3.org/Archives/Public/www-ws-desc/2003Sep/att-0187/example3a-1.txt
-------------------------------------------------------------------

We have three cases that we need to support for web service references:

(1) fully static (interface and binding are known)
(2) semi static (interface is known)
(3) dynamic (nothing is known about the reference, except the fact that
the message contains a reference). 


-- WSDL designates a reference type for designating a service reference.
There are two base types that are covered by WSDL:

(a) wsdl:Service. This type and all types derived from it is applicable
and recognized as a reference type. 

(b) xsd:anyURI. 

(c) Any other type. 

Roberto/Glen proposal introduces the following attributes three
attributes in wsdlx namespace. (now where is my repository so that I
can pinpoint to the proposal by a reference :-))

a1. <xs:attribute name="interface" type="xs:QName" use="required"/>

a2. <xs:attribute name="binding" type="xs:QName" use="required"/>
         
a3. <xs:attribute name="serviceReference" use="required" fixed="true"/>

	P1. I propose that we use only the wsdl namespace for defining
	new types/attributes. This is not an extension. 

	P2. I propose we eliminate a3 as it is not required at all. If
	we have a type derived from (a-c) and they either use the
	attributes (a1-a2) which designates the type to be a
	reference, or they don't. The presence of the other
	indicators, such as declaration of interface and/or binding
	tells us that they are a reference. For wsdl:Service type
	derivations, I don't understand the value of it and I propose
	we omit it.

	P3. I propose WSDL to adopt a global "interface" attribute in
	sync with Roberto/Glen proposal.  Here is my reasoning.

We have three cases, 1-3, 

b. xs:anyURI derivations. This can be used only with case 1. 

We require that each a new type is derived from the interface anyway. (IBM/Oracle proposal) [1] as follows

<xs:simpleType name="ManagerReference">
	<xs:restriction type="xs:anyURI"/>
</xs:simpleType>

the number of additional schema types is equivalent to the number of referenced interfaces and bindings. 

This is also true with the Roberto/Glen approach: 

<xs:complexType name="ManagerReference">
     <xs:simpleContent>
       <xs:extension base="xsd:anyURI">
         <xs:attribute name="interface" type="tns:ManagerInterface" 
             use="required"/>
     </xs:extension>
    </xs:simpleContent>
</xs:complexType>

<xs:complexType>
 
This does not bother me, because at the abstract level of WSDL you
need to define a separate schema type for each type. From this
perspective, whether you define this separately as we proposed in [1]
or as in the new proposal does not matter. You end up having exactly
the same number of new derived types for each interface. Further, my
argument is that even if one may be designing their WSDL in several
stages, first abstract types, and then binding, then endpoint
addresses for deployment, designing the WSDL and the data types belong
to the same stage in development. 

From the schema processors point of view, there are additional derived
types to deal with. I can see one particular advantage with the
Roberto/Glen proposal. This is because a special hint for PSVI step is
present in the schema with the presence of this attribute and its
value. This is not true in our proposal [1]. I consider this
equivalent to having a schema annotation. However, we should also propose 
the following change to WSDL schema: 

	P4: The current WSDL schema should be changed to use the 
	attribute defined by P3 in the defn of wsdl:Service type. In
	this manner, the attribute defn is used consistently
	everywhere.

a. wsdl:Service: As I am lead to believe that we need to specify this
with a restriction. Yet Roberto/Glen proposal is by schema
extension. I think this is a typo.

For each type of reference indicated by the interface of the service
and there needs to be a one-to-one mapping. With P4, wsdl:Service type
can further restrict the type as a fixed value.  I really like this
because we use full facility of the schema. Further, P4 allows reusing
the same attribute defn both for URIs and in wsdl:Service type.

Summary: I propose that we utilize the global attribute declarations
which should be part of the wsdl schema as part of declaring the
interface with P1-P4.

Contentious Issue: Declaration of the binding. (a2) !!!

Roberto/Glen propose that we do this by using the attribute a2. In
[1], we have used wsdl:reference element to do exactly the same thing. 

Arthur argues that it is not a great idea to combine the binding
information in the schema as binding can be declared independent of
the abstract level development (Arthur don't want to represent you
incorrectly, but this is my assessment). 

Arthur has one valid point. For example, if I develop my abstract
layer in WSDL using the techniques described above, I will be ending
up with 

<xs:simpleType name="ClaimsDeptReference">
	<xs:restriction type="xs:anyURI"/>
</xs:simpleType>


<interface name="PatientRecords">
   <operation name="findPatientsClaimDept" pattern="...">
    <input messageReference=".." body="tns:patientClaimsInquiry"/>
    <output messageReference=".."   body="tns:ClaimsDeptReference"/>
   </operation>
</interface> 

in my schema, and some other party who declares the binding can assign 
the binding of choice later in the binding section of WSDL by using 
wsdl:reference element. 

However, I observe that this only works when you know in advance that
you will always have one binding, not more. This is because the
reference in the message can not be associated with more than one
binding in the fully static case (1). This is a problem for URI
derived types, because I can not assign two different bindings,
i.e. SMTP and SOAP/HTTP binding to the same interface at the same
time. One schema type is the placeholder for one binding, nothing more
nothing less. As a result, I will have to do the following:

<xs:simpleType name="ClaimsDeptReference">
	<xs:restriction type="xs:anyURI"/>
</xs:simpleType>

<xs:simpleType name="ClaimsDeptEmailReference">
	<xs:restriction type="xs:anyURI"/>
</xs:simpleType>


<interface name="PatientRecords">
   <operation name="findPatientsClaimDept">
    <input messageR.. body="tns:patientClaimsInquiry"/>
    <output message   body="tns:ClaimsDeptReference"/>
   </operation>
   
  <operation name="findPatientsClaimDeptForEmail">
    <input messageR.. body="tns:patientClaimsInquiry"/>
    <output message   body="tns:ClaimsDeptEmailReference"/>
   </operation>
</interface> 

(I know that this modification is against what I proposed with R2004
as the same input element is used with two different operations, but
lets forget this for a moment as it is not relevant for this
discussion. :-))

The binding for operations, findPatientsClaimDept and
findPatientsClaimDeptForEmail will have two different wsdl:reference
elements, first for tns:ClaimsDeptEmailReference and the other for
tns:ClaimsDeptReference.

At the abstract layer I had to modify my interface and add schema
types to accomodate this case.

This is NOT different than what Roberto/Glen is proposing, because in
that case, an interface and the binding will be part of the schema and
you will end up with the same number of schema types. 

So regardless of what we do in associating the binding with the type,
we end up with the same number of types and further the interface
needs to be modified. Note that this is true for problem (1) and using type
(b). When we use type (a) wsdl:Service, we don't have to modify the
interface, we can omit the declaration of the binding altogether and
it works.

One argument in favor of leaving wsdl:reference declarations is that
the case I am presenting may not be too common, and folks who will use
URIs care about HTTP binding only. Even if this is the case, I am in
favor of reuse. So having said all this, I came to the conclusion that 
we should allow both methodologies with the following modifications: 

	P5: We introduce the global attribute a2 into the WSDL
	schema. (This is not global right now, but used in the schema
	in a local declaration). We also change the defn of
	wsdl:Service type to use this new attribute.

        P6: We change the definition of wsdl:reference to utilize P5. 
	<wsdl:reference type="xs:Qname" wsdl:binding=.../>. This
	element is allowed to be used with reference to types other than
	wsdl:Service.

	P7: WSDL/Schema authors are allowed to use wsdl:binding
	attribute in their schema to annotate the binding that they
	require. (per Roberto/Glen proposal). 

The caveat is of course you can use either P6 or P7, but not both. 

Arthur, I know you are in favor of declaring everything in wsdl but I
believe this solution addresses your concern. Roberto/Glen i am well
aware that you would like to solve the problem entirely in Schema,
however this approach namely P5-P6, solves the problem of adding
binding information when WSDL is not developed in its entirety. I know
that you guys prefer an option where wsdl:reference elements were
completely removed, but this will cover the cases that I believe
Arthur is concerned about. 

None of the approaches are clean, as they all require introducing
additional types as there are interface+binding pairs as far as static
definition of references are concerned. I observe that wsdl:Service
type does not have this problem. Again, for the sake of addressing the
needs of URI/REST community, I am comfortable with this compramise. 

If all of us agree with points, except P6, I request thinking
through whether you could live with a not-to-perfect-but-ok solution
from your perspectives and let me know what you think. I fear that
otherwise we will end up having no solution in WSDL 2.0 for
references, which is a bad idea. 

I can live with P6 and/or P7.  I note again that this will be only
necessary for URI (and perhaps other types), but not wsdl:Service. So
it is optional. 

I will not be in favor of any solution which does not include wsdl:Service. 

If you have noted, I am in favor of NOT introducing a derived type
from wsdl:Service, and/or anyURI. This is because of my views in
P2. Frankly, I also think that it will get more resistence from the
wg. 


[1] http://lists.w3.org/Archives/Public/www-ws-desc/2003Sep/att-0187/example3a-1.txt

Received on Wednesday, 5 November 2003 13:56:15 UTC