Hi all, Here is some code that provide client side support for soap:header entry in the WSDL operation binding.
Modified files: xml-axis/java/src/org/apache/axis/client/Service.java xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java Added files: xml-axis/java/src/org/apache/axis/serviceContext/ServiceContext.java xml-axis/java/src/org/apache/axis/serviceContext/HeaderKey.java xml-axis/java/src/org/apache/axis/wsdl/toJava/Headers.java xml-axis/java/src/org/apache/axis/wsdl/toJava/Header.java >From a high level point of view: 1 - WSDL2Java now adds the appropriate setHeader() before call.invoke() as well as the appropriate updateHeader() following call.invoke() 2 - I have added a ServiceContext class stored in the Service that currently simply stores a Hashtable of all the service's header. The key to the hash is a HeaderKey (which could/should (not sure) be replace by a String if someone can confirm that the key to a header is the part name...) I did create HeaderKey because originaly I was using the combination of the part and the message to find a Header in the ServiceContext hash. I believe that this will not make its way into the build before Beta-2 (right?) so I am sending it to get feedback, let me know if my understanding of soap:header is right and what should be changed may this be the case. To try it simply have some entry like this in your input operation : <soap:header required="false" message="tns:tracking" part="tracking" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> -- Sylvain This message may contain privileged and/or confidential information. If you have received this e-mail in error or are not the intended recipient, you may not use, copy, disseminate or distribute it; do not open any attachments, delete it immediately from your system and notify the sender promptly by e-mail that you have done so. Thank you.
ServiceContext.java
Description: Binary data
HeaderKey.java
Description: Binary data
Header.java
Description: Binary data
Headers.java
Description: Binary data
Index: xml-axis/java/src/org/apache/axis/client/Service.java =================================================================== RCS file: /home/cvspublic/xml-axis/java/src/org/apache/axis/client/Service.java,v retrieving revision 1.49 diff -r1.49 Service.java 60a61,63 > import org.apache.axis.message.SOAPHeaderElement; > import org.apache.axis.serviceContext.*; > 69a73,74 > import javax.xml.soap.*; > 115a121 > private ServiceContext serviceContext = new ServiceContext(); 674a681,735 > > /** > * This method allows a service consumer to set a SOAP Header object defined >through > * <b>soap:header</b> operation element. Every opertaion refering to this >soap:header part in their binding > * will send this object as a SOAP Header. The returned object will overwrite >the current Service's ServiceContext > * instance of this part object. > * @author Sylvain St-Germain ([EMAIL PROTECTED]) > * @return void > */ > public void setHeader(String partName, Object header) { > serviceContext.setHeader( new HeaderKey("", partName), header); > } > > /** > * This method is meant to be used by the service consumer to retreive a >Service's ServiceContext header object. > * It returns the current object stored for the given part name. The object is >either the one previously set by the > * user before the call to invoke or the object returned by the service provider >for that part. > * @author Sylvain St-Germain ([EMAIL PROTECTED]) > * @return Object > */ > public Object getHeader(String partName) { > return serviceContext.getHeader("", partName); > } > > /** > * This method is meant to be used by the BindingStub to set the requested >header onto the Call object > * just before the call gets invoked. > * @author Sylvain St-Germain ([EMAIL PROTECTED]) > * @return SOAPHeaderElement > */ > public SOAPHeaderElement getHeader(String namespace, String partName) { > > return new SOAPHeaderElement(namespace, partName, serviceContext.getHeader("", >partName) ); > } > > /** > * This method is provided with the soap:header part name and the namespace so >it can update the > * Header object stored in the Service's ServiceContext using the one retreived >in the response > * @author Sylvain St-Germain ([EMAIL PROTECTED]) > * @return void > */ > public void updateHeader(String namespace, String partName) { > > try { > org.apache.axis.Message response = >getCall().getMessageContext().getResponseMessage(); > org.apache.axis.message.SOAPEnvelope env = >response.getSOAPEnvelope(); > > SOAPHeaderElement header = >env.getHeaderByName(namespace, partName, true); > > serviceContext.setHeader(new HeaderKey("", partName), >header.getObjectValue()); > > } catch ( Exception e ) { > // TBD : Swallow it... for now... > System.out.println("Header update problem : " + e); > > } > } Index: xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java =================================================================== RCS file: /home/cvspublic/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java,v retrieving revision 1.55 diff -r1.55 JavaStubWriter.java 70a71 > import javax.wsdl.extensions.soap.SOAPHeader; 73a75 > import java.util.Enumeration; 231a234,235 > Headers headers = new Headers(); > 259a264,266 > > boolean namespaceFound = false; > 262c269 < if (obj instanceof SOAPBody) { --- > if ( !namespaceFound && obj instanceof SOAPBody) { 269c276,281 < break; --- > > namespaceFound = true; > > } else if (obj instanceof SOAPHeader) { > > headers.list.add( new Header((SOAPHeader)obj) ); > > 285c297 < operation, parameters, soapAction, namespace, isRPC); --- > operation, headers, parameters, soapAction, namespace, >isRPC); 468a481 > Headers headers, 578a592,599 > // Set the headers > pw.println(); > Enumeration headersEnum = headers.list.elements(); > while ( headersEnum.hasMoreElements() ) { > Header h = (Header)headersEnum.nextElement(); > pw.println(" call.addHeader( call.getService().getHeader( \"" + >namespace + "\", \"" + h.getPartName() + "\"));"); > } > 606a628,636 > > // Update the headers > headersEnum = headers.list.elements(); > while ( headersEnum.hasMoreElements() ) { > Header h = (Header)headersEnum.nextElement(); > pw.println(" call.getService().updateHeader( \"" + namespace + >"\", \"" + h.getPartName() + "\");"); > } > > pw.println();