Last modified by Pascal Robert on 2007/09/03 19:24

From version 4.1
edited by Pascal Robert
on 2007/09/03 19:24
Change comment: There is no comment for this version
To version 1.1
edited by smmccraw
on 2007/07/08 10:35
Change comment: There is no comment for this version

Summary

Details

Page properties
Title
... ... @@ -1,1 +1,1 @@
1 -Web Services-Controlling WSDL Service Location
1 +Programming__WebObjects-Web Services-Controlling WSDL Service Location
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.probert
1 +XWiki.smmccraw
Content
... ... @@ -1,36 +1,40 @@
1 -This documentation was written by Andrew Lindesay ([[http:~~/~~/www.lindesay.co.nz>>url:http://www.lindesay.co.nz||shape="rect"]]) in 2006 as part of supported code in the LEWOStuff framework, but this material has been transcribed here. It was written around the time of WebObjects 5.2 and 5.3 on the 1.4 JVM.
1 +This documentation was written by Andrew Lindesay (http:~/~/www.lindesay.co.nz) in 2006 as part of supported code in the LEWOStuff framework, but this material has been transcribed here. It was written around the time of WebObjects 5.2 and 5.3 on the 1.4 JVM.
2 2  
3 -AXIS provides a number of handlers for ultimately executing the WS. This generally works in the WebObjects environment out of the box. However, in the case of a servlet deployment, the URLs are manipulated by the servlet container so they look something like this.
3 +AXIS provides a number of handlers for ultimately executing the WS. This generally works in the WebObjects environment out of the box. However, in the case of a servlet deployment, the URLs are manipulated by the servlet container so they look something like this.
4 4  
5 5  {{panel}}
6 -...ects/FOO.woa/ws/FooService;jsessionid=abc.i1?wsdl
6 +
7 + ...ects/FOO.woa/ws/FooService<font color="red">;jsessionid=abc.i1</font>?wsdl
8 +
7 7  {{/panel}}
8 8  
9 -If a client starts a session on a WS invocation then you want all subsequent requests to return to this same servlet container (Here we assume a redundant deployment where there are a number of servlet containers.) where the session resides. However the servlet-container's HTTP adaptor typically only knows this by looking at the modified URL. Unfortunately, the default WSDL generated by AXIS would have a section like this.
11 +If a client starts a session on a WS invocation then you want all subsequent requests to return to this same servlet container (Here we assume a redundant deployment where there are a number of servlet containers.) where the session resides. However the servlet-container's HTTP adaptor typically only knows this by looking at the modified URL. Unfortunately, the default WSDL generated by AXIS would have a section like this.
10 10  
11 11  {{code}}
12 -
13 13  ...
14 14  <wsdl:service name="FooService">
16 +{panel}
15 15   <wsdl:port name="FooService" binding="impl:FooService SoapBinding">
16 16   <wsdlsoap:address location="http://foo.co.nz/FOO/WebObjects/FOO.woa/ws/FooService"/>
17 17   </wsdl:port>
20 +{panel}
18 18  </wsdl:service>
19 19  ...
20 20  
21 21  {{/code}}
22 22  
23 -A WSDL like this does not contain the modified URL caused by the context having a session in the location for the service. The example handler //LEWOWebServicesWSDLLocationHandler// below which is supplied in LEWOStuff will correct the location supplied in the WSDL to contain the session information. To install this handler for use in WebObjects, locate the //server.wsdd// file within your project and modify the following section so that it appears as follows.
26 +A WSDL like this does not contain the modified URL caused by the context having a session in the location for the service. The example handler //LEWOWebServicesWSDLLocationHandler// below which is supplied in LEWOStuff will correct the location supplied in the WSDL to contain the session information. To install this handler for use in WebObjects, locate the //server.wsdd// file within your project and modify the following section so that it appears as follows.
24 24  
25 25  {{code}}
26 -
27 27  ...
28 28  <transport name="http">
31 +{panel}
29 29   <requestFlow>
30 30   <handler type="HTTPActionHandler"/>
31 31   <handler type="URLMapper"/>
32 32   <handler type="java:nz.co.lindesay.common.webobjects.LEWOWebServicesWSDLLocationHandler"/>
33 33   </requestFlow>
37 +{panel}
34 34  </transport>
35 35  
36 36  {{/code}}
... ... @@ -54,13 +54,17 @@
54 54  following conditions are met:
55 55  
56 56  * Redistributions of source code must retain the above
61 +{panel}
57 57   copyright notice, this list of conditions and the
58 58   following disclaimer.
64 +{panel}
59 59  
60 60  * Redistributions in binary form must reproduce the above
67 +{panel}
61 61   copyright notice, this list of conditions and the
62 62   following disclaimer in the documentation and/or other
63 63   materials provided with the distribution.
71 +{panel}
64 64  
65 65  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
66 66  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
... ... @@ -86,11 +86,12 @@
86 86  import org.apache.axis.*;
87 87  
88 88  /**
97 +{panel}
89 89   * <P>This class is an AXIS request handler that is designed to
90 90   * manipulate the outbound WSDL that is generated for a
91 91   * request. The manipulation undertaken here is to modify the
92 92   * location of the actual service. The reason for doing this is
93 - * that if you have a web service deployed into a servlet
102 + * that if you have a web service deployed into a servlet
94 94   * container as a WO application, the session'ed URLs can look
95 95   * a bit like this.</P>
96 96   *
... ... @@ -107,11 +107,12 @@
107 107   * handler list as the last item in the list. This should be the
108 108   * request flow in the HTTP transport section.</P>
109 109   *
110 - * <P><TT><handler type="java:nz.co.lindesay.common.webobjects.LEWOWebServicesWSDLLocationHandler"/></TT></P>
119 + * <P><TT>&lt;handler type="java:nz.co.lindesay.common.webobjects.LEWOWebServicesWSDLLocationHandler"/&gt;</TT></P>
111 111   *
112 112   * <P>This should also work with the "<I>wotaskd</I>" deployment
113 113   * style as well.</P>
114 114   */
124 +{panel}
115 115  
116 116  public class LEWOWebServicesWSDLLocationHandler extends org.apache.axis.handlers.BasicHandler
117 117  {
... ... @@ -118,87 +118,91 @@
118 118  
119 119  // --------------------------------------------------------------
120 120  
121 - public LEWOWebServicesWSDLLocationHandler() { super(); }
131 + public LEWOWebServicesWSDLLocationHandler() { super(); }
122 122  
123 123  // --------------------------------------------------------------
124 124  
125 125  /**
136 +{panel}
126 126   * <P>This is the AXIS hook where we can manipulate the outbound
127 127   * WSDL.</P>
128 128   */
140 +{panel}
129 129  
130 - public void generateWSDL(MessageContext msgContext) throws AxisFault
131 - {
132 - WOContext context = WOWebServiceUtilities.currentWOContext();
133 - WORequest request = context.request();
134 - String host = LEWOHelper.getExternalHostnameFromInboundRequest(request);
135 - int port = LEWOHelper.getExternalPortFromInboundRequest(request);
136 - int appi = request.applicationNumber();
137 -
138 - if((null==host)||(0==host.length()))
139 - throw new IllegalStateException("the host cannot be determined from the inbound request.");
140 -
141 - if(context.hasSession())
142 - context.session();
143 -
144 - StringBuffer sb = new StringBuffer();
145 -
146 - sb.append("http://");
147 - sb.append(host);
148 -
149 - if(-1!=port)
150 - {
151 - sb.append(":");
152 - sb.append(Integer.toString(port));
153 - }
154 -
155 - String path = context.urlWithRequestHandlerKey(
156 - request.requestHandlerKey(),
157 - request.requestHandlerPath(),
158 - null);
159 -
142 + public void generateWSDL(MessageContext msgContext) throws AxisFault
143 + {
144 + WOContext context = WOWebServiceUtilities.currentWOContext();
145 + WORequest request = context.request();
146 + String host = LEWOHelper.getExternalHostnameFromInboundRequest(request);
147 + int port = LEWOHelper.getExternalPortFromInboundRequest(request);
148 + int appi = request.applicationNumber();
149 +
150 + if((null==host)||(0==host.length()))
151 + throw new IllegalStateException("the host cannot be determined from the inbound request.");
152 +
153 + if(context.hasSession())
154 + context.session();
155 +
156 + StringBuffer sb = new StringBuffer();
157 +
158 + sb.append("http://");
159 + sb.append(host);
160 +
161 + if(-1!=port)
162 + {
163 + sb.append(":");
164 + sb.append(Integer.toString(port));
165 + }
166 +
167 + String path = context.urlWithRequestHandlerKey(
168 + request.requestHandlerKey(),
169 + request.requestHandlerPath(),
170 + null);
171 +
160 160  // Unless the context has a session, we can't get it to come back
161 161  // to a specific instance, but in the case of a 'wotaskd' deploy,
162 162  // there is no way to specify the session for a WSDL request, so
163 163  // we'll do a nasty hack to make this work.
176 +
177 + if((-1!=appi)&&(!context.hasSession()))
178 + {
179 + String webServiceRequestHandlerKey = WOApplication.application().webServiceRequestHandlerKey();
180 + String startPath = request.adaptorPrefix()+"/"+request.applicationName()+".woa"; // ''/cgi-bin/WebObjects/Foo.woa''
181 +
182 + if(!path.startsWith(startPath))
183 + throw new IllegalStateException("The path '"+path+"' should have started with '"+startPath+"'");
164 164  
165 - if((-1!=appi)&&(!context.hasSession()))
166 - {
167 - String webServiceRequestHandlerKey = WOApplication.application().webServiceRequestHandlerKey();
168 - String startPath = request.adaptorPrefix()+"/"+request.applicationName()+".woa"; // ''/cgi-bin/WebObjects/Foo.woa''
185 + if(path.startsWith(startPath+"/"+webServiceRequestHandlerKey))
186 + {
187 + StringBuffer pathSB = new StringBuffer();
188 +
189 + pathSB.append(startPath);
190 + pathSB.append("/");
191 + pathSB.append(Integer.toString(appi));
192 + pathSB.append(path.substring(startPath.length()));
193 +
194 + path = pathSB.toString();
195 + }
196 + }
197 +
198 + sb.append(path);
199 +
200 + msgContext.setProperty(MessageContext.WSDLGEN_SERV_LOC_URL,sb.toString());
201 + }
169 169  
170 - if(!path.startsWith(startPath))
171 - throw new IllegalStateException("The path '"+path+"' should have started with '"+startPath+"'");
172 -
173 - if(path.startsWith(startPath+"/"+webServiceRequestHandlerKey))
174 - {
175 - StringBuffer pathSB = new StringBuffer();
176 -
177 - pathSB.append(startPath);
178 - pathSB.append("/");
179 - pathSB.append(Integer.toString(appi));
180 - pathSB.append(path.substring(startPath.length()));
181 -
182 - path = pathSB.toString();
183 - }
184 - }
185 -
186 - sb.append(path);
187 -
188 - msgContext.setProperty(MessageContext.WSDLGEN_SERV_LOC_URL,sb.toString());
189 - }
190 -
191 191  // --------------------------------------------------------------
192 192  
193 193  /**
206 +{panel}
194 194   * <P>Basically there is nothing to do here because we are not
195 195   * interested in messing with the request/response cycle - rather
196 196   * we want only to manipulate the WSDL.</P>
197 197   */
211 +{panel}
198 198  
199 - public void invoke(MessageContext msgContext) throws AxisFault
200 - {
201 - }
213 + public void invoke(MessageContext msgContext) throws AxisFault
214 + {
215 + }
202 202  
203 203  // --------------------------------------------------------------
204 204