[jboss-cvs] JBossAS SVN: r82113 - in projects/jaxr/trunk/modules/juddi-jaxr/src/main/java/org/jboss/jaxr/juddi: transport and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Dec 8 10:58:29 EST 2008
Author: richard.opalka at jboss.com
Date: 2008-12-08 10:58:29 -0500 (Mon, 08 Dec 2008)
New Revision: 82113
Added:
projects/jaxr/trunk/modules/juddi-jaxr/src/main/java/org/jboss/jaxr/juddi/transport/
projects/jaxr/trunk/modules/juddi-jaxr/src/main/java/org/jboss/jaxr/juddi/transport/SaajTransport.java
Log:
[JAXR-12] resurrect jUDDI transport
Added: projects/jaxr/trunk/modules/juddi-jaxr/src/main/java/org/jboss/jaxr/juddi/transport/SaajTransport.java
===================================================================
--- projects/jaxr/trunk/modules/juddi-jaxr/src/main/java/org/jboss/jaxr/juddi/transport/SaajTransport.java (rev 0)
+++ projects/jaxr/trunk/modules/juddi-jaxr/src/main/java/org/jboss/jaxr/juddi/transport/SaajTransport.java 2008-12-08 15:58:29 UTC (rev 82113)
@@ -0,0 +1,244 @@
+/*
+ * 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.jboss.jaxr.juddi.transport;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.URL;
+
+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 org.apache.juddi.IRegistry;
+import org.apache.juddi.error.RegistryException;
+import org.apache.juddi.proxy.Transport;
+import org.apache.juddi.util.xml.XMLUtils;
+import org.jboss.logging.Logger;
+import org.jboss.util.xml.DOMWriter;
+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;
+
+/**
+ * Transport based on SAAJ
+ *
+ * @author Anil Saldhana (anil at apache.org)
+ */
+public class SaajTransport implements Transport
+{
+ // private reference to the jUDDI logger
+ private static Logger log = Logger.getLogger(SaajTransport.class);
+
+ /**
+ * @see Transport#send(org.w3c.dom.Element, java.net.URL)
+ */
+ public Element send(Element request, URL endpointURL)
+ throws RegistryException
+ {
+ String requestMessage = XMLUtils.toString(request);
+ log.debug("Request message:" + 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);
+
+ 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);
+ throw new RegistryException(ex);
+ }
+
+ log.debug("Response message:" + XMLUtils.getText(response));
+ return response;
+ }
+
+ /**
+ * @see Transport#send(java.lang.String, java.net.URL)
+ */
+ public String send(String request, URL endpointURL)
+ throws RegistryException
+ {
+ Element reqEl = getElement(request);
+ Element respEl = this.send(reqEl, endpointURL);
+ StringWriter sw = new StringWriter();
+
+ DOMWriter dw = new DOMWriter(sw);
+ dw.print(respEl);
+ return sw.toString();
+ //return XMLUtils.toString(respEl);
+ }
+
+ // PRIVATE METHODS
+
+ private SOAPMessage createSOAPMessage(Element elem) throws Exception
+ {
+ String prefix = "uddi";
+ 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
+ String uddins = IRegistry.UDDI_V2_NAMESPACE;
+ Name bodyName = factory.createName(elem.getNodeName(),prefix,uddins);
+ SOAPBodyElement bodyElement = soapBody.addBodyElement(bodyName);
+ bodyElement.addNamespaceDeclaration(prefix,uddins);
+ 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;
+ //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 = "uddi";
+ String uddins = IRegistry.UDDI_V2_NAMESPACE;
+ 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,uddins);
+ 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());
+ }
+ }
+ }
+
+
+ /**
+ * Get an Element given a string
+ *
+ * @param xmlFrag
+ * @return
+ */
+ 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 e)
+ {
+ log.error("Exception:",e);
+ }
+
+ return reqElement;
+ }
+
+ /**
+ * Return the first child element
+ *
+ * @param el
+ * @return
+ */
+ private Element getFirstChildElement(Element el)
+ {
+ return getFirstChildElement(el, null);
+ }
+
+ /**
+ * Return the first child element for a givenname
+ */
+ 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;
+ }
+ }
+ String responseObtained = XMLUtils.toString(childEl);
+ log.debug("Response obtained="+responseObtained);
+ return childEl;
+ }
+}
More information about the jboss-cvs-commits
mailing list