- From: Jonathan Marsh <jmarsh@microsoft.com>
- Date: Tue, 23 May 2006 12:53:54 -0700
- To: <www-ws-desc@w3.org>
- Message-ID: <37D0366A39A9044286B2783EB4C3C4E802B347E2@RED-MSG-10.redmond.corp.microsoft.com>
[Random keystroke sent it too early, and then got interrupted by hours of telcons - completed below.] ________________________________ From: Jonathan Marsh Sent: Tuesday, May 23, 2006 10:07 AM To: 'Arthur Ryman' Cc: www-ws-desc@w3.org; www-ws-desc-request@w3.org Subject: RE: Component Values Must Be Context Independent OK, just trying to understand the terminology. The spec doesn't use the term "child component". It does use the term "nested components" which are non-top-level components (e.g. any component but Description, Interface, Binding, Service, Element Declaration, and Type Definition.) 2.17 for instance talks about "references to other components" but doesn't really define the term, which you seem to be specializing into "child" and "non-child" components. So, a child component property is a) A property of component X, b) with a value of a component, set of components, or list of components, c) where each of the components in (b) having a parent property, d) and where each of these parent property has a value of component X. Is that right? The reason for trying to get clarity here is that we haven't distinguished between properties that contain components "by value" and those that contain components "by reference", which is IMO an implementation choice. We chose one strategy for serializing the graph as a tree for the interchange format but that's just one choice. Is the categorization below correct? Another observation: comparing the value of the "value" property involves an infoset comparison, about which I don't see anything in 2.17. Child component property Non-component property Non-child component property (properties missing from the table below) interface operation | Binding Operation.{interface operation} binding message references | Binding Operation.{binding message references} binding fault reference | Binding Operation.{binding fault references} Interface message references | Binding Message Reference.{interface message references} Interface fault reference | Binding Fault Reference.{interface fault reference} Property Where Defined address Endpoint.{address <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Endpoint.address> } binding Endpoint.{binding <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Endpoint.binding> } binding faults Binding.{binding faults <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Binding.bindingfaults> } binding operations Binding.{binding operations <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Binding.bindingoperations> } bindings Description.{bindings <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Description.bindings> } direction Interface Fault Reference.{direction <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFaultReference.direction> }, Interface Message Reference.{direction <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceMessageReference.direction> } element declaration Interface Fault.{element declaration <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFault.elementdeclaration> }, Interface Message Reference.{element declaration <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceMessageReference.elementdeclaration> } element declarations Description.{element declarations <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Description.elementdeclarations> } endpoints Service.{endpoints <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Service.endpoints> } extended interfaces Interface.{extended interfaces <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Interface.extendedinterfaces> } features .{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-.features> }, Binding.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Binding.features> }, Binding Fault.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingFault.features> }, Binding Fault Reference.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingFaultReference.features> }, Binding Message Reference.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingMessageReference.features> }, Binding Operation.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingOperation.features> }, Endpoint.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Endpoint.features> }, Interface.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Interface.features> }, Interface Fault.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFault.features> }, Interface Fault Reference.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFaultReference.features> }, Interface Message Reference.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceMessageReference.features> }, Interface Operation.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceOperation.features> }, Service.{features <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Service.features> } interface Binding.{interface <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Binding.interface> }, Service.{interface <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Service.interface> } interface fault Binding Fault.{interface fault <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingFault.interfacefault> }, Interface Fault Reference.{interface fault <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFaultReference.interfacefault> } interface fault references Interface Operation.{interface fault references <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceOperation.interfacefaultreferences> } interface faults Interface.{interface faults <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Interface.interfacefaults> } interface message references Interface Operation.{interface message references <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceOperation.interfacemessagereferences> } interface operations Interface.{interface operations <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Interface.interfaceoperations> } interfaces Description.{interfaces <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Description.interfaces> } message content model Interface Message Reference.{message content model <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceMessageReference.messagecontentmodel> } message exchange pattern Interface Operation.{message exchange pattern <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceOperation.messageexchangepattern> } message label Interface Fault Reference.{message label <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFaultReference.messagelabel> }, Interface Message Reference.{message label <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceMessageReference.messagelabel> } name .{name <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-.name> }, Binding.{name <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Binding.name> }, Element Declaration.{name <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-ElementDeclaration.name> }, Endpoint.{name <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Endpoint.name> }, Interface.{name <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Interface.name> }, Interface Fault.{name <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFault.name> }, Interface Operation.{name <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceOperation.name> }, Service.{name <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Service.name> }, Type Definition.{name <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-TypeDefinition.name> } parent .{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-.parent> }, Binding Fault.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingFault.parent> }, Binding Fault Reference.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingFaultReference.parent> }, Binding Message Reference.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingMessageReference.parent> }, Binding Operation.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingOperation.parent> }, Endpoint.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Endpoint.parent> }, Feature.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Feature.parent> }, Interface Fault.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFault.parent> }, Interface Fault Reference.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFaultReference.parent> }, Interface Message Reference.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceMessageReference.parent> }, Interface Operation.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceOperation.parent> }, Property.{parent <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Property.parent> } properties .{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-.properties> }, Binding.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Binding.properties> }, Binding Fault.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingFault.properties> }, Binding Fault Reference.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingFaultReference.properties> }, Binding Message Reference.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingMessageReference.properties> }, Binding Operation.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-BindingOperation.properties> }, Endpoint.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Endpoint.properties> }, Interface.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Interface.properties> }, Interface Fault.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFault.properties> }, Interface Fault Reference.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceFaultReference.properties> }, Interface Message Reference.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceMessageReference.properties> }, Interface Operation.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceOperation.properties> }, Service.{properties <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Service.properties> } ref Feature.{ref <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Feature.ref> }, Property.{ref <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Property.ref> } required Feature.{required <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Feature.required> } services Description.{services <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Description.services> } style Interface Operation.{style <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-InterfaceOperation.style> } system Element Declaration.{system <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-ElementDeclaration.system> }, Type Definition.{system <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-TypeDefinition.system> } type Binding.{type <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Binding.type> } type definitions Description.{type definitions <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Description.typedefinitions> } value Property.{value <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Property.value> } value constraint Property.{value constraint <http://dev.w3.org/cvsweb/~checkout~/2002/ws/desc/wsdl20/wsdl20.html#pro perty-Property.valueconstraint> } ________________________________ From: Arthur Ryman [mailto:ryman@ca.ibm.com] Sent: Tuesday, May 23, 2006 8:57 AM To: Jonathan Marsh Cc: www-ws-desc@w3.org; www-ws-desc-request@w3.org Subject: RE: Component Values Must Be Context Independent Jonathan, Yes, there is a {parent} property for each child component. The idea is that to compute equivalence, you look at the non-reference properties and the child components. You compare the reference properties by value, i.e. don't traverse into the referenced component if it is not a child. This let's you compute equivalence based on the contents of the document that contains the enclosing top-level component, i.e. you don't have to look at other documents. Arthur Ryman, IBM Software Group, Rational Division blog: http://ryman.eclipsedevelopersjournal.com/ 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 "Jonathan Marsh" <jmarsh@microsoft.com> Sent by: www-ws-desc-request@w3.org 05/22/2006 08:20 PM To Arthur Ryman/Toronto/IBM@IBMCA, <www-ws-desc@w3.org> cc Subject RE: Component Values Must Be Context Independent Can you explain a bit more the difference between so-called "child components" and "non-child components"? I couldn't find these distinguished clearly in the spec. Do you just mean the parent property? ________________________________ From: www-ws-desc-request@w3.org [mailto:www-ws-desc-request@w3.org] On Behalf Of Arthur Ryman Sent: Thursday, April 20, 2006 4:20 PM To: www-ws-desc@w3.org Subject: Component Values Must Be Context Independent Components can be brought into a component model instance through <import> and <include>. For scalability purposes, it is highly desirable for the value of a component to be independent of the context that it was brought it. The use case is a development tool for SOA applications that needs to support hundreds or thousands of services. The tool needs to validate the service definitions. The requirement is that the time to do this be linear. We are currently experiencing performance problems validating large sets of WSDL 1.1 documents. We need to have an spec-compliant optimization for WSDL 2.0. Ideally, a tool should be able to compute the components directly defined in a document without looking at any of the imports or includes. There are two problems now that prevent this: 1. In theory, we allow extensions that could alter the semantics of imported or included components. However, there is no requirement or use case for this flexibility, much less a realistic, compelling one. Note that this is actually a real problem in XML Schema, e.g. due to "features" such as cameleon includes, and <redefine>, you need to know the context in which a document is included. 2. The current definition of component equivalence is recursive in the sense that to test if two components are equivalent, it is necessary to determine if all of the components they refer to are equivalent. In effect this means that you have to construct the entire component model instance in order to resolve the references to the other components. Since WSDL documents typically include or import others, a collection of WSDL documents is likely to be moderately connected when viewed as a graph. Therefore, when you validate the collection, you end up processing a given document many times in general. You process it a number of times equal to the number of documents that refer to it directly or indirectly (+ 1). This is non-linear. The exact degree of non-linearity depends on how connected the graph is. Consider a simple chain of n WSDL documents. A1 includes A2 includes A3 includes ... An Validating A1 requires reading n documents. Validating A2 requires reading n-1 documents. ... Validating An requires reading 1 document. Therefore validating the whole set of documents requires readiing n + (n-1) + ... + 1 = n(n+1)/2 = O(n^2), i.e. this is quadratic, not linear. On the other hand, if the meaning if each document is independent of how it is used then a smart tool could cache the results and only read n documents. The fix is as follows: 1. Add the following assertion. An extension MUST NOT affect the value of components that are added to the component model via <import> or <include>. 2. State the definition of component equivalence as follows. Two components are equivalent when: A) All of their child components are equivalent. B) All of their non-component properties are equal. C) All of their non-child component properties refer to components that have the same keys (e.g. names). The difference is that to test for equivalence, you only have to look at a component's value-based properties and child components. You don't have to traverse the component graph, which might take you into another document. You only have to compare referred to components via their keys. We then add a statement to each component explicitly stating what its key values are. This is straight-forward. We already implicitly defined keys when stating uniqueness rules, i.e. each Interface component in a Description component must have a unique {name}. The key is usually the {name} property. For Features and Properties, it is the {ref} property. The complete list is: 1. ElementDeclaration: {name} 2. TypeDefinition: {name} 3. Interface: {name} 4. InterfaceFault: {name} 5. InterfaceOperation: {name} 6. InterfaceMessageReference: {message label} 7. InterfaceFaultReference: {interface fault}.{name}. {message label} 8. Binding: {name} 9. BindingFault: {interfaceFault}.{name} 10. BindingOperation: {interfaceOperation}.{name} 11. BindingMessageReference: {interface message reference}.{message label} 12. BindingFaultReference: {interface fault reference}.{interface fault}.{name}, {interface fault reference}.{message label} 13 Service: {name} 14. Endpoint: {name} 15. Feature: {ref} 16. Property: {ref} In general, any extension component that might be refered to needs to define a key value, since that is how the reference is represented in the XML serialization. Arthur Ryman, IBM Software Group, Rational Division blog: http://ryman.eclipsedevelopersjournal.com/ 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
Received on Tuesday, 23 May 2006 19:54:55 UTC