JavaXT
|
|
SoapResponse Classpackage javaxt.webservices; import org.w3c.dom.*; import javaxt.xml.DOM; //****************************************************************************** //** SoapResponse Class //****************************************************************************** /** * Used to encapsulate an XML/SOAP message returned from a WebService. * ******************************************************************************/ public class SoapResponse { private java.net.URL url; private java.util.Map<String, java.util.List<String>> headers; private String body; private String message; //************************************************************************** //** Constructor //************************************************************************** /** Instantiates this class using an HTTP Response object. Note that the * entire response is parsed and stored as a class variable. This can be * problematic when dealing with very large SOAP messages. */ protected SoapResponse(javaxt.http.Response response, String resultsNode) throws SoapException { int status = response.getStatus(); if (status==200 || status==202 || status==203){ body = response.getText(); if (body!=null){ url = response.getURL(); headers = response.getHeaders(); //Parse Response Document xml = DOM.createDocument(body); if (xml!=null){ try{ NodeList Response = xml.getElementsByTagName(resultsNode); if (Response!=null){ //Special Case: Probably Missing Namespace in Soap.resultsNode if (Response.getLength()==0) { resultsNode = getResultsNode(body, resultsNode); Response = xml.getElementsByTagName(resultsNode); } //Get the content of the results node message = DOM.getNodeValue(Response.item(0)); //Hack to deal with unexpected outputs from DOM.getNodeValue(). //If the response node has children, the method will return an //xml fragment which will include the resultsNode as the outer node. //We obvously don't want that so we need to strip out the outer node. if (DOM.hasChildren(Response.item(0))){ message = message.substring(message.indexOf(">")+1); message = message.substring(0, message.lastIndexOf("</")); } } else{ throw new SoapException( "Failed to parse SOAP Response. " + "Could not find the " + resultsNode + " node, " + "possibly due to a service exception.", body); } } catch(Exception e){ throw new SoapException("Failed to parse SOAP Response. " + e.getLocalizedMessage(), body); } } else{ throw new SoapException("Invalid SOAP Response. Response does not appear to be xml.", body); } } else{ throw new SoapException("Invalid SOAP Response.", body); } } else{ throw new SoapException(response.getMessage() + " (" + status + ")", response.getText()); } } private String getResultsNode(String ServiceResponse, String resultsNode){ resultsNode = ServiceResponse.substring(0, ServiceResponse.toLowerCase().indexOf(resultsNode.toLowerCase()) + resultsNode.length()); resultsNode = resultsNode.substring(resultsNode.lastIndexOf("<")+1); return resultsNode; } //************************************************************************** //** getHeaders //************************************************************************** /** Returns key/value map representing all the HTTP headers returned from * the server. */ public java.util.Map<String, java.util.List<String>> getHeaders(){ return headers; } //************************************************************************** //** getURL //************************************************************************** /** Returns the url used to connect to the server. Note that this URL may * differ from the one used to instantiate the Request object. */ public java.net.URL getURL(){ return url; } //************************************************************************** //** getRawResponse //************************************************************************** /** Returns the body of the HTTP response returned from the server. The body * contains the raw XML/SOAP document. */ public String getBody(){ return body; } //************************************************************************** //** toXML //************************************************************************** /** Converts the raw response found in the body of the SOAP message into an * xml document. */ public Document toXML(){ return DOM.createDocument(message); } //************************************************************************** //** toByteArray //************************************************************************** /** Converts the raw response found in the body of the SOAP message into a * byte array. Assumes that the response is Base64 encoded. */ public byte[] toByteArray(){ return javaxt.utils.Base64.decode(message.trim()); } //************************************************************************** //** toImage //************************************************************************** /** Converts the raw response found in the body of the SOAP message into an * image. Typically images are encoded in Base64. */ public javaxt.io.Image toImage(){ return new javaxt.io.Image(toByteArray()); } //************************************************************************** //** toString //************************************************************************** /** Returns the raw response found in the body of the SOAP message. */ public String toString(){ return message; } } |