blob: c46fbe148f3af99e23dcd58eb69c76fc587ea780 [file] [log] [blame]
/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.apache.ws.scout.transport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ws.scout.registry.RegistryException;
import org.apache.ws.scout.transport.Transport;
import org.apache.ws.scout.util.XMLUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import java.io.StringReader;
import java.net.URI;
/**
* Transport based on SAAJ
*
* @author Anil Saldhana (anil@apache.org)
* @author Richard Opalka (richard.opalka@redhat.com)
*/
public class SaajTransport implements Transport {
public static final String UDDI_V2_NAMESPACE = "urn:uddi-org:api_v2";
private static Log log = LogFactory.getLog(SaajTransport.class);
public Element send(Element request, URI endpointURL) throws TransportException {
if (log.isDebugEnabled()) {
String requestMessage = XMLUtils.convertNodeToXMLString(request);
log.debug("Request message: %s\n%s" + endpointURL + ":" + requestMessage);
}
Element response = null;
try {
SOAPMessage message = this.createSOAPMessage(request);
//Make the SAAJ Call now
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection connection = soapConnectionFactory.createConnection();
SOAPMessage soapResponse = connection.call(message, endpointURL.toURL());
SOAPBody soapBody = soapResponse.getSOAPBody();
boolean hasFault = soapBody.hasFault();
if (hasFault) {
SOAPFault soapFault = soapBody.getFault();
String faultStr = soapFault.getFaultCode() + "::" + soapFault.getFaultString();
throw new RegistryException(faultStr);
}
response = getFirstChildElement(soapBody);
} catch (Exception ex) {
log.error("Exception::" + ex.getMessage(), ex);
throw new TransportException(ex);
}
if (log.isDebugEnabled()) {
String responseMessage = XMLUtils.convertNodeToXMLString(response);
log.debug("Response message: %s" + responseMessage);
}
return response;
}
public String send(String request, URI endpointURL) throws TransportException {
Element reqEl = getElement(request);
Element respEl = this.send(reqEl, endpointURL);
return XMLUtils.convertNodeToXMLString(respEl);
}
private SOAPMessage createSOAPMessage(Element elem) throws Exception {
String prefix = "";
MessageFactory msgFactory = MessageFactory.newInstance();
SOAPFactory factory = SOAPFactory.newInstance();
SOAPMessage message = msgFactory.createMessage();
message.getSOAPHeader().detachNode();
SOAPPart soapPart = message.getSOAPPart();
SOAPBody soapBody = soapPart.getEnvelope().getBody();
//Create the outer body element
Name bodyName = factory.createName(elem.getNodeName(), prefix, UDDI_V2_NAMESPACE);
SOAPBodyElement bodyElement = soapBody.addBodyElement(bodyName);
bodyElement.addNamespaceDeclaration(prefix, UDDI_V2_NAMESPACE);
appendAttributes(bodyElement, elem.getAttributes(), factory);
appendElements(bodyElement, elem.getChildNodes(), factory);
return message;
}
private void appendAttributes(SOAPElement bodyElement, NamedNodeMap nnm, SOAPFactory factory) throws SOAPException {
int len = nnm != null ? nnm.getLength() : 0;
for (int i = 0; i < len; i++) {
Node n = nnm.item(i);
String nodename = n.getNodeName();
String nodevalue = n.getNodeValue();
if ("xmlns".equals(nodename))
continue;
if (nodename.startsWith("xmlns:"))
continue;
//Special case: xml:lang
if ("xml:lang".equals(nodename)) {
Name xmlLang = factory.createName("lang", "xml", "");
bodyElement.addAttribute(xmlLang, nodevalue);
} else
bodyElement.addAttribute(factory.createName(nodename), nodevalue);
}
}
private void appendElements(SOAPElement bodyElement, NodeList nlist, SOAPFactory factory) throws SOAPException {
String prefix = "";
int len = nlist != null ? nlist.getLength() : 0;
for (int i = 0; i < len; i++) {
Node node = nlist.item(i);
short nodeType = node != null ? node.getNodeType() : -100;
if (Node.ELEMENT_NODE == nodeType) {
Element el = (Element) node;
Name name = factory.createName(el.getNodeName(), prefix, UDDI_V2_NAMESPACE);
SOAPElement attachedEl = bodyElement.addChildElement(name);
appendAttributes(attachedEl, el.getAttributes(), factory);
appendElements(attachedEl, el.getChildNodes(), factory);
} else if (nodeType == Node.TEXT_NODE) {
bodyElement.addTextNode(node.getNodeValue());
}
}
}
private static Element getElement(String xmlFrag) {
Document doc = null;
Element reqElement = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
doc = factory.newDocumentBuilder().parse(new InputSource(new StringReader(xmlFrag)));
reqElement = doc.getDocumentElement();
} catch (Exception ex) {
log.error("Exception:" + ex.getMessage(), ex);
}
return reqElement;
}
private Element getFirstChildElement(Element el) {
return getFirstChildElement(el, null);
}
private Element getFirstChildElement(Element el, String tagName) {
Element childEl = null;
NodeList nlist = el != null ? el.getChildNodes() : null;
int len = nlist != null ? nlist.getLength() : 0;
for (int i = 0; childEl == null && i < len; i++) {
Node node = nlist.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (tagName == null || tagName.equals(node.getLocalName()))
childEl = (Element) node;
}
}
if (log.isDebugEnabled()) {
String responseObtained = XMLUtils.convertNodeToXMLString(childEl);
log.debug("Response obtained: %s" + responseObtained);
}
return childEl;
}
}