Hello Ian, thank you very much for answering so detailed to my WS-RF-newbie-questions. It clarifies a lot
the use of document-literal message-style in the WS-RF and Web Services in general. Regarding question #1: I believe, the use of inputs with zero parts is useful especially in case of WS-RF. As the WS-Resource we talk to is identified by wsa:ReferenceProperties(until yet, we'll see what the RefProp-Removal-Discussion will bring), we can send messages to a service using this identified WS-Resource without the need of any other parameter. An example could be: An E-Shop provides a ShoppingCart as WS-Resource. The ShoppingCart can be created, modified(adding,deleting articles), destroyed and finally ordered. Asuming the creation-operation of a ShoppingCart-Resource takes the customer-identity as a parameter and the stateful resource is bound to the identified customer after creation - say by a ResourceProperty "eshop:customerID". There would be no need for providing any other information to the ShoppingCart.order() - operation. (I'm not sure, if this is a real-world example, as normally a ShoppingCart is created without identifying the customer. The binding to the ordering customer is m,ost often done at ordertime (see amazon).) But I believe, it's a question of modeling the underlying workflow. At the moment, a developer has no chance to model the example described above with the WS-RF. Regarding question #2: I have seen the methodNameMap in the generated AbractService-Class and understand the mapping to service-operation a lot better now. Regarding the EPR-RefProp removal-discussion: I believe, the use of ReferenceParameters is as good as the use of ReferenceProperties for identifying the underlying stateful resource in WS-RF as long as the EPR-Parameters are not used for providing parameters to a Web Service - operation, because if this happens we are mixing data for the stateless web service with informations of the underlying WS-RF-infrastructure. I hope there will be no larger changes necessary to the WS-RF-Framework. Because at the moment I'm writing my master-thesis about "Modeling and Automating stateful Resources" - including the modeling of software, hardware and workflow(BPEL)-processes as WS-Resources to provide an automated infrastructure for so called "On Demand - Business". And my way to go for the implementation-part seems to be the WS-RF-project :-). Regards Michael > Hello Michael, > > I apologize for not getting back to you earlier. > > Regarding question #1, the reason we don't allow more than one part within > a message is because, in the tradition of the Globus WSRF/WSN impl, we are > requiring conformance to the WS-I Basic Profile 1.1 [1], which says the > following: > > R2204 A document-literal binding in a DESCRIPTION MUST refer, in each of > its soapbind:body element(s), only to wsdl:part element(s) that have been > defined using the element attribute. > > Since a WSRF Web service consists of one "most-derived" portType and a > corresponding binding, and all of the parts for the WSRF spec-defined > operations are defined using the 'element' attribute, the most-derived > binding is necessarily a document-literal binding, which WS-I defines as > "a wsdl:binding element whose child wsdl:operation elements are all > document-literal operations." > > WS-I also says: > > R2210 If a document-literal binding in a DESCRIPTION does not specify the > parts attribute on a soapbind:body element, the corresponding abstract > wsdl:message MUST define zero or one wsdl:parts. > > Because our most-derived binding is necessarily a doc-lit binding, the > messages it references must contain zero or one parts. So, Apollo's > Wsdl2Java should be permitting either zero or one parts (right now, it is > only accepting one). I'm not sure what the value of having an input or an > output with zero parts would be, but I guess there must be some use case > for it. > > Regarding question #2, WS-I section 4.7.6 says: > > " > The profile defines the "operation signature" to be the fully qualified > name of the child element of SOAP body of the SOAP input message described > by an operation in a WSDL binding. > > In the case of rpc-literal binding, the operation name is used as a > wrapper for the part accessors. In the document-literal case, since a > wrapper with the operation name is not present, the message signatures > must be correctly designed so that they meet this requirement. > > An endpoint that supports multiple operations must unambiguously identify > the operation being invoked based on the input message that it receives. > This is only possible if all the operations specified in the wsdl:binding > associated with an endpoint have a unique operation signature. > > R2710 The operations in a wsdl:binding in a DESCRIPTION MUST result in > operation signatures that are different from one another. > " > > So Apollo Wsdl2Java should not be allowing two operations that reference > the same element for their inputs. However, it should be aborting with an > error message instead of silently ignoring the second operation. I will > work on fixing this next week. > > Hopefully, this makes some sense. Let me know what you think. > > Regards, > Ian > > [1] http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html > > Michael Marks wrote: > > Hi, > > > > today I've got two problems concerning wsdl-interpretation during > generation > > of the Java(-Service-)Classes with the wsdl2JavaTask of apollo. > > > > First Question: > > > > If my wsdl-file contains message-elements with zero or more then one > > part-elements, a runtime-exception is thrown by the class OperationInfo, > > saying "Wsdl input element should have exactly one part.". > > WSDL1.1 specifies the number of part-elements in a message-elements with > "*" > > meaning zero till unbounded. > > > > If I encapsulate the part-elements in a new element and use this in the > > message-declaration, everything works fine. > > It seems the implementation differs in that point to the wsdl > > 1.1-specification. Is that so? Why is that so? > > > > example: > > <types> > > <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > > targetNamespace="http://bookstore.com/ShoppingCart" > > xmlns="http://www.w3.org/2001/XMLSchema" > > xmlns:tns="http://bookstore.com/ShoppingCart" > > > > > xmlns:wsrl="http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceLifetime-1.2-draft-01.xsd" > > > > > xmlns:wsbf="http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-BaseFaults-1.2-draft-01.xsd" > > elementFormDefault="qualified"> > > > > <xs:element name="CustomerId" type="xs:string"/> > > <xs:element name="CustomerIdCreateCart" type="xs:string"/> > > > <xs:element name="CustomerIdOrderCart" type="xs:string"/> > > > <xs:element name="ProductId" type="xs:string"/> > > <xs:element name="Price" type="xs:int"/> > > <xs:element name="Quantity" type="xs:int"/> > > <xs:element name="ArticleOrder"> > > <xs:complexType> > > <xs:sequence> > > <xs:element ref="tns:ProductId"/> > > <xs:element ref="tns:Quantity"/> > > </xs:sequence> > > </xs:complexType> > > </xs:element> > > > > </xs:schema> > > </types> > > ... > > > > works fine > > ========= > > <message name="AddArticleRequest"> > > <part name="ArticleOrder" element="tns:ArticleOrder"/> > > </message> > > > > doesn't work > > ============= > > <message name="AddArticleRequest"> > > <part name="CustomerID" element="tns:CustomerId"/> > > <part name="Quantity" element="tns:Quantity"/> > > </message> > > > > > > > > > > > > > > > > Second Question: > > > > If a defined type-element is used in more then one messages for > different > > operations, only the last operation that uses the element in it's > > message-type is generated into the CustomerOperationsPortType. > > That means, i can't use defined type-elements more then one time and > have to > > define equivalent elements with an other, unique name. > > Why is that so? WSDL 1.1 don't specify such an restriction. > > > > example: > > > > (assuming the same type definitions as in the example for the first > > question) > > > > doesn't work > > ============= > > message-definitions: > > > > <message name="CreateCartRequest"> > > <part name="CustomerId" element="tns:CustomerId"/> > > </message> > > > > <message name="CreateCartResponse"> > > <part name="Created" element="xs:boolean"/> > > </message> > > > > ... > > > > <message name="OrderCartRequest"> > > <part name="CustomerId" element="tns:CustomerId"/> > > </message> > > > > <message name="OrderCartResponse"> > > <part name="TotalPrice" element="tns:Price"/> > > </message> > > > > operations-definitions: > > > > <operation name="CreateCart"> > > <input message="tns:CreateCartRequest"/> > > <output message="tns:CreateCartResponse"/> > > </operation> > > > > ... > > > > <operation name="OrderCart"> > > <input message="tns:OrderCartRequest"/> > > <output message="tns:OrderCartResponse"/> > > </operation> > > > > result: > > > > only the createCart-Operation is provided in the generated > > MyServiceCustomOperationsPortType.java, the orderCart-Operation is lost. > > > > > > works fine > > ============= > > message-definitions: > > > > <message name="CreateCartRequest"> > > <part name="CustomerId" element="tns:CustomerIdCreateCart"/> > > </message> > > > > <message name="CreateCartResponse"> > > <part name="Created" element="xs:boolean"/> > > </message> > > > > ... > > > > <message name="OrderCartRequest"> > > <part name="CustomerId" element="tns:CustomerIdOrderCart"/> > > </message> > > > > <message name="OrderCartResponse"> > > <part name="TotalPrice" element="tns:Price"/> > > </message> > > > > operations-definitions: > > > > <operation name="CreateCart"> > > <input message="tns:CreateCartRequest"/> > > <output message="tns:CreateCartResponse"/> > > </operation> > > > > ... > > > > <operation name="OrderCart"> > > <input message="tns:OrderCartRequest"/> > > <output message="tns:OrderCartResponse"/> > > </operation> > > > > result: > > > > both operations are provided in the generated > > MyServiceCustomOperationsPortType.java > > > > > > Any ideas? > > > > Thank You > > Michael > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
