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.Operation;
11 import javax.wsdl.Port;
12 import javax.wsdl.PortType;
13 import javax.wsdl.extensions.soap.SOAPBinding;
14 import javax.wsdl.extensions.soap.SOAPBody;
15 import javax.xml.namespace.QName;
16
17 import org.codehaus.xfire.fault.FaultHandlerPipeline;
18 import org.codehaus.xfire.handler.HandlerPipeline;
19 import org.codehaus.xfire.service.Service;
20 import org.codehaus.xfire.soap.SoapConstants;
21 import org.codehaus.xfire.wsdl11.WSDL11Transport;
22
23 import com.ibm.wsdl.BindingImpl;
24 import com.ibm.wsdl.BindingInputImpl;
25 import com.ibm.wsdl.BindingOperationImpl;
26 import com.ibm.wsdl.BindingOutputImpl;
27 import com.ibm.wsdl.PortImpl;
28 import com.ibm.wsdl.extensions.soap.SOAPAddressImpl;
29 import com.ibm.wsdl.extensions.soap.SOAPBindingImpl;
30 import com.ibm.wsdl.extensions.soap.SOAPBodyImpl;
31 import com.ibm.wsdl.extensions.soap.SOAPOperationImpl;
32
33 /***
34 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
35 * @since Dec 21, 2004
36 */
37 public abstract class AbstractTransport
38 implements Transport, WSDL11Transport
39 {
40 private HandlerPipeline requestPipeline;
41 private HandlerPipeline responsePipeline;
42 private FaultHandlerPipeline faultPipeline;
43
44 public abstract String getServiceURL(Service service);
45
46 public abstract String getTransportURI(Service service);
47
48 /***
49 * @see org.codehaus.xfire.transport.Transport#createBinding(javax.wsdl.PortType)
50 */
51 public Binding createBinding(PortType portType, Service service)
52 {
53 Binding binding = new BindingImpl();
54 binding.setQName( new QName( service.getDefaultNamespace(),
55 service.getName() + getName() + "Binding" ) );
56 binding.setPortType( portType );
57 binding.setUndefined(false);
58
59 binding.addExtensibilityElement( createSoapBinding(service) );
60
61 return binding;
62 }
63
64 protected SOAPBinding createSoapBinding(Service service)
65 {
66 SOAPBinding soapBind = new SOAPBindingImpl();
67
68 String style = service.getStyle();
69 if ( style.equals( SoapConstants.STYLE_WRAPPED ) )
70 style = SoapConstants.STYLE_DOCUMENT;
71
72 soapBind.setStyle( style );
73 soapBind.setTransportURI( getTransportURI(service) );
74
75 return soapBind;
76 }
77
78 /***
79 * @see org.codehaus.xfire.transport.Transport#createPort(javax.wsdl.Binding)
80 */
81 public Port createPort(Binding transportBinding, Service service)
82 {
83 SOAPAddressImpl add = new SOAPAddressImpl();
84 add.setLocationURI( getServiceURL( service ) );
85
86 Port port = new PortImpl();
87 port.setBinding( transportBinding );
88 port.setName( service.getName() + getName() + "Port" );
89 port.addExtensibilityElement( add );
90
91 return port;
92 }
93
94 /***
95 * @see org.codehaus.xfire.transport.Transport#createBindingOperation(javax.wsdl.Message, javax.wsdl.Message, org.codehaus.xfire.java.JavaService)
96 */
97 public BindingOperation createBindingOperation(PortType portType, Operation wsdlOp, Service service)
98 {
99 BindingOperation bindOp = new BindingOperationImpl();
100
101
102 SOAPBody body = createSoapBody( service );
103
104 SOAPOperationImpl soapOp = new SOAPOperationImpl();
105 soapOp.setSoapActionURI("");
106
107 BindingInput bindIn = new BindingInputImpl();
108 bindIn.setName( wsdlOp.getInput().getName() );
109 bindIn.addExtensibilityElement( body );
110
111 BindingOutput bindOut = new BindingOutputImpl();
112 bindOut.setName( wsdlOp.getOutput().getName() );
113 bindOut.addExtensibilityElement( body );
114 bindOp.setBindingOutput( bindOut );
115
116 bindOp.setName( wsdlOp.getName() );
117 bindOp.setOperation( wsdlOp );
118 bindOp.setBindingInput( bindIn );
119 bindOp.addExtensibilityElement( soapOp );
120
121 return bindOp;
122 }
123
124 public SOAPBody createSoapBody( Service service )
125 {
126 SOAPBody body = new SOAPBodyImpl();
127 body.setUse( service.getUse() );
128
129 if ( service.getStyle().equals( SoapConstants.STYLE_RPC ) )
130 {
131 body.setNamespaceURI( service.getDefaultNamespace() );
132 }
133
134 if ( service.getUse().equals( SoapConstants.USE_ENCODED ) )
135 {
136 List encodingStyles = new ArrayList();
137 encodingStyles.add( service.getSoapVersion().getSoapEncodingStyle() );
138
139 body.setEncodingStyles(encodingStyles);
140 }
141
142 return body;
143 }
144
145 /***
146 * @return Returns the faultPipeline.
147 */
148 public FaultHandlerPipeline getFaultPipeline()
149 {
150 return faultPipeline;
151 }
152
153 /***
154 * @param faultPipeline The faultPipeline to set.
155 */
156 public void setFaultPipeline(FaultHandlerPipeline faultPipeline)
157 {
158 this.faultPipeline = faultPipeline;
159 }
160
161 /***
162 * @return Returns the requestPipeline.
163 */
164 public HandlerPipeline getRequestPipeline()
165 {
166 return requestPipeline;
167 }
168
169 /***
170 * @param requestPipeline The requestPipeline to set.
171 */
172 public void setRequestPipeline(HandlerPipeline requestPipeline)
173 {
174 this.requestPipeline = requestPipeline;
175 }
176
177 /***
178 * @return Returns the responsePipeline.
179 */
180 public HandlerPipeline getResponsePipeline()
181 {
182 return responsePipeline;
183 }
184
185 /***
186 * @param responsePipeline The responsePipeline to set.
187 */
188 public void setResponsePipeline(HandlerPipeline responsePipeline)
189 {
190 this.responsePipeline = responsePipeline;
191 }
192 }