Scenarios
Bottom Up
A: Client Reference -> interface.java -> Databinding(JAXB) -> binding.sca -> binding.sca -> Databinding(JAXB) -> interface.java -> Service -> implementation.java(local)
B: Client Reference -> interface.java -> Databinding(JAXB) -> binding.sca -> binding.sca -> Databinding(JAXB) -> interface.java -> Service -> implementation.java(@Remotable)
C: Client Reference -> interface.java -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.java -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
D C/MTOM: Client Reference -> interface.wsdl (doc/lit/wrapped) java -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> interface.wsdl(doc/lit/wrapped) SOAP/MTOM -> binding.ws -> interface.java -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
Top Down
ED: Client Reference -> interface.java wsdl (doc/lit/wrapped) -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.wsdl(doc/lit/wrapped) -> Databindng(Axiom) -> Databinding(JAXB) -> Service (@Remotable)
F: Client -> implementation.java(@Remotable)
D/MTOM: Reference -> interface.wsdl (doc/lit/wrapped) -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> SOAP/MTOM -> binding.ws -> interface.wsdl(doc/lit/wrapped) -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
E: Reference -> interface.java -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.wsdl(doc/lit/wrapped) -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
F: Reference -> interface.wsdl(doc/lit/wrapped) -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.java -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
G: Client Reference -> interface.wsdl (doc/lit/bare) -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.wsdl(doc/lit/bare) -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
H: Client Reference -> interface.java -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.wsdl(doc/lit/bare) -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> Service implementation.java(@Remotable)
I: Client Reference -> interface.wsdl(doc/lit/bare) -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.java -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
We should look at some binding.ws(portType), binding.ws(binding), binding.ws(port) scenarios also.
...
Support
Data Type | A | B | C | C ?wsdl | C/MTOM | D | D/MTOM | E | F | G | H | I | Notes | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PrimitiveTypes |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
boolean |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
byte |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
short |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
long |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
double |
|
|
|
| double |
|
|
|
|
|
|
|
| ||
Standard Types |
|
|
| Standard Types |
|
|
|
|
|
|
|
|
|
| |
java.lang.String |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
java.math.BigInteger |
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
java.math.BigDecimal |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
java.util.Calendar |
|
|
|
|
| |
|
|
|
|
|
|
| ||
java.util.Date |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
javax.xml.namespace.QName |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
java.net.URI |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.xml.datatype.XMLGregorianCalendar |
|
|
|
|
|
|
| | |
|
|
|
| ||
javax.xml.datatype.Duration |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
java.lang.Object |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
java.awt.Image |
|
|
|
|
|
|
|
| |
|
|
|
| ||
javax.activation.DataHandler |
|
|
|
|
|
|
|
|
|
|
|
|
|
| Should map to xs:base64Binary |
javax.xml.transform.Source |
|
|
|
|
|
|
|
|
|
|
|
| TUSCANY-2387 | ||
java.util.UUID |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
Arrays |
|
|
| Arrays |
|
|
|
|
|
|
|
|
|
| |
boolean |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
byte |
|
|
|
|
|
|
|
|
|
|
|
| A byte[] must map to xs:base64Binary by default | ||
short |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
int |
| int |
|
|
|
|
|
|
|
|
|
|
| ||
long |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
float |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
java.lang.String |
|
|
|
|
|
|
| |
|
|
|
|
| ||
java.math.BigInteger |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
java.math.BigDecimal |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
java.util.Calendar |
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
java.util.Date |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
javax.xml.namespace.QNameQName |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
java.net.URI |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
javax.xml.datatype.XMLGregorianCalendar |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
javax.xml.datatype.Duration |
|
|
|
|
|
|
|
| |
|
|
|
| ||
java.lang.Object |
|
|
|
|
|
|
|
|
|
|
|
| TUSCANY-2389 | ||
java.awt.Image |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.activation.DataHandler |
|
|
|
|
|
|
|
|
|
|
|
|
| Should map to xs:base64Binary | |
javax.xml.transform.Source |
|
|
|
|
|
|
|
|
|
|
|
| TUSCANY-2386, TUSCANY-2387, TUSCANY-2387 2452 | ||
java.util.UUID |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
Collections |
|
| Collections |
|
|
|
|
|
|
|
|
|
| ||
List<String>, ArrayList<String> |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
Map<String, String>, HashMap<String, String> |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
|
|
|
|
|
|
|
|
|
|
|
|
|
| ||
Polymorphic Types |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
Case1: Bean3 extends Bean2 |
|
|
|
|
|
|
|
|
|
|
|
| Unmarshalls to Bean2 always. | ||
Parameterized Types |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
TypeExplicit |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
TypeUnbound |
|
|
|
|
|
|
|
|
|
|
|
| Unmarshalls to Object[] always. | ||
TypeExtends |
|
|
|
|
|
|
|
|
|
|
|
| Unmarshalls to Bean2 always. | ||
RecursiveTypeBound |
|
|
|
|
|
|
|
|
|
|
|
| Unmarshalls to Bean1<String> always. | ||
WildcardUnbound |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
WildcardSuper |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
WildcardExtends |
|
|
|
|
|
|
|
|
|
|
|
| Unmarshalls to Bean2 always. | ||
|
|
|
|
|
|
|
|
|
|
|
|
|
| ||
Variable Arguments |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
String... |
|
|
|
|
|
|
|
|
|
|
|
|
| ||
Exceptions |
|
|
|
| Exceptions |
|
|
|
|
|
|
|
| ||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The following are note to give more detail of the scenarios and data types.
...
Code Block |
---|
public interface HelloWorldService { public String getGreetings(String firstName, String lastName); } |
WSDL
Code Block |
---|
<wsdl:types> <schema elementFormDefault="qualified" targetNamespace="http://helloworld" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="getGreetings"> <complexType> <sequence> <element name="firstName" type="xsd:string"/> <element name="lastName" type="xsd:string"/> </sequence> </complexType> </element> <element name="getGreetingsResponse"> <complexType> <sequence> <element name="getGreetingsReturn" type="xsd:string"/> </sequence> </complexType> </element> </schema> </wsdl:types> <wsdl:message name="getGreetingsRequest"> <wsdl:part element="tns:getGreetings" name="parameters"/> </wsdl:message> <wsdl:message name="getGreetingsResponse"> <wsdl:part element="tns:getGreetingsResponse" name="parameters"/> </wsdl:message> <wsdl:portType name="HelloWorld"> <wsdl:operation name="getGreetings"> <wsdl:input message="tns:getGreetingsRequest" name="getGreetingsRequest"/> <wsdl:output message="tns:getGreetingsResponse" name="getGreetingsResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="HelloWorldSoapBinding" type="tns:HelloWorld"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getGreetings"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getGreetingsRequest"> <wsdlsoap:body use="literal"/> </wsdl:input> <wsdl:output name="getGreetingsResponse"> <wsdlsoap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> |
...
Code Block |
---|
public interface HelloWorldService { public String getGreetings(Name nameString firstName, String lastName); } |
WSDL
Code Block |
---|
<wsdl:types> <schema elementFormDefault="qualified" targetNamespace="http://helloworld" xmlns="http://www.w3.org/2001/XMLSchema"> <complexType name="NameType"> <sequence> <element name="firstName" type="xsd:string"/> <element name="lastName" type="xsd:string"/> </sequence> </complexType> <element name="getGreetings" type="tns:NameType"/> <element name="getGreetingsResponse" type="xsd:string"/> </schema> </wsdl:types> <wsdl:message name="getGreetingsRequest"> <wsdl:part element="tns:getGreetings" name="parameters"/> </wsdl:message> <wsdl:message name="getGreetingsResponse"> <wsdl:part element="tns:getGreetingsResponse" name="parameters"/> </wsdl:message> <wsdl:portType name="HelloWorld"> <wsdl:operation name="getGreetings"> <wsdl:input message="tns:getGreetingsRequest" name="getGreetingsRequest"/> <wsdl:output message="tns:getGreetingsResponse" name="getGreetingsResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="HelloWorldSoapBinding" type="tns:HelloWorld"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getGreetings"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getGreetingsRequest"> <wsdlsoap:body use="literal"/> </wsdl:input> <wsdl:output name="getGreetingsResponse"> <wsdlsoap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> |
...
Excluded by SCA
Discussed in JAXWS
There is a JIRA http://issues.apache.org/jira/browse/TUSCANY-2332
Namespaces
What do we need to say about this?
...
Code Block |
---|
boolean byte short int long float double |
Standard Types
As JAXB 2.1 (8.5.2)
Code Block |
---|
java.lang.String java.math.BigInteger java.math.BigDecimal java.util.Calendar java.util.Date javax.xml.namespace.QName java.net.URI javax.xml.datatype.XMLGregorianCalendar javax.xml.datatype.Duration java.lang.Object java.awt.Image javax.activation.DataHandler javax.xml.transform.Source java.util.UUID |
Parameterized Types/Generics
...
Code Block |
---|
Bean1<String> someMethodTypeExplicit(Bean1<String>) |
Code Block |
---|
<xs:complexType name="someMethodTypeExplicit">
<xs:sequence>
<xs:element name="arg0" type="tns:bean1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="someMethodTypeExplicitResponse">
<xs:sequence>
<xs:element name="return" type="tns:bean1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element name="someMethodTypeExplicit" type="tns:someMethodTypeExplicit"/>
<xs:element name="someMethodTypeExplicitResponse" type="tns:someMethodTypeExplicitResponse"/>
<message name="someMethodTypeExplicit">
<part name="parameters" element="tns:someMethodTypeExplicit"/>
</message>
<message name="someMethodTypeExplicitResponse">
<part name="parameters" element="tns:someMethodTypeExplicitResponse"/>
</message>
|
...
Code Block |
---|
<T> Bean1<T> someMethodTypeUnbound(T[] anArray) |
Code Block |
---|
<xs:complexType name="someMethodTypeUnbound">
<xs:sequence>
<xs:element name="arg0" type="xs:anyType" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="someMethodTypeUnboundResponse">
<xs:sequence>
<xs:element name="return" type="tns:bean1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element name="someMethodTypeUnbound" type="tns:someMethodTypeUnbound"/>
<xs:element name="someMethodTypeUnboundResponse" type="tns:someMethodTypeUnboundResponse"/>
<message name="someMethodTypeUnbound">
<part name="parameters" element="tns:someMethodTypeUnbound"/>
</message>
<message name="someMethodTypeUnboundResponse">
<part name="parameters" element="tns:someMethodTypeUnboundResponse"/>
</message>
|
...
Code Block |
---|
<T extends Bean2> Bean1<T> someMethodTypeExtends(T[] anArray) |
Code Block |
---|
<xs:complexType name="someMethodTypeExtends"> <xs:sequence> <xs:element name="arg0" type="tns:bean2" nillable="true" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="someMethodTypeExtendsResponse"> <xs:sequence> <xs:element name="return" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:element name="someMethodTypeExtends" type="tns:someMethodTypeExtends"/> <xs:element name="someMethodTypeExtendsResponse" type="tns:someMethodTypeExtendsResponse"/> <message name="someMethodTypeExtends"> <part name="parameters" element="tns:someMethodTypeExtends"/> </message> <message name="someMethodTypeExtendsResponse"> <part name="parameters" element="tns:someMethodTypeExtendsResponse"/> </message> |
...
Code Block |
---|
<T extends Bean1<String>> Bean1<T> someMethodRecursiveTypeBound(T[] anArray) |
Code Block |
---|
<xs:complexType name="someMethodRecursiveTypeBound">
<xs:sequence>
<xs:element name="arg0" type="tns:bean1" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="someMethodRecursiveTypeBoundResponse">
<xs:sequence>
<xs:element name="return" type="tns:bean1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element name="someMethodRecursiveTypeBound" type="tns:someMethodRecursiveTypeBound"/>
<xs:element name="someMethodRecursiveTypeBoundResponse" type="tns:someMethodRecursiveTypeBoundResponse"/>
<message name="someMethodRecursiveTypeBound">
<part name="parameters" element="tns:someMethodRecursiveTypeBound"/>
</message>
<message name="someMethodRecursiveTypeBoundResponse">
<part name="parameters" element="tns:someMethodRecursiveTypeBoundResponse"/>
</message>
|
...
Code Block |
---|
Bean1<?> someMethodWildcardUnbound(Bean1<?>) |
Code Block |
---|
<xs:complexType name="someMethodWildcardUnbound">
<xs:sequence>
<xs:element name="arg0" type="tns:bean1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="someMethodWildcardUnboundResponse">
<xs:sequence>
<xs:element name="return" type="tns:bean1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element name="someMethodWildcardUnbound" type="tns:someMethodWildcardUnbound"/>
<xs:element name="someMethodWildcardUnboundResponse" type="tns:someMethodWildcardUnboundResponse"/>
<message name="someMethodWildcardUnbound">
<part name="parameters" element="tns:someMethodWildcardUnbound"/>
</message>
<message name="someMethodWildcardUnboundResponse">
<part name="parameters" element="tns:someMethodWildcardUnboundResponse"/>
</message>
|
...
Code Block |
---|
Bean1<? super Bean3> someMethodWildcardSuper(Bean1<? super Bean3>) |
Code Block |
---|
<xs:complexType name="someMethodWildcardSuper">
<xs:sequence>
<xs:element name="arg0" type="tns:bean1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="someMethodWildcardSuperResponse">
<xs:sequence>
<xs:element name="return" type="tns:bean1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element name="someMethodWildcardSuper" type="tns:someMethodWildcardSuper"/>
<xs:element name="someMethodWildcardSuperResponse" type="tns:someMethodWildcardSuperResponse"/>
<message name="someMethodWildcardSuper">
<part name="parameters" element="tns:someMethodWildcardSuper"/>
</message>
<message name="someMethodWildcardSuperResponse">
<part name="parameters" element="tns:someMethodWildcardSuperResponse"/>
</message>
|
...
Code Block |
---|
Bean1<? extends Bean2> someMethodWildcardExtends(Bean1<? extends Bean2>) |
Code Block |
---|
<xs:complexType name="someMethodWildcardExtends">
<xs:sequence>
<xs:element name="arg0" type="tns:bean1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="someMethodWildcardExtendsResponse">
<xs:sequence>
<xs:element name="return" type="tns:bean1" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element name="someMethodWildcardExtends" type="tns:someMethodWildcardExtends"/>
<xs:element name="someMethodWildcardExtendsResponse" type="tns:someMethodWildcardExtendsResponse"/>
<message name="someMethodWildcardExtends">
<part name="parameters" element="tns:someMethodWildcardExtends"/>
</message>
<message name="someMethodWildcardExtendsResponse">
<part name="parameters" element="tns:someMethodWildcardExtendsResponse"/>
</message>
|
...
Start From WSDL
Code Block |
---|
<wsdl:types>
...
<element name="errorCode" type="xsd:int"/>
...
</wsdl:types>
<wsdl:message name="BadInputMsg">
<wsdl:part element="tns:errorCode" name="parameters"/>
</wsdl:message>
<wsdl:portType name="GuessAndGreet">
<wsdl:operation name="sendGuessAndName">
<wsdl:input.../>
<wsdl:fault message="tns:BadInputMsg" name="BadInputMsg"/>
...
|
Now generate Java (e.g. with wsimport) according to the JAX-WS Section 2.5 pattern:
Interface
Code Block |
---|
public Person sendGuessAndName(...) throws BadInputMsg; |
Anchor | ||||
---|---|---|---|---|
|
Code Block |
---|
import javax.xml.ws.WebFault;
@WebFault(name = "errorCode", targetNamespace = "....")
public class BadInputMsg extends Exception
{
private int faultInfo;
public BadInputMsg(String message, int faultInfo) {
super(message);
this.faultInfo = faultInfo;
}
public BadInputMsg(String message, int faultInfo, Throwable cause) {
super(message, cause);
this.faultInfo = faultInfo;
}
public int getFaultInfo() {
return faultInfo;
}
}
|
...
Code Block |
---|
package java.sql;
public class SQLException extends Exception ... {
...
public SQLException(String theReason, String theSQLState, int theErrorCode) ...
public int getErrorCode()
}
|
Tuscany
TODO - Add some details of which bits of tuscany do what w.r.t databindings, mappings and transformations in typical scenarios, e.g.
Code Block |
---|
<component name="HelloWorldClientComponent">
<implementation.java class="helloworld.HelloWorldClientImpl" />
<reference name="helloWorldService">
<interface.wsdl interface="http://helloworld#wsdl.interface(HelloWorld)" />
<binding.ws uri="http://localhost:8085/HelloWorldService"/>
</reference>
</component>
<component name="HelloWorldServiceComponent">
<implementation.java class="helloworld.HelloWorldImpl" />
<service name="HelloWorldService">
<interface.wsdl interface="http://helloworld#wsdl.interface(HelloWorld)" />
<binding.ws uri="http://localhost:8085/HelloWorldService"/>
</service>
</component>
|
...
- databinding mapping - Creates in memory models of the WSDL interfaces and the java introspected component types.
- interface contract mapper - Checks compatibility of
- interfaces with component types
- references with services
Code Block |
---|
<service name="HelloWorldService"> <interface.java ... |
...