SoapRequest Class

package javaxt.webservices;
import java.net.Proxy;

//******************************************************************************
//**  SoapRequest Class
//******************************************************************************
/**
 *   Used to execute a web service request using XML/SOAP over HTTP.
 *
 ******************************************************************************/

public class SoapRequest {

    private javaxt.http.Request request;
    private String resultsNode;
    private String body;


  //**************************************************************************
  //** Constructor
  //**************************************************************************
  /** Creates a new instance of SoapRequest. */

    public SoapRequest(Service service, Method method, Object parameters) {
        
      //Set the results node
        resultsNode = method.getResultsNodeName();


      //Create new http request
        request = new javaxt.http.Request(service.getURL());

        request.setHeader("Content-Type", "text/xml; charset=utf-8");
        request.setHeader("Accept", "text/html, text/xml, text/plain");

      //Add SoapAction to the header
        String action = method.getSoapAction();
        if (action!=null) request.addHeader("SOAPAction", action);


      //Create body
        String ns = "ns2";
        StringBuffer body = new StringBuffer();
        body.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
              "<soap:Envelope " +
                "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
                "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
                "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
              "<soap:Body>");

      //Add method tag
        //body.append("<" + method.getName() + " xmlns=\"" + service.getNameSpace() + "\">");
        body.append("<" + ns + ":" + method.getName() + " xmlns:" + ns + "=\"" + service.getNameSpace() + "\">");


      //Insert parameters (inside the method node)
        if (parameters!=null){
            if (method.getParameters().getArray()!=null){
                if (parameters instanceof Parameters){
                    body.append(((Parameters) parameters).toString(ns));
                }
                if (parameters instanceof Parameter){
                    Parameters params = method.getParameters();
                    params.setValue((Parameter)parameters);
                    body.append(params.toString(ns));
                }
                else if (parameters instanceof String){
                    body.append(parameters); //assumes parameters is a correctly formatted xml fragment
                }
                else if (parameters instanceof String[]){
                    String[] values = (String[]) parameters;
                    Parameter[] params = method.getParameters().getArray();
                    if (params!=null){
                        for (int i=0; i<params.length; i++ ) {
                             String parameterName = params[i].getName();
                             String parameterValue = values[i];
                             //body.append("<" + parameterName + "><![CDATA[" + parameterValue + "]]></" + parameterName + ">");
                             body.append("<" + ns + ":" + parameterName + ">");
                             body.append(javaxt.xml.DOM.escapeXml(parameterValue));
                             body.append("</" + ns + ":" + parameterName + ">");
                        }
                    }
                }
            }
        }

      //Close tags
        //body.append("</" + method.getName() + ">");
        body.append("</" + ns + ":" + method.getName() + ">");
        body.append("</soap:Body></soap:Envelope>");

        this.body = body.toString();
        request.setHeader("Content-Length", body.length()+"");
    }


  //**************************************************************************
  //** setUseCache
  //**************************************************************************
  /**  Sets the header associated with cache-control. If true, the protocol is
   *   allowed to use caching whenever it can. If false, the protocol must
   *   always try to get a fresh copy of the object. By default, the useCache
   *   variable is set to false.
   */
    public void setUseCache(boolean useCache){
        request.setUseCache(useCache);
    }


  //**************************************************************************
  //** validateSSLCertificates
  //**************************************************************************
  /** Used to enable/disable certificate validation for HTTPS Connections.
   *  Note that this is set to false by default.
   */
    public void validateSSLCertificates(boolean validateCertificates){
        request.validateSSLCertificates(validateCertificates);
    }


  //**************************************************************************
  //** setMaxRedirects
  //**************************************************************************
  /** Sets the maximum number of redirects to follow. By default, this number
   *  is set to 5.
   */
    public void setNumRedirects(int maxRedirects){
        request.setNumRedirects(maxRedirects);
    }

    public void setCredentials(String username, String password){
        request.setCredentials(username, password);
    }

    public void setUserName(String username){
        request.setUserName(username);
    }

    public void setPassword(String password){
        request.setPassword(password);
    }


  //**************************************************************************
  //** setProxy
  //**************************************************************************
  /** Used to set the http proxy.
   */
    public Proxy setProxy(String proxyHost, int proxyPort){
        return request.setProxy(proxyHost, proxyPort);
    }


  //**************************************************************************
  //** setProxy
  //**************************************************************************
  /** Used to set the http proxy.
   */
    public Proxy setProxy(String httpProxy){
        return request.setProxy(httpProxy);
    }

  //**************************************************************************
  //** setProxy
  //**************************************************************************
  /** Used to set the http proxy as needed.
   */
    public void setProxy(Proxy httpProxy){
        request.setProxy(httpProxy);
    }


  //**************************************************************************
  //** setHeader
  //**************************************************************************
  /**  Used to set a Request Property in the HTTP header (e.g. "User-Agent").
   */
    public void setHeader(String key, String value){
        request.setHeader(key, value);
    }

    
  //**************************************************************************
  //** addHeader
  //**************************************************************************
  /**  Used to add a Request Property to the HTTP header (e.g. "User-Agent").
   */
    public void addHeader(String key, String value){
        request.addHeader(key, value);
    }


  //**************************************************************************
  //** getBody
  //**************************************************************************
  /** Returns the raw XML sent to the web service.
   */
    public String getBody(){
        return body;
    }


  //**************************************************************************
  //** getResponse
  //**************************************************************************
  /** Used to execute the web service method specified in the constructor and
   *  returns a response from the server.
   */
    public SoapResponse getResponse() throws SoapException {
        request.write(body);
        return new SoapResponse(request.getResponse(), resultsNode);
    }

}