Author: thomas.diesler(a)jboss.com
Date: 2007-01-16 10:32:38 -0500 (Tue, 16 Jan 2007)
New Revision: 1987
Added:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilder.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderPayload.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderStax.java
Removed:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/JAXWSPayloadBuilder.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/PayloadBuilder.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderDOM.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderStax.java
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchImpl.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/MessageFactoryImpl.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshaller.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPPartImpl.java
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/JBossWSTest.java
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/MessageFactoryTestCase.java
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/jsr181/oneway/JSR181OneWayTestCase.java
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/jsr181/webmethod/JSR181WebMethodTestCase.java
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/provider/ProviderPayloadTestCase.java
Log:
Fix SOAPPart.setContent
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchImpl.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchImpl.java 2007-01-16
15:17:51 UTC (rev 1986)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchImpl.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -298,6 +298,7 @@
SOAPBodyImpl soapBody = (SOAPBodyImpl)resMsg.getSOAPBody();
SOAPElement soapElement = (SOAPElement)soapBody.getChildElements().next();
+ log.debug("JAXB unmarshal: " + DOMWriter.printNode(soapElement,
false));
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
retObj = unmarshaller.unmarshal(soapElement);
}
@@ -308,7 +309,7 @@
}
catch (Exception ex)
{
- throw new WebServiceException("Cannot create request message", ex);
+ throw new WebServiceException("Cannot process response message", ex);
}
return retObj;
}
Copied: trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilder.java (from
rev 1978, trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/PayloadBuilder.java)
===================================================================
--- trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/PayloadBuilder.java 2007-01-16
07:52:19 UTC (rev 1978)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilder.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt 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.ws.core.soap;
+
+// $Id$
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPMessage;
+
+/**
+ * @author Heiko Braun, <heiko.braun(a)jboss.com>
+ * @author Thomas.Diesler(a)jboss.com
+ * @since 19-Apr-2006
+ */
+public interface EnvelopeBuilder
+{
+ SOAPEnvelope build(SOAPMessage soapMessage, InputStream in, boolean ignoreParseError)
throws IOException, SOAPException;
+}
Copied: trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java
(from rev 1978,
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderDOM.java)
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderDOM.java 2007-01-16
07:52:19 UTC (rev 1978)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -0,0 +1,277 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt 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.ws.core.soap;
+
+//$Id$
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.Detail;
+import javax.xml.soap.Name;
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPHeader;
+import javax.xml.soap.SOAPMessage;
+
+import org.jboss.logging.Logger;
+import org.jboss.ws.WSException;
+import org.jboss.ws.core.jaxrpc.Style;
+import org.jboss.ws.core.utils.DOMUtils;
+import org.jboss.ws.core.utils.DOMWriter;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+/**
+ * A SOAPEnvelope builder for JAXRPC based on DOM
+ *
+ * @author Heiko Braun, <heiko.braun(a)jboss.com>
+ * @author Thomas.Diesler(a)jboss.com
+ * @since 19-Apr-2006
+ */
+public class EnvelopeBuilderDOM implements EnvelopeBuilder
+{
+ // provide logging
+ private static Logger log = Logger.getLogger(EnvelopeBuilderDOM.class);
+
+ private Style style = Style.DOCUMENT;
+
+ public EnvelopeBuilderDOM(Style style)
+ {
+ this.style = style;
+ }
+
+ public SOAPEnvelope build(SOAPMessage soapMessage, InputStream ins, boolean
ignoreParseError) throws IOException, SOAPException
+ {
+ // Parse the XML input stream
+ Element domEnv = null;
+ try
+ {
+ domEnv = DOMUtils.parse(ins);
+ }
+ catch (IOException ex)
+ {
+ if (ignoreParseError)
+ {
+ return null;
+ }
+ throw ex;
+ }
+
+ return build(soapMessage, domEnv);
+ }
+
+ public SOAPEnvelope build(SOAPMessage soapMessage, Element domEnv) throws
SOAPException
+ {
+ String envNS = domEnv.getNamespaceURI();
+ String envPrefix = domEnv.getPrefix();
+
+ // Construct the envelope
+ SOAPFactoryImpl soapFactory = new SOAPFactoryImpl();
+ SOAPPartImpl soapPart = (SOAPPartImpl)soapMessage.getSOAPPart();
+ SOAPEnvelopeImpl soapEnv = new SOAPEnvelopeImpl(soapPart,
soapFactory.createElement(domEnv, false));
+
+ DOMUtils.copyAttributes(soapEnv, domEnv);
+
+ // Add the header elements
+ Element domHeader = DOMUtils.getFirstChildElement(domEnv, new QName(envNS,
"Header"));
+ if (domHeader != null)
+ {
+ SOAPHeader soapHeader = soapEnv.getHeader();
+
+ DOMUtils.copyAttributes(soapHeader, domHeader);
+
+ Iterator it = DOMUtils.getChildElements(domHeader);
+ while (it.hasNext())
+ {
+ Element srcElement = (Element)it.next();
+ //registerNamespacesLocally(srcElement);
+ String xmlFragment = DOMWriter.printNode(srcElement, false);
+
+ Name name = new NameImpl(srcElement.getLocalName(), srcElement.getPrefix(),
srcElement.getNamespaceURI());
+ SOAPContentElement destElement = new SOAPHeaderElementImpl(name);
+ soapHeader.addChildElement(destElement);
+
+ DOMUtils.copyAttributes(destElement, srcElement);
+ destElement.setXMLFragment(xmlFragment);
+ }
+ }
+
+ // Add the body elements
+ Element domBody = DOMUtils.getFirstChildElement(domEnv, new QName(envNS,
"Body"));
+ SOAPBody soapBody = soapEnv.getBody();
+
+ DOMUtils.copyAttributes(soapBody, domBody);
+
+ Iterator itBody = DOMUtils.getChildElements(domBody);
+ if (itBody.hasNext())
+ {
+ Element domBodyElement = (Element)itBody.next();
+
+ String localName = domBodyElement.getLocalName();
+ String prefix = domBodyElement.getPrefix();
+ String nsURI = domBodyElement.getNamespaceURI();
+ Name beName = new NameImpl(localName, prefix, nsURI);
+
+ // Process a <env:Fault> message
+ if (beName.equals(new NameImpl("Fault", envPrefix, envNS)))
+ {
+ SOAPFaultImpl soapFault = new SOAPFaultImpl(envPrefix, envNS);
+ soapBody.addChildElement(soapFault);
+
+ DOMUtils.copyAttributes(soapFault, domBodyElement);
+
+ Element domFaultCode = DOMUtils.getFirstChildElement(domBodyElement, new
QName("faultcode"));
+ if (domFaultCode == null)
+ throw new SOAPException("SOAPFault does not contain a
<faultcode> element");
+
+ Element domFaultString = DOMUtils.getFirstChildElement(domBodyElement, new
QName("faultstring"));
+ if (domFaultString == null)
+ throw new SOAPException("SOAPFault does not contain a
<faultstring> element");
+
+ String faultCode = DOMUtils.getTextContent(domFaultCode);
+ soapFault.setFaultCode(faultCode);
+
+ String faultString = DOMUtils.getTextContent(domFaultString);
+ soapFault.setFaultString(faultString);
+
+ Element domFaultActor = DOMUtils.getFirstChildElement(domBodyElement, new
QName("faultactor"));
+ if (domFaultActor != null)
+ {
+ String faultActor = DOMUtils.getTextContent(domFaultActor);
+ soapFault.setFaultActor(faultActor);
+ }
+
+ // Add the fault detail
+ Element domFaultDetail = DOMUtils.getFirstChildElement(domBodyElement,
"detail");
+ if (domFaultDetail != null)
+ {
+ Detail detail = soapFault.addDetail();
+ Iterator it = DOMUtils.getChildElements(domFaultDetail);
+ while (it.hasNext())
+ {
+ Element domElement = (Element)it.next();
+ SOAPElement detailEntry = new
DetailEntryImpl(soapFactory.createElement(domElement));
+ detailEntry = detail.addChildElement(detailEntry);
+ }
+ }
+ }
+
+ // Process and RPC or DOCUMENT style message
+ else
+ {
+
+ if (style == Style.RPC)
+ {
+ SOAPBodyElementRpc soapBodyElement = new SOAPBodyElementRpc(beName);
+ soapBodyElement =
(SOAPBodyElementRpc)soapBody.addChildElement(soapBodyElement);
+
+ DOMUtils.copyAttributes(soapBodyElement, domBodyElement);
+
+ Iterator itBodyElement = DOMUtils.getChildElements(domBodyElement);
+ while (itBodyElement.hasNext())
+ {
+ Element srcElement = (Element)itBodyElement.next();
+ registerNamespacesLocally(srcElement);
+
+ Name name = new NameImpl(srcElement.getLocalName(),
srcElement.getPrefix(), srcElement.getNamespaceURI());
+ SOAPContentElement destElement = new SOAPContentElement(name);
+ destElement =
(SOAPContentElement)soapBodyElement.addChildElement(destElement);
+
+ DOMUtils.copyAttributes(destElement, srcElement);
+
+ String xmlFragment = DOMWriter.printNode(srcElement, false);
+ destElement.setXMLFragment(xmlFragment);
+ }
+ }
+ else if (style == Style.DOCUMENT)
+ {
+ Element srcElement = (Element)domBodyElement;
+ registerNamespacesLocally(srcElement);
+ SOAPContentElement destElement = new SOAPBodyElementDoc(beName);
+ destElement = (SOAPContentElement)soapBody.addChildElement(destElement);
+
+ DOMUtils.copyAttributes(destElement, srcElement);
+
+ String xmlFragment = DOMWriter.printNode(srcElement, false);
+ destElement.setXMLFragment(xmlFragment);
+ }
+ else if (style == null)
+ {
+ SOAPBodyElementMessage soapBodyElement = new
SOAPBodyElementMessage(beName);
+ soapBodyElement =
(SOAPBodyElementMessage)soapBody.addChildElement(soapBodyElement);
+
+ DOMUtils.copyAttributes(soapBodyElement, domBodyElement);
+
+ NodeList nlist = domBodyElement.getChildNodes();
+ for (int i = 0; i < nlist.getLength(); i++)
+ {
+ org.w3c.dom.Node child = nlist.item(i);
+ short childType = child.getNodeType();
+ if (childType == org.w3c.dom.Node.ELEMENT_NODE)
+ {
+ SOAPElement soapElement =
soapFactory.createElement((Element)child);
+ soapBodyElement.addChildElement(soapElement);
+ }
+ else if (childType == org.w3c.dom.Node.TEXT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ soapBodyElement.addTextNode(nodeValue);
+ }
+ else if (childType == org.w3c.dom.Node.CDATA_SECTION_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ soapBodyElement.addTextNode(nodeValue);
+ }
+ else
+ {
+ log.warn("Ignore child type: " + childType);
+ }
+ }
+ }
+ else
+ {
+ throw new WSException("Unsupported message style: " + style);
+ }
+ }
+ }
+
+ return soapEnv;
+ }
+
+ /**
+ * Register globally available namespaces on element level.
+ * This is necessary to ensure that each xml fragment is valid.
+ */
+ private void registerNamespacesLocally(Element srcElement) {
+ if(srcElement.getPrefix()== null)
+ {
+ srcElement.setAttribute("xmlns", srcElement.getNamespaceURI());
+ }
+ else
+ {
+ srcElement.setAttribute("xmlns:"+srcElement.getPrefix(),
srcElement.getNamespaceURI());
+ }
+ }
+}
Copied:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderPayload.java (from
rev 1978,
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/JAXWSPayloadBuilder.java)
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/JAXWSPayloadBuilder.java 2007-01-16
07:52:19 UTC (rev 1978)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderPayload.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -0,0 +1,114 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt 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.ws.core.soap;
+
+//$Id$
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.Name;
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPHeader;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.transform.dom.DOMSource;
+
+import org.jboss.ws.core.utils.DOMUtils;
+import org.jboss.ws.core.utils.DOMWriter;
+import org.w3c.dom.Element;
+
+/**
+ * A SOAPEnvelope builder for JAXWS in service mode PAYLOAD
+ *
+ * @author Thomas.Diesler(a)jboss.com
+ * @since 30-Jun-2006
+ */
+public class EnvelopeBuilderPayload implements EnvelopeBuilder
+{
+ public SOAPEnvelope build(SOAPMessage soapMessage, InputStream ins, boolean
ignoreParseError) throws IOException, SOAPException
+ {
+ // Parse the XML input stream
+ Element domEnv = null;
+ try
+ {
+ domEnv = DOMUtils.parse(ins);
+ }
+ catch (IOException ex)
+ {
+ if (ignoreParseError)
+ {
+ return null;
+ }
+ throw ex;
+ }
+
+ String envNS = domEnv.getNamespaceURI();
+
+ // Construct the envelope
+ SOAPFactoryImpl soapFactory = new SOAPFactoryImpl();
+ SOAPPartImpl soapPart = (SOAPPartImpl)soapMessage.getSOAPPart();
+ SOAPEnvelopeImpl soapEnv = new SOAPEnvelopeImpl(soapPart,
soapFactory.createElement(domEnv, false));
+
+ DOMUtils.copyAttributes(soapEnv, domEnv);
+
+ // Add the header elements
+ Element domHeader = DOMUtils.getFirstChildElement(domEnv, new QName(envNS,
"Header"));
+ if (domHeader != null)
+ {
+ SOAPHeader soapHeader = soapEnv.getHeader();
+
+ DOMUtils.copyAttributes(soapHeader, domHeader);
+
+ Iterator it = DOMUtils.getChildElements(domHeader);
+ while (it.hasNext())
+ {
+ Element srcElement = (Element)it.next();
+ String xmlFragment = DOMWriter.printNode(srcElement, false);
+
+ Name name = new NameImpl(srcElement.getLocalName(), srcElement.getPrefix(),
srcElement.getNamespaceURI());
+ SOAPContentElement destElement = new SOAPHeaderElementImpl(name);
+ soapHeader.addChildElement(destElement);
+
+ DOMUtils.copyAttributes(destElement, srcElement);
+ destElement.setXMLFragment(xmlFragment);
+ }
+ }
+
+ // Add the body elements
+ Element domBody = DOMUtils.getFirstChildElement(domEnv, new QName(envNS,
"Body"));
+ SOAPBodyImpl soapBody = (SOAPBodyImpl)soapEnv.getBody();
+
+ DOMUtils.copyAttributes(soapBody, domBody);
+
+ Iterator itBody = DOMUtils.getChildElements(domBody);
+ if (itBody.hasNext())
+ {
+ Element domBodyElement = (Element)itBody.next();
+ soapBody.setPayload(new DOMSource(domBodyElement));
+ }
+
+ return soapEnv;
+ }
+}
Copied: trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderStax.java
(from rev 1978,
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderStax.java)
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderStax.java 2007-01-16
07:52:19 UTC (rev 1978)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderStax.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -0,0 +1,465 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt 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.ws.core.soap;
+
+// $Id$
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.Name;
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPFault;
+import javax.xml.soap.SOAPHeader;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.w3c.dom.Element;
+
+import com.ctc.wstx.stax.WstxInputFactory;
+
+/**
+ * A SOAPEnvelope builder for JAXRPC based on Stax
+ *
+ * @author Heiko Braun, <heiko.braun(a)jboss.com>
+ * @author Thomas.Diesler(a)jboss.com
+ * @since 15-Apr-2006
+ */
+public class EnvelopeBuilderStax implements EnvelopeBuilder
+{
+ private static final String END_ELEMENT_BRACKET = "</";
+ private static final String EMPTY_STRING = "";
+ private static final String CLOSING_BRACKET = ">";
+ private static final String START_ELEMENT_BRACKET = "<";
+ private static final String HEADER_ELEMENT_NAME = "Header";
+ private static final String BODY_ELEMENT_NAME = "Body";
+ private static final String FAULT_ELEMENT_NAME = "Fault";
+
+ private static enum Part
+ {
+ ENVELOPE, HEADER, BODY, FAULT, RPC_PAYLOAD, DOC_PAYLOAD, BARE_PAYLOAD
+ }
+
+ private Part currentPart = Part.ENVELOPE;
+ private Part previousPart = null;
+
+ // saaj
+ private SOAPPartImpl soapPart;
+ private SOAPEnvelopeImpl soapEnv;
+
+ private StringBuffer fragmentBuffer;
+ private QName fragmentRootCursor = null;
+ private QName currentRootElement = null;
+ private XMLStreamReader reader;
+
+ private static XMLInputFactory factory;
+
+ public EnvelopeBuilderStax()
+ {
+ resetFragmentBuffer();
+ }
+
+ private void resetFragmentBuffer()
+ {
+ this.fragmentBuffer = new StringBuffer();
+ this.fragmentBuffer.ensureCapacity(2048);
+ }
+
+ public SOAPEnvelope build(SOAPMessage soapMessage, InputStream in, boolean
ignoreParseError) throws IOException, SOAPException
+ {
+ try
+ {
+ reader = getFactoryInstance().createXMLStreamReader(in);
+ }
+ catch (XMLStreamException e)
+ {
+ throw new IOException("Failed to create stream reader:" +
e.getMessage());
+ }
+
+ try
+ {
+ soapPart = (SOAPPartImpl)soapMessage.getSOAPPart();
+
+ while (reader.hasNext())
+ {
+
+ if (reader.isStartElement())
+ {
+ processStartElement();
+ }
+ else if (reader.isCharacters())
+ {
+ processCharacters();
+ }
+ else if (reader.isEndElement())
+ {
+ processEndElement();
+ }
+
+ reader.next();
+ }
+
+ }
+ catch (XMLStreamException e)
+ {
+ if (!ignoreParseError)
+ throw new IOException("Failed to parse stream: " +
e.getMessage());
+ }
+ finally
+ {
+ try
+ {
+ if (reader != null)
+ reader.close();
+ }
+ catch (XMLStreamException e)
+ {
+ // ignore
+ }
+ }
+ return soapEnv;
+ }
+
+ private static synchronized XMLInputFactory getFactoryInstance()
+ {
+ if (null == factory)
+ {
+ System.setProperty("javax.xml.stream.XMLInputFactory",
"com.ctc.wstx.stax.WstxInputFactory");
+ //System.setProperty("javax.xml.stream.XMLInputFactory",
"com.sun.xml.stream.ZephyrParserFactory");
+ factory = XMLInputFactory.newInstance();
+ factory.setProperty(XMLInputFactory.IS_VALIDATING, Boolean.FALSE);
+ ((WstxInputFactory)factory).configureForSpeed();
+ }
+ return factory;
+
+ }
+
+ private void processCharacters() throws SOAPException
+ {
+ if (fragmentRootCursor != null)
+ consumeCharacters();
+ }
+
+ private void consumeCharacters() throws SOAPException
+ {
+
+ String text = normalize(reader.getText());
+
+ if (!atPartMargin() && !reader.isWhiteSpace())
+ {
+
+ fragmentBuffer.append(text);
+
+ if (Part.FAULT == currentPart)
+ {
+ String localName = currentRootElement.getLocalPart();
+ SOAPFault fault = soapEnv.getBody().getFault();
+ if ("faultcode".equalsIgnoreCase(localName))
+ fault.setFaultCode(text);
+ else if ("faultactor".equalsIgnoreCase(localName))
+ fault.setFaultActor(text);
+ else if ("faultstring".equalsIgnoreCase(localName))
+ fault.setFaultString(text);
+ }
+ }
+ }
+
+ private void processEndElement() throws SOAPException
+ {
+ if (fragmentRootCursor != null)
+ consumeEndElement();
+ }
+
+ private void consumeEndElement() throws SOAPException
+ {
+
+ QName qName = reader.getName();
+
+ fragmentBuffer.append(END_ELEMENT_BRACKET);
+ fragmentBuffer.append(getFQElementName(qName));
+ fragmentBuffer.append(CLOSING_BRACKET);
+
+ if (fragmentRootCursor != null && fragmentRootCursor.equals(qName))
+ {
+ flushBuffer();
+ fragmentRootCursor = null;
+ }
+ }
+
+ private void flushBuffer() throws SOAPException
+ {
+ if (Part.HEADER == currentPart)
+ {
+ SOAPHeader soapHeader = soapEnv.getHeader();
+ SOAPContentElement lastHeaderElement =
(SOAPContentElement)soapHeader.getChildNodes().item(soapHeader.getChildNodes().getLength()
- 1);
+
+ lastHeaderElement.setXMLFragment(fragmentBuffer.toString());
+ }
+ else if (Part.BODY == currentPart)
+ {
+ SOAPBody soapBody = soapEnv.getBody();
+ SOAPContentElement lastBodyElement =
(SOAPContentElement)soapBody.getChildNodes().item(soapBody.getChildNodes().getLength() -
1);
+ lastBodyElement.setXMLFragment(fragmentBuffer.toString());
+ }
+ else if (Part.FAULT == currentPart)
+ {
+ SOAPBody soapBody = soapEnv.getBody();
+ SOAPContentElement faultElement = (SOAPContentElement)soapBody.getFault();
+ faultElement.setXMLFragment(fragmentBuffer.toString());
+ }
+
+ resetFragmentBuffer();
+ }
+
+ private void processStartElement() throws SOAPException
+ {
+
+ QName qName = reader.getName();
+ currentRootElement = qName;
+
+ // identify current envelope part
+ togglePartMargin(qName);
+
+ // toggle current element
+ Element destElement = null;
+ if (Part.ENVELOPE == currentPart)
+ {
+ // setup envelope impl
+ soapEnv = new SOAPEnvelopeImpl(soapPart, qName.getNamespaceURI());
+ destElement = soapEnv; // soapEnv becomes current
+ }
+ else if (Part.HEADER == currentPart)
+ {
+ if (atPartMargin())
+ {
+ // the env:Header element itself
+ SOAPHeader soapHeader = soapEnv.getHeader();
+ destElement = soapHeader; // header becomes current
+ previousPart = Part.HEADER;
+ }
+ else
+ {
+ // child element of env:Header
+ if (fragmentRootCursor == null)
+ {
+ Name name = new NameImpl(qName.getLocalPart(), qName.getPrefix(),
qName.getNamespaceURI());
+ SOAPContentElement headerElement = new SOAPHeaderElementImpl(name);
+ soapEnv.getHeader().addChildElement(headerElement);
+
+ destElement = headerElement; // headerElement becomes current
+ fragmentRootCursor = qName;
+ }
+
+ consumeStartElement();
+ }
+ }
+ else if (Part.BODY == currentPart)
+ {
+
+ SOAPBody soapBody = soapEnv.getBody();
+
+ if (atPartMargin())
+ {
+ // the env:Body element
+ destElement = soapBody;
+ previousPart = Part.BODY;
+ }
+ else
+ {
+ // payload not fault
+ Name bodyElementName = new NameImpl(qName.getLocalPart(), qName.getPrefix(),
qName.getNamespaceURI());
+
+ if (fragmentRootCursor == null)
+ {
+ SOAPBodyElementDoc docBodyElement = new
SOAPBodyElementDoc(bodyElementName);
+ docBodyElement =
(SOAPBodyElementDoc)soapBody.addChildElement(docBodyElement);
+
+ destElement = docBodyElement;
+ fragmentRootCursor = qName;
+ }
+
+ consumeStartElement();
+ }
+ }
+ else if (Part.FAULT == currentPart)
+ {
+ // payload is fault
+ if (atPartMargin())
+ {
+ SOAPBody soapBody = soapEnv.getBody();
+ SOAPFaultImpl soapFault = new SOAPFaultImpl(soapEnv.getPrefix(),
soapEnv.getNamespaceURI());
+ soapBody.addChildElement(soapFault);
+ destElement = soapFault;
+ previousPart = Part.FAULT;
+ }
+
+ if (fragmentRootCursor == null)
+ {
+ fragmentRootCursor = qName;
+ }
+
+ consumeStartElement();
+ }
+
+ if (fragmentRootCursor == null) // constructing soap elements
+ {
+ copyAttributes(destElement);
+ }
+ }
+
+ private void togglePartMargin(QName qName)
+ {
+ // identify the current part
+ if (qName.getLocalPart().equalsIgnoreCase(HEADER_ELEMENT_NAME))
+ {
+ previousPart = currentPart;
+ currentPart = Part.HEADER;
+ }
+ else if (qName.getLocalPart().equalsIgnoreCase(BODY_ELEMENT_NAME))
+ {
+ previousPart = currentPart;
+ currentPart = Part.BODY;
+ }
+ else if (qName.getLocalPart().equalsIgnoreCase(FAULT_ELEMENT_NAME))
+ {
+ previousPart = currentPart;
+ currentPart = Part.FAULT;
+ }
+ }
+
+ private void consumeStartElement()
+ {
+
+ QName qName = reader.getName();
+
+ // element
+ fragmentBuffer.append(START_ELEMENT_BRACKET);
+ fragmentBuffer.append(getFQElementName(qName));
+
+ // local namespaces
+ for (int x = 0; x < reader.getNamespaceCount(); x++)
+ {
+ if (reader.getNamespacePrefix(x) != null)
+ {
+ fragmentBuffer.append(" xmlns:");
+
fragmentBuffer.append(reader.getNamespacePrefix(x)).append("='");
+ fragmentBuffer.append(reader.getNamespaceURI(x)).append("'");
+ }
+ else if (reader.getNamespaceURI(x) != null)
+ {
+ fragmentBuffer.append(" xmlns='");
+ fragmentBuffer.append(reader.getNamespaceURI(x)).append("'");
+ }
+ }
+
+ // attributes
+ if (reader.getAttributeCount() > 0)
+ {
+ for (int i = 0; i < reader.getAttributeCount(); i++)
+ {
+ QName attQName = reader.getAttributeName(i);
+ fragmentBuffer.append(" ").append(getFQElementName(attQName));
+
fragmentBuffer.append("='").append(reader.getAttributeValue(i)).append("'");
+ }
+ }
+
+ fragmentBuffer.append(CLOSING_BRACKET);
+ }
+
+ private String getFQElementName(QName qName)
+ {
+ return !qName.getPrefix().equals(EMPTY_STRING) ? qName.getPrefix() + ":"
+ qName.getLocalPart() : qName.getLocalPart();
+ }
+
+ private void copyAttributes(Element destElement)
+ {
+
+ if (reader.getAttributeCount() == 0)
+ return;
+
+ for (int i = 0; i < reader.getAttributeCount(); i++)
+ {
+ destElement.setAttributeNS(reader.getAttributeNamespace(i),
reader.getAttributeLocalName(i), reader.getAttributeValue(i));
+ }
+ }
+
+ private boolean atPartMargin()
+ {
+ return previousPart != currentPart;
+ }
+
+ private static String normalize(String valueStr)
+ {
+ // We assume most strings will not contain characters that need
"escaping",
+ // and optimize for this case.
+ boolean found = false;
+ int i = 0;
+
+ outer: for (; i < valueStr.length(); i++)
+ {
+ switch (valueStr.charAt(i))
+ {
+ case '<':
+ case '>':
+ case '&':
+ case '"':
+ found = true;
+ break outer;
+ }
+ }
+
+ if (!found)
+ return valueStr;
+
+ // Resume where we left off
+ StringBuilder builder = new StringBuilder();
+ builder.append(valueStr.substring(0, i));
+ for (; i < valueStr.length(); i++)
+ {
+ char c = valueStr.charAt(i);
+ switch (c)
+ {
+ case '<':
+ builder.append("<");
+ break;
+ case '>':
+ builder.append(">");
+ break;
+ case '&':
+ builder.append("&");
+ break;
+ case '"':
+ builder.append(""");
+ break;
+ default:
+ builder.append(c);
+ }
+ }
+
+ return builder.toString();
+ }
+}
Deleted: trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/JAXWSPayloadBuilder.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/JAXWSPayloadBuilder.java 2007-01-16
15:17:51 UTC (rev 1986)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/JAXWSPayloadBuilder.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -1,110 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt 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.ws.core.soap;
-
-//$Id$
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-
-import javax.xml.namespace.QName;
-import javax.xml.soap.Name;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPHeader;
-import javax.xml.transform.dom.DOMSource;
-
-import org.jboss.ws.core.utils.DOMUtils;
-import org.jboss.ws.core.utils.DOMWriter;
-import org.w3c.dom.Element;
-
-/**
- * A SOAPEnvelope builder for JAXWS in service mode PAYLOAD
- *
- * @author Thomas.Diesler(a)jboss.com
- * @since 30-Jun-2006
- */
-public class JAXWSPayloadBuilder implements PayloadBuilder
-{
- public void build(SOAPMessageImpl soapMessage, InputStream ins, boolean
ignoreParseError) throws IOException, SOAPException
- {
- // Parse the XML input stream
- Element domEnv = null;
- try
- {
- domEnv = DOMUtils.parse(ins);
- }
- catch (IOException ex)
- {
- if (ignoreParseError)
- {
- return;
- }
- throw ex;
- }
-
- String envNS = domEnv.getNamespaceURI();
-
- // Construct the envelope
- SOAPFactoryImpl soapFactory = new SOAPFactoryImpl();
- SOAPPartImpl soapPart = (SOAPPartImpl)soapMessage.getSOAPPart();
- SOAPEnvelopeImpl soapEnv = new SOAPEnvelopeImpl(soapPart,
soapFactory.createElement(domEnv, false));
-
- DOMUtils.copyAttributes(soapEnv, domEnv);
-
- // Add the header elements
- Element domHeader = DOMUtils.getFirstChildElement(domEnv, new QName(envNS,
"Header"));
- if (domHeader != null)
- {
- SOAPHeader soapHeader = soapEnv.getHeader();
-
- DOMUtils.copyAttributes(soapHeader, domHeader);
-
- Iterator it = DOMUtils.getChildElements(domHeader);
- while (it.hasNext())
- {
- Element srcElement = (Element)it.next();
- String xmlFragment = DOMWriter.printNode(srcElement, false);
-
- Name name = new NameImpl(srcElement.getLocalName(), srcElement.getPrefix(),
srcElement.getNamespaceURI());
- SOAPContentElement destElement = new SOAPHeaderElementImpl(name);
- soapHeader.addChildElement(destElement);
-
- DOMUtils.copyAttributes(destElement, srcElement);
- destElement.setXMLFragment(xmlFragment);
- }
- }
-
- // Add the body elements
- Element domBody = DOMUtils.getFirstChildElement(domEnv, new QName(envNS,
"Body"));
- SOAPBodyImpl soapBody = (SOAPBodyImpl)soapEnv.getBody();
-
- DOMUtils.copyAttributes(soapBody, domBody);
-
- Iterator itBody = DOMUtils.getChildElements(domBody);
- if (itBody.hasNext())
- {
- Element domBodyElement = (Element)itBody.next();
- soapBody.setPayload(new DOMSource(domBodyElement));
- }
- }
-}
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/MessageFactoryImpl.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/MessageFactoryImpl.java 2007-01-16
15:17:51 UTC (rev 1986)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/MessageFactoryImpl.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -37,8 +37,10 @@
import javax.xml.soap.MimeHeader;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPConstants;
+import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
+import javax.xml.transform.dom.DOMSource;
import javax.xml.ws.Service.Mode;
import org.jboss.logging.Logger;
@@ -46,7 +48,9 @@
import org.jboss.ws.core.jaxrpc.Style;
import org.jboss.ws.core.soap.attachment.MimeConstants;
import org.jboss.ws.core.soap.attachment.MultipartRelatedDecoder;
+import org.jboss.ws.core.utils.DOMUtils;
import org.jboss.ws.core.utils.IOUtils;
+import org.w3c.dom.Element;
/**
* MessageFactory implementation
@@ -168,10 +172,10 @@
*/
public SOAPMessage createMessage(MimeHeaders mimeHeaders, InputStream ins) throws
IOException, SOAPException
{
- return createMessageInternal(mimeHeaders, ins, false);
+ return createMessage(mimeHeaders, ins, false);
}
- public SOAPMessage createMessageInternal(MimeHeaders mimeHeaders, InputStream ins,
boolean ignoreParseError) throws IOException, SOAPException
+ public SOAPMessage createMessage(MimeHeaders mimeHeaders, InputStream ins, boolean
ignoreParseError) throws IOException, SOAPException
{
if (mimeHeaders == null)
{
@@ -239,19 +243,18 @@
soapMessage.setAttachments(attachments);
// Get the SOAPEnvelope builder
- PayloadBuilder payloadBuilder;
+ EnvelopeBuilder envBuilder;
if (serviceMode == Mode.PAYLOAD)
{
- payloadBuilder = new JAXWSPayloadBuilder();
+ envBuilder = new EnvelopeBuilderPayload();
}
else
{
- SAAJPayloadBuilderDOM jaxrpcBuilder = new SAAJPayloadBuilderDOM(getStyle());
- payloadBuilder = jaxrpcBuilder;
+ envBuilder = new EnvelopeBuilderDOM(getStyle());
}
// Build the payload
- payloadBuilder.build(soapMessage, ins, ignoreParseError);
+ envBuilder.build(soapMessage, ins, ignoreParseError);
return soapMessage;
}
Deleted: trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/PayloadBuilder.java
===================================================================
--- trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/PayloadBuilder.java 2007-01-16
15:17:51 UTC (rev 1986)
+++ trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/PayloadBuilder.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -1,39 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt 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.ws.core.soap;
-
-// $Id$
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.xml.soap.SOAPException;
-
-/**
- * @author Heiko Braun, <heiko.braun(a)jboss.com>
- * @author Thomas.Diesler(a)jboss.com
- * @since 19-Apr-2006
- */
-public interface PayloadBuilder
-{
- void build(SOAPMessageImpl soapMessage, InputStream in, boolean ignoreParseError)
throws IOException, SOAPException;
-}
Deleted:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderDOM.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderDOM.java 2007-01-16
15:17:51 UTC (rev 1986)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderDOM.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -1,268 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt 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.ws.core.soap;
-
-//$Id$
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-
-import javax.xml.namespace.QName;
-import javax.xml.soap.Detail;
-import javax.xml.soap.Name;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPElement;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPHeader;
-
-import org.jboss.logging.Logger;
-import org.jboss.ws.WSException;
-import org.jboss.ws.core.jaxrpc.Style;
-import org.jboss.ws.core.utils.DOMUtils;
-import org.jboss.ws.core.utils.DOMWriter;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-/**
- * A SOAPEnvelope builder for JAXRPC based on DOM
- *
- * @author Heiko Braun, <heiko.braun(a)jboss.com>
- * @author Thomas.Diesler(a)jboss.com
- * @since 19-Apr-2006
- */
-public class SAAJPayloadBuilderDOM implements PayloadBuilder
-{
- // provide logging
- private static Logger log = Logger.getLogger(SAAJPayloadBuilderDOM.class);
-
- private Style style = Style.DOCUMENT;
-
- public SAAJPayloadBuilderDOM(Style style)
- {
- this.style = style;
- }
-
- public void build(SOAPMessageImpl soapMessage, InputStream ins, boolean
ignoreParseError) throws IOException, SOAPException
- {
- // Parse the XML input stream
- Element domEnv = null;
- try
- {
- domEnv = DOMUtils.parse(ins);
- }
- catch (IOException ex)
- {
- if (ignoreParseError)
- {
- return;
- }
- throw ex;
- }
-
- String envNS = domEnv.getNamespaceURI();
- String envPrefix = domEnv.getPrefix();
-
- // Construct the envelope
- SOAPFactoryImpl soapFactory = new SOAPFactoryImpl();
- SOAPPartImpl soapPart = (SOAPPartImpl)soapMessage.getSOAPPart();
- SOAPEnvelopeImpl soapEnv = new SOAPEnvelopeImpl(soapPart,
soapFactory.createElement(domEnv, false));
-
- DOMUtils.copyAttributes(soapEnv, domEnv);
-
- // Add the header elements
- Element domHeader = DOMUtils.getFirstChildElement(domEnv, new QName(envNS,
"Header"));
- if (domHeader != null)
- {
- SOAPHeader soapHeader = soapEnv.getHeader();
-
- DOMUtils.copyAttributes(soapHeader, domHeader);
-
- Iterator it = DOMUtils.getChildElements(domHeader);
- while (it.hasNext())
- {
- Element srcElement = (Element)it.next();
- //registerNamespacesLocally(srcElement);
- String xmlFragment = DOMWriter.printNode(srcElement, false);
-
- Name name = new NameImpl(srcElement.getLocalName(), srcElement.getPrefix(),
srcElement.getNamespaceURI());
- SOAPContentElement destElement = new SOAPHeaderElementImpl(name);
- soapHeader.addChildElement(destElement);
-
- DOMUtils.copyAttributes(destElement, srcElement);
- destElement.setXMLFragment(xmlFragment);
- }
- }
-
- // Add the body elements
- Element domBody = DOMUtils.getFirstChildElement(domEnv, new QName(envNS,
"Body"));
- SOAPBody soapBody = soapEnv.getBody();
-
- DOMUtils.copyAttributes(soapBody, domBody);
-
- Iterator itBody = DOMUtils.getChildElements(domBody);
- if (itBody.hasNext())
- {
- Element domBodyElement = (Element)itBody.next();
-
- String localName = domBodyElement.getLocalName();
- String prefix = domBodyElement.getPrefix();
- String nsURI = domBodyElement.getNamespaceURI();
- Name beName = new NameImpl(localName, prefix, nsURI);
-
- // Process a <env:Fault> message
- if (beName.equals(new NameImpl("Fault", envPrefix, envNS)))
- {
- SOAPFaultImpl soapFault = new SOAPFaultImpl(envPrefix, envNS);
- soapBody.addChildElement(soapFault);
-
- DOMUtils.copyAttributes(soapFault, domBodyElement);
-
- Element domFaultCode = DOMUtils.getFirstChildElement(domBodyElement, new
QName("faultcode"));
- if (domFaultCode == null)
- throw new SOAPException("SOAPFault does not contain a
<faultcode> element");
-
- Element domFaultString = DOMUtils.getFirstChildElement(domBodyElement, new
QName("faultstring"));
- if (domFaultString == null)
- throw new SOAPException("SOAPFault does not contain a
<faultstring> element");
-
- String faultCode = DOMUtils.getTextContent(domFaultCode);
- soapFault.setFaultCode(faultCode);
-
- String faultString = DOMUtils.getTextContent(domFaultString);
- soapFault.setFaultString(faultString);
-
- Element domFaultActor = DOMUtils.getFirstChildElement(domBodyElement, new
QName("faultactor"));
- if (domFaultActor != null)
- {
- String faultActor = DOMUtils.getTextContent(domFaultActor);
- soapFault.setFaultActor(faultActor);
- }
-
- // Add the fault detail
- Element domFaultDetail = DOMUtils.getFirstChildElement(domBodyElement,
"detail");
- if (domFaultDetail != null)
- {
- Detail detail = soapFault.addDetail();
- Iterator it = DOMUtils.getChildElements(domFaultDetail);
- while (it.hasNext())
- {
- Element domElement = (Element)it.next();
- SOAPElement detailEntry = new
DetailEntryImpl(soapFactory.createElement(domElement));
- detailEntry = detail.addChildElement(detailEntry);
- }
- }
- }
-
- // Process and RPC or DOCUMENT style message
- else
- {
-
- if (style == Style.RPC)
- {
- SOAPBodyElementRpc soapBodyElement = new SOAPBodyElementRpc(beName);
- soapBodyElement =
(SOAPBodyElementRpc)soapBody.addChildElement(soapBodyElement);
-
- DOMUtils.copyAttributes(soapBodyElement, domBodyElement);
-
- Iterator itBodyElement = DOMUtils.getChildElements(domBodyElement);
- while (itBodyElement.hasNext())
- {
- Element srcElement = (Element)itBodyElement.next();
- registerNamespacesLocally(srcElement);
-
- Name name = new NameImpl(srcElement.getLocalName(),
srcElement.getPrefix(), srcElement.getNamespaceURI());
- SOAPContentElement destElement = new SOAPContentElement(name);
- destElement =
(SOAPContentElement)soapBodyElement.addChildElement(destElement);
-
- DOMUtils.copyAttributes(destElement, srcElement);
-
- String xmlFragment = DOMWriter.printNode(srcElement, false);
- destElement.setXMLFragment(xmlFragment);
- }
- }
- else if (style == Style.DOCUMENT)
- {
- Element srcElement = (Element)domBodyElement;
- registerNamespacesLocally(srcElement);
- SOAPContentElement destElement = new SOAPBodyElementDoc(beName);
- destElement = (SOAPContentElement)soapBody.addChildElement(destElement);
-
- DOMUtils.copyAttributes(destElement, srcElement);
-
- String xmlFragment = DOMWriter.printNode(srcElement, false);
- destElement.setXMLFragment(xmlFragment);
- }
- else if (style == null)
- {
- SOAPBodyElementMessage soapBodyElement = new
SOAPBodyElementMessage(beName);
- soapBodyElement =
(SOAPBodyElementMessage)soapBody.addChildElement(soapBodyElement);
-
- DOMUtils.copyAttributes(soapBodyElement, domBodyElement);
-
- NodeList nlist = domBodyElement.getChildNodes();
- for (int i = 0; i < nlist.getLength(); i++)
- {
- org.w3c.dom.Node child = nlist.item(i);
- short childType = child.getNodeType();
- if (childType == org.w3c.dom.Node.ELEMENT_NODE)
- {
- SOAPElement soapElement =
soapFactory.createElement((Element)child);
- soapBodyElement.addChildElement(soapElement);
- }
- else if (childType == org.w3c.dom.Node.TEXT_NODE)
- {
- String nodeValue = child.getNodeValue();
- soapBodyElement.addTextNode(nodeValue);
- }
- else if (childType == org.w3c.dom.Node.CDATA_SECTION_NODE)
- {
- String nodeValue = child.getNodeValue();
- soapBodyElement.addTextNode(nodeValue);
- }
- else
- {
- log.warn("Ignore child type: " + childType);
- }
- }
- }
- else
- {
- throw new WSException("Unsupported message style: " + style);
- }
- }
- }
- }
-
- /**
- * Register globally available namespaces on element level.
- * This is necessary to ensure that each xml fragment is valid.
- */
- private void registerNamespacesLocally(Element srcElement) {
- if(srcElement.getPrefix()== null)
- {
- srcElement.setAttribute("xmlns", srcElement.getNamespaceURI());
- }
- else
- {
- srcElement.setAttribute("xmlns:"+srcElement.getPrefix(),
srcElement.getNamespaceURI());
- }
- }
-}
Deleted:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderStax.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderStax.java 2007-01-16
15:17:51 UTC (rev 1986)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SAAJPayloadBuilderStax.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -1,462 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt 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.ws.core.soap;
-
-// $Id$
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.xml.namespace.QName;
-import javax.xml.soap.Name;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFault;
-import javax.xml.soap.SOAPHeader;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-
-import org.w3c.dom.Element;
-
-import com.ctc.wstx.stax.WstxInputFactory;
-
-/**
- * A SOAPEnvelope builder for JAXRPC based on Stax
- *
- * @author Heiko Braun, <heiko.braun(a)jboss.com>
- * @author Thomas.Diesler(a)jboss.com
- * @since 15-Apr-2006
- */
-public class SAAJPayloadBuilderStax implements PayloadBuilder
-{
- private static final String END_ELEMENT_BRACKET = "</";
- private static final String EMPTY_STRING = "";
- private static final String CLOSING_BRACKET = ">";
- private static final String START_ELEMENT_BRACKET = "<";
- private static final String HEADER_ELEMENT_NAME = "Header";
- private static final String BODY_ELEMENT_NAME = "Body";
- private static final String FAULT_ELEMENT_NAME = "Fault";
-
- private static enum Part
- {
- ENVELOPE, HEADER, BODY, FAULT, RPC_PAYLOAD, DOC_PAYLOAD, BARE_PAYLOAD
- }
-
- private Part currentPart = Part.ENVELOPE;
- private Part previousPart = null;
-
- // saaj
- private SOAPPartImpl soapPart;
- private SOAPEnvelopeImpl soapEnv;
-
- private StringBuffer fragmentBuffer;
- private QName fragmentRootCursor = null;
- private QName currentRootElement = null;
- private XMLStreamReader reader;
-
- private static XMLInputFactory factory;
-
- public SAAJPayloadBuilderStax()
- {
- resetFragmentBuffer();
- }
-
- private void resetFragmentBuffer()
- {
- this.fragmentBuffer = new StringBuffer();
- this.fragmentBuffer.ensureCapacity(2048);
- }
-
- public void build(SOAPMessageImpl soapMessage, InputStream in, boolean
ignoreParseError) throws IOException, SOAPException
- {
- try
- {
- reader = getFactoryInstance().createXMLStreamReader(in);
- }
- catch (XMLStreamException e)
- {
- throw new IOException("Failed to create stream reader:" +
e.getMessage());
- }
-
- try
- {
- soapPart = (SOAPPartImpl)soapMessage.getSOAPPart();
-
- while (reader.hasNext())
- {
-
- if (reader.isStartElement())
- {
- processStartElement();
- }
- else if (reader.isCharacters())
- {
- processCharacters();
- }
- else if (reader.isEndElement())
- {
- processEndElement();
- }
-
- reader.next();
- }
-
- }
- catch (XMLStreamException e)
- {
- if (!ignoreParseError)
- throw new IOException("Failed to parse stream: " +
e.getMessage());
- }
- finally
- {
- try
- {
- if (reader != null)
- reader.close();
- }
- catch (XMLStreamException e)
- {
- // ignore
- }
- }
- }
-
- private static synchronized XMLInputFactory getFactoryInstance()
- {
- if (null == factory)
- {
- System.setProperty("javax.xml.stream.XMLInputFactory",
"com.ctc.wstx.stax.WstxInputFactory");
- //System.setProperty("javax.xml.stream.XMLInputFactory",
"com.sun.xml.stream.ZephyrParserFactory");
- factory = XMLInputFactory.newInstance();
- factory.setProperty(XMLInputFactory.IS_VALIDATING, Boolean.FALSE);
- ((WstxInputFactory)factory).configureForSpeed();
- }
- return factory;
-
- }
-
- private void processCharacters() throws SOAPException
- {
- if (fragmentRootCursor != null)
- consumeCharacters();
- }
-
- private void consumeCharacters() throws SOAPException
- {
-
- String text = normalize(reader.getText());
-
- if (!atPartMargin() && !reader.isWhiteSpace())
- {
-
- fragmentBuffer.append(text);
-
- if (Part.FAULT == currentPart)
- {
- String localName = currentRootElement.getLocalPart();
- SOAPFault fault = soapEnv.getBody().getFault();
- if ("faultcode".equalsIgnoreCase(localName))
- fault.setFaultCode(text);
- else if ("faultactor".equalsIgnoreCase(localName))
- fault.setFaultActor(text);
- else if ("faultstring".equalsIgnoreCase(localName))
- fault.setFaultString(text);
- }
- }
- }
-
- private void processEndElement() throws SOAPException
- {
- if (fragmentRootCursor != null)
- consumeEndElement();
- }
-
- private void consumeEndElement() throws SOAPException
- {
-
- QName qName = reader.getName();
-
- fragmentBuffer.append(END_ELEMENT_BRACKET);
- fragmentBuffer.append(getFQElementName(qName));
- fragmentBuffer.append(CLOSING_BRACKET);
-
- if (fragmentRootCursor != null && fragmentRootCursor.equals(qName))
- {
- flushBuffer();
- fragmentRootCursor = null;
- }
- }
-
- private void flushBuffer() throws SOAPException
- {
- if (Part.HEADER == currentPart)
- {
- SOAPHeader soapHeader = soapEnv.getHeader();
- SOAPContentElement lastHeaderElement =
(SOAPContentElement)soapHeader.getChildNodes().item(soapHeader.getChildNodes().getLength()
- 1);
-
- lastHeaderElement.setXMLFragment(fragmentBuffer.toString());
- }
- else if (Part.BODY == currentPart)
- {
- SOAPBody soapBody = soapEnv.getBody();
- SOAPContentElement lastBodyElement =
(SOAPContentElement)soapBody.getChildNodes().item(soapBody.getChildNodes().getLength() -
1);
- lastBodyElement.setXMLFragment(fragmentBuffer.toString());
- }
- else if (Part.FAULT == currentPart)
- {
- SOAPBody soapBody = soapEnv.getBody();
- SOAPContentElement faultElement = (SOAPContentElement)soapBody.getFault();
- faultElement.setXMLFragment(fragmentBuffer.toString());
- }
-
- resetFragmentBuffer();
- }
-
- private void processStartElement() throws SOAPException
- {
-
- QName qName = reader.getName();
- currentRootElement = qName;
-
- // identify current envelope part
- togglePartMargin(qName);
-
- // toggle current element
- Element destElement = null;
- if (Part.ENVELOPE == currentPart)
- {
- // setup envelope impl
- soapEnv = new SOAPEnvelopeImpl(soapPart, qName.getNamespaceURI());
- destElement = soapEnv; // soapEnv becomes current
- }
- else if (Part.HEADER == currentPart)
- {
- if (atPartMargin())
- {
- // the env:Header element itself
- SOAPHeader soapHeader = soapEnv.getHeader();
- destElement = soapHeader; // header becomes current
- previousPart = Part.HEADER;
- }
- else
- {
- // child element of env:Header
- if (fragmentRootCursor == null)
- {
- Name name = new NameImpl(qName.getLocalPart(), qName.getPrefix(),
qName.getNamespaceURI());
- SOAPContentElement headerElement = new SOAPHeaderElementImpl(name);
- soapEnv.getHeader().addChildElement(headerElement);
-
- destElement = headerElement; // headerElement becomes current
- fragmentRootCursor = qName;
- }
-
- consumeStartElement();
- }
- }
- else if (Part.BODY == currentPart)
- {
-
- SOAPBody soapBody = soapEnv.getBody();
-
- if (atPartMargin())
- {
- // the env:Body element
- destElement = soapBody;
- previousPart = Part.BODY;
- }
- else
- {
- // payload not fault
- Name bodyElementName = new NameImpl(qName.getLocalPart(), qName.getPrefix(),
qName.getNamespaceURI());
-
- if (fragmentRootCursor == null)
- {
- SOAPBodyElementDoc docBodyElement = new
SOAPBodyElementDoc(bodyElementName);
- docBodyElement =
(SOAPBodyElementDoc)soapBody.addChildElement(docBodyElement);
-
- destElement = docBodyElement;
- fragmentRootCursor = qName;
- }
-
- consumeStartElement();
- }
- }
- else if (Part.FAULT == currentPart)
- {
- // payload is fault
- if (atPartMargin())
- {
- SOAPBody soapBody = soapEnv.getBody();
- SOAPFaultImpl soapFault = new SOAPFaultImpl(soapEnv.getPrefix(),
soapEnv.getNamespaceURI());
- soapBody.addChildElement(soapFault);
- destElement = soapFault;
- previousPart = Part.FAULT;
- }
-
- if (fragmentRootCursor == null)
- {
- fragmentRootCursor = qName;
- }
-
- consumeStartElement();
- }
-
- if (fragmentRootCursor == null) // constructing soap elements
- {
- copyAttributes(destElement);
- }
- }
-
- private void togglePartMargin(QName qName)
- {
- // identify the current part
- if (qName.getLocalPart().equalsIgnoreCase(HEADER_ELEMENT_NAME))
- {
- previousPart = currentPart;
- currentPart = Part.HEADER;
- }
- else if (qName.getLocalPart().equalsIgnoreCase(BODY_ELEMENT_NAME))
- {
- previousPart = currentPart;
- currentPart = Part.BODY;
- }
- else if (qName.getLocalPart().equalsIgnoreCase(FAULT_ELEMENT_NAME))
- {
- previousPart = currentPart;
- currentPart = Part.FAULT;
- }
- }
-
- private void consumeStartElement()
- {
-
- QName qName = reader.getName();
-
- // element
- fragmentBuffer.append(START_ELEMENT_BRACKET);
- fragmentBuffer.append(getFQElementName(qName));
-
- // local namespaces
- for (int x = 0; x < reader.getNamespaceCount(); x++)
- {
- if (reader.getNamespacePrefix(x) != null)
- {
- fragmentBuffer.append(" xmlns:");
-
fragmentBuffer.append(reader.getNamespacePrefix(x)).append("='");
- fragmentBuffer.append(reader.getNamespaceURI(x)).append("'");
- }
- else if (reader.getNamespaceURI(x) != null)
- {
- fragmentBuffer.append(" xmlns='");
- fragmentBuffer.append(reader.getNamespaceURI(x)).append("'");
- }
- }
-
- // attributes
- if (reader.getAttributeCount() > 0)
- {
- for (int i = 0; i < reader.getAttributeCount(); i++)
- {
- QName attQName = reader.getAttributeName(i);
- fragmentBuffer.append(" ").append(getFQElementName(attQName));
-
fragmentBuffer.append("='").append(reader.getAttributeValue(i)).append("'");
- }
- }
-
- fragmentBuffer.append(CLOSING_BRACKET);
- }
-
- private String getFQElementName(QName qName)
- {
- return !qName.getPrefix().equals(EMPTY_STRING) ? qName.getPrefix() + ":"
+ qName.getLocalPart() : qName.getLocalPart();
- }
-
- private void copyAttributes(Element destElement)
- {
-
- if (reader.getAttributeCount() == 0)
- return;
-
- for (int i = 0; i < reader.getAttributeCount(); i++)
- {
- destElement.setAttributeNS(reader.getAttributeNamespace(i),
reader.getAttributeLocalName(i), reader.getAttributeValue(i));
- }
- }
-
- private boolean atPartMargin()
- {
- return previousPart != currentPart;
- }
-
- private static String normalize(String valueStr)
- {
- // We assume most strings will not contain characters that need
"escaping",
- // and optimize for this case.
- boolean found = false;
- int i = 0;
-
- outer: for (; i < valueStr.length(); i++)
- {
- switch (valueStr.charAt(i))
- {
- case '<':
- case '>':
- case '&':
- case '"':
- found = true;
- break outer;
- }
- }
-
- if (!found)
- return valueStr;
-
- // Resume where we left off
- StringBuilder builder = new StringBuilder();
- builder.append(valueStr.substring(0, i));
- for (; i < valueStr.length(); i++)
- {
- char c = valueStr.charAt(i);
- switch (c)
- {
- case '<':
- builder.append("<");
- break;
- case '>':
- builder.append(">");
- break;
- case '&':
- builder.append("&");
- break;
- case '"':
- builder.append(""");
- break;
- default:
- builder.append(c);
- }
- }
-
- return builder.toString();
- }
-}
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshaller.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshaller.java 2007-01-16
15:17:51 UTC (rev 1986)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshaller.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -72,7 +72,7 @@
throw new WSException("Invalid HTTP server response [" + resCode +
"] - " + resMessage);
MimeHeaders mimeHeaders = getMimeHeaders(metadata);
- SOAPMessage soapMsg = new
MessageFactoryImpl().createMessageInternal(mimeHeaders, inputStream, true);
+ SOAPMessage soapMsg = new MessageFactoryImpl().createMessage(mimeHeaders,
inputStream, true);
return soapMsg;
}
catch (SOAPException e)
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPPartImpl.java
===================================================================
--- trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPPartImpl.java 2007-01-16
15:17:51 UTC (rev 1986)
+++ trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPPartImpl.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -29,7 +29,6 @@
import java.util.List;
import javax.xml.soap.MimeHeaders;
-import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
@@ -41,7 +40,7 @@
import org.jboss.logging.Logger;
import org.jboss.util.NotImplementedException;
-import org.jboss.ws.core.utils.DOMUtils;
+import org.jboss.ws.core.jaxrpc.Style;
import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
@@ -154,9 +153,9 @@
return;
}
- Element domElement;
if (source instanceof DOMSource)
{
+ Element domElement;
DOMSource domSource = (DOMSource)source;
Node node = domSource.getNode();
if (node instanceof Document)
@@ -165,13 +164,17 @@
domElement = (Element)node;
else
throw new SOAPException("Unsupported DOMSource node: " + node);
+
+ EnvelopeBuilderDOM envBuilder = new EnvelopeBuilderDOM(Style.DOCUMENT);
+ envBuilder.build(soapMessage, domElement);
}
else if (source instanceof StreamSource)
{
try
{
StreamSource streamSource = (StreamSource)source;
- domElement = DOMUtils.parse(streamSource.getInputStream());
+ EnvelopeBuilderDOM envBuilder = new EnvelopeBuilderDOM(Style.DOCUMENT);
+ envBuilder.build(soapMessage, streamSource.getInputStream(), false);
}
catch (IOException e)
{
@@ -182,19 +185,11 @@
{
throw new SOAPException("Unsupported source parameter: " + source);
}
-
- SOAPFactoryImpl factory = new SOAPFactoryImpl();
- SOAPElement soapElement = factory.createElement(domElement);
-
- SOAPBody body = soapEnvelope.getBody();
- body.removeContents();
- body.addChildElement(soapElement);
}
public Source getContent() throws SOAPException
{
- SOAPBody body = soapEnvelope.getBody();
- return new DOMSource(body.getFirstChild());
+ return new DOMSource(soapEnvelope);
}
// Document
*********************************************************************************************************
Modified: trunk/jbossws-tests/src/main/java/org/jboss/test/ws/JBossWSTest.java
===================================================================
--- trunk/jbossws-tests/src/main/java/org/jboss/test/ws/JBossWSTest.java 2007-01-16
15:17:51 UTC (rev 1986)
+++ trunk/jbossws-tests/src/main/java/org/jboss/test/ws/JBossWSTest.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -30,11 +30,15 @@
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
import junit.framework.TestCase;
import org.jboss.logging.Logger;
import org.jboss.ws.core.utils.DOMWriter;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@@ -140,6 +144,16 @@
return hostName;
}
+ public Element getElementFromSource(Source retObj) throws Exception
+ {
+ DOMResult domResult = new DOMResult();
+ TransformerFactory tf = TransformerFactory.newInstance();
+ tf.newTransformer().transform(retObj, domResult);
+ Document doc = (Document)domResult.getNode();
+ Element docElement = doc.getDocumentElement();
+ return docElement;
+ }
+
public static void assertEquals(Element expElement, Element wasElement, boolean
ignoreWhitespace)
{
normalizeWhitspace(expElement, ignoreWhitespace);
Modified:
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/MessageFactoryTestCase.java
===================================================================
---
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/MessageFactoryTestCase.java 2007-01-16
15:17:51 UTC (rev 1986)
+++
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/MessageFactoryTestCase.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -22,6 +22,7 @@
package org.jboss.test.ws.common.soap;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -30,6 +31,7 @@
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
+import javax.xml.transform.stream.StreamSource;
import org.jboss.test.ws.JBossWSTest;
import org.jboss.ws.Constants;
@@ -122,4 +124,30 @@
assertEquals("SOAP-ENV:Envelope", env.getNodeName());
assertEquals(Constants.NS_SOAP11_ENV, env.getNamespaceURI());
}
+
+ public void testSetContentOnSOAPPart() throws Exception
+ {
+ String expMsg =
+ "<soapenv:Envelope
xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>" +
+ " <soapenv:Header/>" +
+ " <soapenv:Body>" +
+ " <HelloResponse
xmlns='http://helloservice.org/types\'>" +
+ " <argument>responseBean</argument>" +
+ " </HelloResponse>" +
+ " </soapenv:Body>" +
+ "</soapenv:Envelope>";
+
+ MessageFactory factory = new MessageFactoryImpl();
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(expMsg.getBytes());
+ StreamSource source = new StreamSource(inputStream);
+ SOAPMessage message = factory.createMessage();
+ message.getSOAPPart().setContent(source);
+ message.saveChanges();
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ message.writeTo(baos);
+ String wasMsg = new String(baos.toByteArray());
+
+ assertEquals(DOMUtils.parse(expMsg), DOMUtils.parse(wasMsg));
+ }
}
Modified:
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/jsr181/oneway/JSR181OneWayTestCase.java
===================================================================
---
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/jsr181/oneway/JSR181OneWayTestCase.java 2007-01-16
15:17:51 UTC (rev 1986)
+++
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/jsr181/oneway/JSR181OneWayTestCase.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -25,6 +25,10 @@
import java.net.URL;
import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
@@ -37,7 +41,6 @@
import org.jboss.ws.core.utils.DOMUtils;
import org.jboss.ws.core.utils.DOMWriter;
import org.w3c.dom.Element;
-import org.xml.sax.InputSource;
/**
* Test the JSR-181 annotation: javax.jws.Oneway
@@ -66,8 +69,10 @@
dispatch.invokeOneWay(new StreamSource(new StringReader(payload)));
payload = "<ns1:feedback
xmlns:ns1='http://oneway.jsr181.jaxws.ws.test.jboss.org/'/>";
- StreamSource retObj = (StreamSource)dispatch.invoke(new StreamSource(new
StringReader(payload)));
- Element retElement = DOMUtils.getFirstChildElement(DOMUtils.parse(new
InputSource(retObj.getReader())));
+ Source retObj = (Source)dispatch.invoke(new StreamSource(new
StringReader(payload)));
+
+ Element docElement = getElementFromSource(retObj);
+ Element retElement = DOMUtils.getFirstChildElement(docElement);
String retPayload = DOMWriter.printNode(retElement, false);
assertEquals("<return>ok</return>", retPayload);
}
Modified:
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/jsr181/webmethod/JSR181WebMethodTestCase.java
===================================================================
---
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/jsr181/webmethod/JSR181WebMethodTestCase.java 2007-01-16
15:17:51 UTC (rev 1986)
+++
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/jsr181/webmethod/JSR181WebMethodTestCase.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -32,6 +32,7 @@
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPMessage;
+import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
@@ -143,8 +144,9 @@
Service service = Service.create(wsdlURL, serviceName);
Dispatch dispatch = service.createDispatch(portName, StreamSource.class,
Mode.PAYLOAD);
- StreamSource retObj = (StreamSource)dispatch.invoke(new StreamSource(new
StringReader(reqPayload)));
- Element retEl = DOMUtils.parse(new InputSource(retObj.getReader()));
+ Source retSource = (Source)dispatch.invoke(new StreamSource(new
StringReader(reqPayload)));
+ Element retEl = getElementFromSource(retSource);
+
assertEquals(DOMUtils.parse(expPayload), retEl);
}
}
\ No newline at end of file
Modified:
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/provider/ProviderPayloadTestCase.java
===================================================================
---
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/provider/ProviderPayloadTestCase.java 2007-01-16
15:17:51 UTC (rev 1986)
+++
trunk/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/provider/ProviderPayloadTestCase.java 2007-01-16
15:32:38 UTC (rev 1987)
@@ -51,6 +51,7 @@
import org.jboss.ws.metadata.wsdl.WSDLDefinitions;
import org.jboss.ws.tools.wsdl.WSDLDefinitionsFactory;
import org.w3c.dom.Document;
+import org.w3c.dom.Element;
/**
* Test a Provider<SOAPMessage>
@@ -81,12 +82,8 @@
Dispatch<Source> dispatch = createDispatch("ProviderEndpoint");
Source resPayload = dispatch.invoke(new DOMSource(DOMUtils.parse(msgString)));
- DOMResult domResult = new DOMResult();
- TransformerFactory tf = TransformerFactory.newInstance();
- tf.newTransformer().transform(resPayload, domResult);
-
- Document doc = (Document)domResult.getNode();
- assertEquals(DOMUtils.parse(msgString), doc.getDocumentElement());
+ Element docElement = getElementFromSource(resPayload);
+ assertEquals(DOMUtils.parse(msgString), docElement);
}
private Dispatch<Source> createDispatch(String target) throws
MalformedURLException, JAXBException