1 package org.codehaus.xfire.transport;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.wsdl.Binding;
7 import javax.wsdl.BindingInput;
8 import javax.wsdl.BindingOperation;
9 import javax.wsdl.BindingOutput;
10 import javax.wsdl.Definition;
11 import javax.wsdl.Operation;
12 import javax.wsdl.Port;
13 import javax.wsdl.PortType;
14 import javax.wsdl.extensions.soap.SOAPBinding;
15 import javax.wsdl.extensions.soap.SOAPBody;
16 import javax.wsdl.extensions.soap.SOAPHeader;
17 import javax.xml.namespace.QName;
18
19 import org.codehaus.xfire.service.Service;
20 import org.codehaus.xfire.service.ServiceInfo;
21 import org.codehaus.xfire.soap.SoapConstants;
22 import org.codehaus.xfire.wsdl11.WSDL11ParameterBinding;
23 import org.codehaus.xfire.wsdl11.WSDL11Transport;
24 import org.codehaus.xfire.wsdl11.builder.WSDLBuilder;
25
26 import com.ibm.wsdl.extensions.soap.SOAPAddressImpl;
27 import com.ibm.wsdl.extensions.soap.SOAPBindingImpl;
28 import com.ibm.wsdl.extensions.soap.SOAPBodyImpl;
29 import com.ibm.wsdl.extensions.soap.SOAPHeaderImpl;
30 import com.ibm.wsdl.extensions.soap.SOAPOperationImpl;
31
32 /***
33 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
34 * @since Dec 21, 2004
35 */
36 public abstract class AbstractWSDLTransport
37 extends AbstractTransport
38 implements WSDL11Transport
39 {
40 public abstract String getServiceURL(Service service);
41
42 public abstract String getTransportURI(Service service);
43
44 /***
45 * @see org.codehaus.xfire.transport.Transport#createBinding(javax.wsdl.PortType)
46 */
47 public Binding createBinding(WSDLBuilder builder, PortType portType, WSDL11ParameterBinding paramBinding)
48 {
49 Definition def = builder.getDefinition();
50 ServiceInfo info = builder.getService().getServiceInfo();
51
52 Binding binding = def.createBinding();
53 binding.setQName( new QName( info.getName().getNamespaceURI(),
54 info.getName().getLocalPart() + getName() + "Binding" ) );
55 binding.setPortType( portType );
56 binding.setUndefined(false);
57
58 binding.addExtensibilityElement( createSoapBinding(builder.getService(), paramBinding) );
59
60 return binding;
61 }
62
63 protected SOAPBinding createSoapBinding(Service endpoint, WSDL11ParameterBinding binding)
64 {
65 SOAPBinding soapBind = new SOAPBindingImpl();
66
67 String style = binding.getStyle();
68 if ( style.equals( SoapConstants.STYLE_WRAPPED ) )
69 style = SoapConstants.STYLE_DOCUMENT;
70
71 soapBind.setStyle( style );
72 soapBind.setTransportURI( getTransportURI(endpoint) );
73
74 return soapBind;
75 }
76
77 /***
78 * @see org.codehaus.xfire.transport.Transport#createPort(javax.wsdl.Binding)
79 */
80 public Port createPort(WSDLBuilder builder, Binding transportBinding)
81 {
82 Definition def = builder.getDefinition();
83 Service service = builder.getService();
84
85 SOAPAddressImpl add = new SOAPAddressImpl();
86 add.setLocationURI( getServiceURL( service ) );
87
88 Port port = def.createPort();
89 port.setBinding( transportBinding );
90 port.setName( service.getName() + getName() + "Port" );
91 port.addExtensibilityElement( add );
92
93 return port;
94 }
95
96 /***
97 * @see org.codehaus.xfire.transport.Transport#createBindingOperation(javax.wsdl.Message, javax.wsdl.Message, org.codehaus.xfire.java.JavaService)
98 */
99 public BindingOperation createBindingOperation(WSDLBuilder builder,
100 PortType portType,
101 Operation wsdlOp,
102 WSDL11ParameterBinding binding)
103 {
104 Definition def = builder.getDefinition();
105 BindingOperation bindOp = def.createBindingOperation();
106
107
108 SOAPBody body = createSoapBody(builder.getService(), binding);
109
110 SOAPOperationImpl soapOp = new SOAPOperationImpl();
111 soapOp.setSoapActionURI("");
112
113 BindingInput bindIn = def.createBindingInput();
114 bindIn.setName( wsdlOp.getInput().getName() );
115 bindIn.addExtensibilityElement( body );
116
117 if (wsdlOp.getOutput() != null)
118 {
119 BindingOutput bindOut = def.createBindingOutput();
120 bindOut.setName( wsdlOp.getOutput().getName() );
121 bindOut.addExtensibilityElement( body );
122 bindOp.setBindingOutput( bindOut );
123 }
124
125 bindOp.setName( wsdlOp.getName() );
126 bindOp.setOperation( wsdlOp );
127 bindOp.setBindingInput( bindIn );
128 bindOp.addExtensibilityElement( soapOp );
129
130 return bindOp;
131 }
132
133 public SOAPBody createSoapBody( Service endpoint, WSDL11ParameterBinding binding )
134 {
135 SOAPBody body = new SOAPBodyImpl();
136 body.setUse( binding.getUse() );
137
138 if ( binding.getStyle().equals( SoapConstants.STYLE_RPC ) )
139 {
140 body.setNamespaceURI( endpoint.getServiceInfo().getName().getNamespaceURI() );
141 }
142
143 if ( binding.getUse().equals( SoapConstants.USE_ENCODED ) )
144 {
145 List encodingStyles = new ArrayList();
146 encodingStyles.add( endpoint.getSoapVersion().getSoapEncodingStyle() );
147
148 body.setEncodingStyles(encodingStyles);
149 }
150
151 return body;
152 }
153
154 public SOAPHeader createSoapHeader( Service endpoint, WSDL11ParameterBinding binding )
155 {
156 SOAPHeader header = new SOAPHeaderImpl();
157 header.setUse( binding.getUse() );
158
159 if ( binding.getStyle().equals( SoapConstants.STYLE_RPC ) )
160 {
161 header.setNamespaceURI( endpoint.getServiceInfo().getName().getNamespaceURI() );
162 }
163
164 if ( binding.getUse().equals( SoapConstants.USE_ENCODED ) )
165 {
166 List encodingStyles = new ArrayList();
167 encodingStyles.add( endpoint.getSoapVersion().getSoapEncodingStyle() );
168
169 header.setEncodingStyles(encodingStyles);
170 }
171
172 return header;
173 }
174 }