[jbossws-commits] JBossWS SVN: r2930 - in branches/jbossws-1.2.0.GA_JBWS-1610: jbossws-core/src/main/java/org/jboss/ws/core and 5 other directories.
jbossws-commits at lists.jboss.org
jbossws-commits at lists.jboss.org
Thu Apr 26 08:34:41 EDT 2007
Author: darran.lofthouse at jboss.com
Date: 2007-04-26 08:34:40 -0400 (Thu, 26 Apr 2007)
New Revision: 2930
Modified:
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/Constants.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/CommonSOAPBinding.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderPayload.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderStax.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/MessageFactoryImpl.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/NodeImpl.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyElementMessage.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyElementRpc.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyImpl.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPEnvelopeImpl.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPFaultImpl.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPHeaderImpl.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/TextImpl.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/XMLContent.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/utils/DOMUtils.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/MessageFactoryTestCase.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/SOAPContentElementTestCase.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/SOAPFaultTestCase.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/jaxrpc/marshall/MarshallTest.java
branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/samples/provider/ProviderPayloadTestCase.java
Log:
JBWS-1610 - Backport changes to preserve comments and text nodes.
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/Constants.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/Constants.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/Constants.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -126,7 +126,7 @@
static final String PREFIX_XML = "xml";
/** XOP Include */
- static final Name NAME_XOP_INCLUDE = new NameImpl("Include", PREFIX_XOP, NS_XOP);
+ static final QName NAME_XOP_INCLUDE = new QName(NS_XOP, "Include", PREFIX_XOP);
/** SOAP-1.1 roles */
static final String URI_SOAP11_NEXT_ACTOR = "http://schemas.xmlsoap.org/soap/actor/next";
@@ -148,6 +148,10 @@
static final Name SOAP11_HEADER = new NameImpl("Header", PREFIX_ENV, NS_SOAP11_ENV);
static final Name SOAP11_BODY = new NameImpl("Body", PREFIX_ENV, NS_SOAP11_ENV);
static final Name SOAP11_FAULT = new NameImpl("Fault", PREFIX_ENV, NS_SOAP11_ENV);
+ static final QName SOAP11_FAULTCODE = new QName("faultcode");
+ static final QName SOAP11_FAULTSTRING = new QName("faultstring");
+ static final QName SOAP11_FAULTACTOR = new QName("faultactor");
+ static final QName SOAP11_DETAIL = new QName("detail");
/** The default RPC return parameter name */
static final String DEFAULT_RPC_RETURN_NAME = "result"; // FIXME: According to JSR-181 this should be 'return'
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/CommonSOAPBinding.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/CommonSOAPBinding.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/CommonSOAPBinding.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -34,6 +34,7 @@
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.Name;
+import javax.xml.soap.Node;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPElement;
@@ -288,6 +289,7 @@
}
}
}
+
}
// Generic message endpoint
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -23,20 +23,35 @@
//$Id$
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+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.SOAPBodyElement;
+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 javax.xml.transform.dom.DOMSource;
+
import org.jboss.logging.Logger;
+import org.jboss.ws.Constants;
import org.jboss.ws.WSException;
import org.jboss.ws.core.jaxrpc.Style;
import org.jboss.ws.core.utils.DOMUtils;
+import org.w3c.dom.Comment;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
-import javax.xml.namespace.QName;
-import javax.xml.soap.*;
-import javax.xml.transform.dom.DOMSource;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-
/**
* A SOAPEnvelope builder for JAXRPC based on DOM
*
@@ -49,10 +64,12 @@
// provide logging
private static Logger log = Logger.getLogger(EnvelopeBuilderDOM.class);
- private Style style = Style.DOCUMENT;
+ private SOAPFactoryImpl soapFactory;
+ private Style style;
public EnvelopeBuilderDOM(Style style)
{
+ this.soapFactory = new SOAPFactoryImpl();
this.style = style;
}
@@ -76,31 +93,93 @@
return build(soapMessage, domEnv);
}
+ public SOAPEnvelope build(SOAPMessage soapMessage, Reader reader, boolean ignoreParseError) throws IOException, SOAPException
+ {
+ // Parse the XML input stream
+ Element domEnv = null;
+ try
+ {
+ domEnv = DOMUtils.parse(new InputSource(reader));
+ }
+ 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));
+ SOAPEnvelopeImpl soapEnv = new SOAPEnvelopeImpl(soapPart, soapFactory.createElement(domEnv, false), false);
+ Document ownerDoc = soapEnv.getOwnerDocument();
DOMUtils.copyAttributes(soapEnv, domEnv);
- // Add the header elements
- Element domHeader = DOMUtils.getFirstChildElement(domEnv, new QName(envNS, "Header"));
- if (domHeader != null)
+ NodeList envChildNodes = domEnv.getChildNodes();
+ for (int i = 0; i < envChildNodes.getLength(); i++)
{
- SOAPHeader soapHeader = soapEnv.getHeader();
+ Node child = envChildNodes.item(i);
+ short childType = child.getNodeType();
+ if (childType == Node.ELEMENT_NODE)
+ {
+ String elName = child.getLocalName();
+ if ("Header".equals(elName))
+ {
+ buildSOAPHeader(soapEnv, (Element)child);
+ }
+ else if ("Body".equals(elName))
+ {
+ buildSOAPBody(soapEnv, (Element)child);
+ }
+ else
+ {
+ log.warn("Ignore envelope chile element: " + elName);
+ }
+ }
+ else if (childType == Node.COMMENT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ Comment comment = ownerDoc.createComment(nodeValue);
+ soapEnv.appendChild(comment);
+ }
+ else if (childType == Node.TEXT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ soapEnv.addTextNode(nodeValue);
+ }
+ else
+ {
+ log.warn("Ignore child type: " + childType);
+ }
+ }
- DOMUtils.copyAttributes(soapHeader, domHeader);
+ return soapEnv;
+ }
- Iterator it = DOMUtils.getChildElements(domHeader);
- while (it.hasNext())
+ private SOAPHeader buildSOAPHeader(SOAPEnvelopeImpl soapEnv, Element domHeader) throws SOAPException
+ {
+ SOAPHeader soapHeader = soapEnv.getHeader();
+ if (soapHeader == null)
+ soapHeader = soapEnv.addHeader();
+
+ Document ownerDoc = soapEnv.getOwnerDocument();
+ DOMUtils.copyAttributes(soapHeader, domHeader);
+
+ NodeList headerChildNodes = domHeader.getChildNodes();
+ for (int i = 0; i < headerChildNodes.getLength(); i++)
+ {
+ Node child = headerChildNodes.item(i);
+ short childType = child.getNodeType();
+ if (childType == Node.ELEMENT_NODE)
{
- Element srcElement = (Element)it.next();
- //registerNamespacesLocally(srcElement);
+ Element srcElement = (Element)child;
XMLFragment xmlFragment = new XMLFragment(new DOMSource(srcElement));
Name name = new NameImpl(srcElement.getLocalName(), srcElement.getPrefix(), srcElement.getNamespaceURI());
@@ -110,163 +189,258 @@
DOMUtils.copyAttributes(destElement, srcElement);
destElement.setXMLFragment(xmlFragment);
}
+ else if (childType == Node.COMMENT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ Comment comment = ownerDoc.createComment(nodeValue);
+ soapHeader.appendChild(comment);
+ }
+ else if (childType == Node.TEXT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ soapHeader.addTextNode(nodeValue);
+ }
+ else
+ {
+ log.warn("Ignore child type: " + childType);
+ }
}
- // Add the body elements
- Element domBody = DOMUtils.getFirstChildElement(domEnv, new QName(envNS, "Body"));
- SOAPBody soapBody = soapEnv.getBody();
+ return soapHeader;
+ }
+ private SOAPBody buildSOAPBody(SOAPEnvelopeImpl soapEnv, Element domBody) throws SOAPException
+ {
+ String envNS = soapEnv.getNamespaceURI();
+
+ SOAPBodyImpl soapBody = (SOAPBodyImpl)soapEnv.getBody();
+ if (soapBody == null)
+ soapBody = (SOAPBodyImpl)soapEnv.addBody();
+
+ Document ownerDoc = soapBody.getOwnerDocument();
DOMUtils.copyAttributes(soapBody, domBody);
- Iterator itBody = DOMUtils.getChildElements(domBody);
- if (itBody.hasNext())
+ SOAPBodyElement soapBodyElement = null;
+ boolean attachHRefElements = Constants.URI_SOAP11_ENC.equals(soapEnv.getAttributeNS(envNS, "encodingStyle"));
+
+ NodeList bodyChildNodes = domBody.getChildNodes();
+ for (int i = 0; i < bodyChildNodes.getLength(); i++)
{
- Element domBodyElement = (Element)itBody.next();
+ Node child = bodyChildNodes.item(i);
+ short childType = child.getNodeType();
+ if (childType == Node.ELEMENT_NODE)
+ {
+ if (soapBodyElement == null)
+ {
+ soapBodyElement = buildSOAPBodyElement(soapEnv, (Element)child);
+ attachHRefElements = attachHRefElements || Constants.URI_SOAP11_ENC.equals(soapBody.getAttributeNS(envNS, "encodingStyle"));
+ }
+ else if (attachHRefElements)
+ {
+ // Process additional soap encoded body elements
+ soapBody.addChildElement(soapFactory.createElement((Element)child, true));
+ }
+ }
+ else if (childType == Node.COMMENT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ Comment comment = ownerDoc.createComment(nodeValue);
+ soapBody.appendChild(comment);
+ }
+ else if (childType == Node.TEXT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ soapBody.addTextNode(nodeValue);
+ }
+ else
+ {
+ log.warn("Ignore child type: " + childType);
+ }
+ }
- String localName = domBodyElement.getLocalName();
- String prefix = domBodyElement.getPrefix();
- String nsURI = domBodyElement.getNamespaceURI();
- Name beName = new NameImpl(localName, prefix, nsURI);
+ return soapBody;
+ }
- // Process a <env:Fault> message
- if (beName.equals(new NameImpl("Fault", envPrefix, envNS)))
- {
- SOAPFaultImpl soapFault = new SOAPFaultImpl(envPrefix, envNS);
- soapBody.addChildElement(soapFault);
+ private SOAPBodyElement buildSOAPBodyElement(SOAPEnvelopeImpl soapEnv, Element domBodyElement) throws SOAPException
+ {
+ String envNS = soapEnv.getNamespaceURI();
+ String envPrefix = soapEnv.getPrefix();
- DOMUtils.copyAttributes(soapFault, domBodyElement);
+ SOAPBodyImpl soapBody = (SOAPBodyImpl)soapEnv.getBody();
+ QName beName = DOMUtils.getElementQName(domBodyElement);
- Element domFaultCode = DOMUtils.getFirstChildElement(domBodyElement, new QName("faultcode"));
- if (domFaultCode == null)
- throw new SOAPException("SOAPFault does not contain a <faultcode> element");
+ SOAPBodyElement soapBodyElement = null;
- Element domFaultString = DOMUtils.getFirstChildElement(domBodyElement, new QName("faultstring"));
- if (domFaultString == null)
- throw new SOAPException("SOAPFault does not contain a <faultstring> element");
+ // Process a <env:Fault> message
+ if (beName.equals(new QName(envNS, "Fault")))
+ {
+ SOAPFaultImpl soapFault = new SOAPFaultImpl(envPrefix, envNS);
+ soapBody.addChildElement(soapFault);
+ soapBodyElement = soapFault;
- String faultCode = DOMUtils.getTextContent(domFaultCode);
- soapFault.setFaultCode(faultCode);
+ DOMUtils.copyAttributes(soapFault, domBodyElement);
- String faultString = DOMUtils.getTextContent(domFaultString);
- soapFault.setFaultString(faultString);
+ Element domFaultCode = DOMUtils.getFirstChildElement(domBodyElement, new QName("faultcode"));
+ if (domFaultCode == null)
+ throw new SOAPException("SOAPFault does not contain a <faultcode> element");
- Element domFaultActor = DOMUtils.getFirstChildElement(domBodyElement, new QName("faultactor"));
- if (domFaultActor != null)
- {
- String faultActor = DOMUtils.getTextContent(domFaultActor);
- soapFault.setFaultActor(faultActor);
- }
+ Element domFaultString = DOMUtils.getFirstChildElement(domBodyElement, new QName("faultstring"));
+ if (domFaultString == null)
+ throw new SOAPException("SOAPFault does not contain a <faultstring> element");
- // Add the fault detail
- Element domFaultDetail = DOMUtils.getFirstChildElement(domBodyElement, "detail");
- if (domFaultDetail != null)
+ 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())
{
- 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);
- }
+ Element domElement = (Element)it.next();
+ SOAPElement detailEntry = new DetailEntryImpl(soapFactory.createElement(domElement));
+ detailEntry = detail.addChildElement(detailEntry);
}
}
+ }
- // Process and RPC or DOCUMENT style message
+ // Process and RPC or DOCUMENT style message
+ else
+ {
+ if (style == Style.DOCUMENT)
+ {
+ buildBodyElementDoc(soapBody, domBodyElement);
+ }
+ else if (style == Style.RPC)
+ {
+ soapBodyElement = buildBodyElementRpc(soapBody, domBodyElement);
+ }
+ else if (style == null)
+ {
+ buildBodyElementDefault(soapBody, domBodyElement);
+ }
else
{
+ throw new WSException("Unsupported message style: " + style);
+ }
+ }
- if (style == Style.RPC)
- {
- SOAPBodyElementRpc soapBodyElement = new SOAPBodyElementRpc(beName);
- soapBodyElement = (SOAPBodyElementRpc)soapBody.addChildElement(soapBodyElement);
+ return soapBodyElement;
+ }
- DOMUtils.copyAttributes(soapBodyElement, domBodyElement);
+ public void buildBodyElementDoc(SOAPBodyImpl soapBody, Element domBodyElement) throws SOAPException
+ {
+ Element srcElement = (Element)domBodyElement;
- Iterator itBodyElement = DOMUtils.getChildElements(domBodyElement);
- while (itBodyElement.hasNext())
- {
- Element srcElement = (Element)itBodyElement.next();
- registerNamespacesLocally(srcElement);
+ QName beName = DOMUtils.getElementQName(domBodyElement);
+ SOAPContentElement contentElement = new SOAPBodyElementDoc(beName);
+ contentElement = (SOAPContentElement)soapBody.addChildElement(contentElement);
- Name name = new NameImpl(srcElement.getLocalName(), srcElement.getPrefix(), srcElement.getNamespaceURI());
- SOAPContentElement destElement = new SOAPContentElement(name);
- destElement = (SOAPContentElement)soapBodyElement.addChildElement(destElement);
+ DOMUtils.copyAttributes(contentElement, srcElement);
- DOMUtils.copyAttributes(destElement, srcElement);
+ XMLFragment xmlFragment = new XMLFragment(new DOMSource(srcElement));
+ contentElement.setXMLFragment(xmlFragment);
+ }
- XMLFragment xmlFragment = new XMLFragment(new DOMSource(srcElement));
- destElement.setXMLFragment(xmlFragment);
- }
- }
- else if (style == Style.DOCUMENT)
- {
- Element srcElement = (Element)domBodyElement;
- registerNamespacesLocally(srcElement);
- SOAPContentElement destElement = new SOAPBodyElementDoc(beName);
- destElement = (SOAPContentElement)soapBody.addChildElement(destElement);
+ public SOAPBodyElement buildBodyElementRpc(SOAPBodyImpl soapBody, Element domBodyElement) throws SOAPException
+ {
+ QName beName = DOMUtils.getElementQName(domBodyElement);
+ SOAPBodyElementRpc soapBodyElement = new SOAPBodyElementRpc(beName);
+ soapBodyElement = (SOAPBodyElementRpc)soapBody.addChildElement(soapBodyElement);
- DOMUtils.copyAttributes(destElement, srcElement);
+ Document ownerDoc = soapBody.getOwnerDocument();
+ DOMUtils.copyAttributes(soapBodyElement, domBodyElement);
- XMLFragment xmlFragment = new XMLFragment(new DOMSource(srcElement));
- destElement.setXMLFragment(xmlFragment);
- }
- else if (style == null)
- {
- SOAPBodyElementMessage soapBodyElement = new SOAPBodyElementMessage(beName);
- soapBodyElement = (SOAPBodyElementMessage)soapBody.addChildElement(soapBodyElement);
+ NodeList nlist = domBodyElement.getChildNodes();
+ for (int i = 0; i < nlist.getLength(); i++)
+ {
+ Node child = nlist.item(i);
+ short childType = child.getNodeType();
+ if (childType == Node.ELEMENT_NODE)
+ {
+ Element srcElement = (Element)child;
+ Name name = new NameImpl(srcElement.getLocalName(), srcElement.getPrefix(), srcElement.getNamespaceURI());
+ SOAPContentElement destElement = new SOAPContentElement(name);
+ destElement = (SOAPContentElement)soapBodyElement.addChildElement(destElement);
- DOMUtils.copyAttributes(soapBodyElement, domBodyElement);
+ DOMUtils.copyAttributes(destElement, srcElement);
- 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);
- }
+ XMLFragment xmlFragment = new XMLFragment(new DOMSource(srcElement));
+ destElement.setXMLFragment(xmlFragment);
}
+ else if (childType == Node.COMMENT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ Comment comment = ownerDoc.createComment(nodeValue);
+ soapBodyElement.appendChild(comment);
+ }
+ else if (childType == Node.TEXT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ soapBodyElement.addTextNode(nodeValue);
+ }
+ else
+ {
+ log.warn("Ignore child type: " + childType);
+ }
}
- return soapEnv;
+ return soapBodyElement;
}
- /**
- * Register globally available namespaces on element level.
- * This is necessary to ensure that each xml fragment is valid.
- */
- private void registerNamespacesLocally(Element srcElement)
+ public SOAPBodyElement buildBodyElementDefault(SOAPBodyImpl soapBody, Element domBodyElement) throws SOAPException
{
- if (srcElement.getPrefix() == null)
+ QName beName = DOMUtils.getElementQName(domBodyElement);
+ SOAPBodyElement soapBodyElement = new SOAPBodyElementMessage(beName);
+ soapBodyElement = (SOAPBodyElementMessage)soapBody.addChildElement(soapBodyElement);
+
+ Document ownerDoc = soapBody.getOwnerDocument();
+ DOMUtils.copyAttributes(soapBodyElement, domBodyElement);
+
+ NodeList nlist = domBodyElement.getChildNodes();
+ for (int i = 0; i < nlist.getLength(); i++)
{
- srcElement.setAttribute("xmlns", srcElement.getNamespaceURI());
+ Node child = nlist.item(i);
+ short childType = child.getNodeType();
+ if (childType == Node.ELEMENT_NODE)
+ {
+ SOAPElement soapElement = soapFactory.createElement((Element)child);
+ soapBodyElement.addChildElement(soapElement);
+ }
+ else if (childType == Node.COMMENT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ Comment comment = ownerDoc.createComment(nodeValue);
+ soapBodyElement.appendChild(comment);
+ }
+ else if (childType == Node.TEXT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ soapBodyElement.addTextNode(nodeValue);
+ }
+ else if (childType == Node.CDATA_SECTION_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ soapBodyElement.addTextNode(nodeValue);
+ }
+ else
+ {
+ log.warn("Ignore child type: " + childType);
+ }
}
- else
- {
- srcElement.setAttribute("xmlns:" + srcElement.getPrefix(), srcElement.getNamespaceURI());
- }
+
+ return soapBodyElement;
}
}
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderPayload.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderPayload.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderPayload.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -21,7 +21,8 @@
*/
package org.jboss.ws.core.soap;
-//$Id$
+// $Id: EnvelopeBuilderPayload.java 2292 2007-02-07 10:20:03Z
+// heiko.braun at jboss.com $
import java.io.IOException;
import java.io.InputStream;
@@ -29,6 +30,7 @@
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.SOAPHeader;
@@ -36,11 +38,10 @@
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
+ * A SOAPEnvelope builder for JAXWS in service mode PAYLOAD
*
* @author Thomas.Diesler at jboss.com
* @since 30-Jun-2006
@@ -69,7 +70,7 @@
// Construct the envelope
SOAPFactoryImpl soapFactory = new SOAPFactoryImpl();
SOAPPartImpl soapPart = (SOAPPartImpl)soapMessage.getSOAPPart();
- SOAPEnvelopeImpl soapEnv = new SOAPEnvelopeImpl(soapPart, soapFactory.createElement(domEnv, false));
+ SOAPEnvelopeImpl soapEnv = new SOAPEnvelopeImpl(soapPart, soapFactory.createElement(domEnv, false), false);
DOMUtils.copyAttributes(soapEnv, domEnv);
@@ -85,7 +86,7 @@
while (it.hasNext())
{
Element srcElement = (Element)it.next();
- XMLFragment xmlFragment = new XMLFragment( new DOMSource(srcElement) );
+ XMLFragment xmlFragment = new XMLFragment(new DOMSource(srcElement));
Name name = new NameImpl(srcElement.getLocalName(), srcElement.getPrefix(), srcElement.getNamespaceURI());
SOAPContentElement destElement = new SOAPHeaderElementImpl(name);
@@ -99,6 +100,10 @@
// Add the body elements
Element domBody = DOMUtils.getFirstChildElement(domEnv, new QName(envNS, "Body"));
SOAPBodyImpl soapBody = (SOAPBodyImpl)soapEnv.getBody();
+ if (soapBody == null)
+ {
+ soapBody = (SOAPBodyImpl)soapEnv.addBody();
+ }
DOMUtils.copyAttributes(soapBody, domBody);
@@ -108,7 +113,7 @@
Element domBodyElement = (Element)itBody.next();
soapBody.setPayload(new DOMSource(domBodyElement));
}
-
+
return soapEnv;
}
}
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderStax.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderStax.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderStax.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -256,7 +256,7 @@
if (Part.ENVELOPE == currentPart)
{
// setup envelope impl
- soapEnv = new SOAPEnvelopeImpl(soapPart, qName.getNamespaceURI());
+ soapEnv = new SOAPEnvelopeImpl(soapPart, qName.getNamespaceURI(), false);
destElement = soapEnv; // soapEnv becomes current
}
else if (Part.HEADER == currentPart)
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/MessageFactoryImpl.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/MessageFactoryImpl.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/MessageFactoryImpl.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -146,7 +146,7 @@
{
SOAPMessageImpl soapMessage = new SOAPMessageImpl();
SOAPPartImpl soapPart = (SOAPPartImpl)soapMessage.getSOAPPart();
- new SOAPEnvelopeImpl(soapPart, envNamespace);
+ new SOAPEnvelopeImpl(soapPart, envNamespace, true);
return soapMessage;
}
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/NodeImpl.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/NodeImpl.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/NodeImpl.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -552,6 +552,10 @@
{
retNode = new TextImpl(node);
}
+ else if (node instanceof org.w3c.dom.Comment)
+ {
+ retNode = new TextImpl(node);
+ }
else
{
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Operation not supported on this type of node: " + node);
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyElementMessage.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyElementMessage.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyElementMessage.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -23,8 +23,8 @@
import java.io.Writer;
+import javax.xml.namespace.QName;
import javax.xml.rpc.JAXRPCException;
-import javax.xml.soap.Name;
import javax.xml.soap.SOAPBodyElement;
import org.jboss.ws.core.utils.DOMWriter;
@@ -39,7 +39,7 @@
*/
public class SOAPBodyElementMessage extends SOAPElementImpl implements SOAPBodyElement
{
- public SOAPBodyElementMessage(Name name)
+ public SOAPBodyElementMessage(QName name)
{
super(name);
}
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyElementRpc.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyElementRpc.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyElementRpc.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -21,6 +21,7 @@
*/
package org.jboss.ws.core.soap;
+import javax.xml.namespace.QName;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPBodyElement;
@@ -39,6 +40,11 @@
super(name);
}
+ public SOAPBodyElementRpc(QName qname)
+ {
+ super(qname);
+ }
+
public SOAPBodyElementRpc(SOAPElementImpl element)
{
super(element);
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyImpl.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyImpl.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyImpl.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -25,10 +25,8 @@
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
-import java.io.Writer;
import java.util.Iterator;
import java.util.Locale;
@@ -48,18 +46,20 @@
import org.jboss.logging.Logger;
import org.jboss.util.NotImplementedException;
+import org.jboss.util.xml.DOMWriter;
import org.jboss.ws.Constants;
import org.jboss.ws.WSException;
import org.jboss.ws.core.CommonMessageContext;
import org.jboss.ws.core.utils.DOMUtils;
-import org.jboss.ws.core.utils.DOMWriter;
import org.jboss.ws.metadata.umdm.UnifiedMetaData;
+import org.w3c.dom.Comment;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
import org.xml.sax.InputSource;
/**
@@ -108,7 +108,8 @@
{
log.trace("addChildElement: " + child.getElementName());
expandToDOM();
- if ((child instanceof SOAPBodyElement) == false)
+
+ if (needsConversionToBodyElement(child))
child = convertToBodyElement(child);
child = super.addChildElement(child);
@@ -227,10 +228,10 @@
log.trace("appendChild: " + newChild.getNodeName());
expandToDOM();
Node retNode;
- if (!(newChild instanceof SOAPBodyElement || newChild instanceof DocumentFragment))
- {
+
+ if (needsConversionToBodyElement(newChild))
newChild = convertToBodyElement(newChild);
- }
+
retNode = super.appendChild(newChild);
return retNode;
}
@@ -239,7 +240,8 @@
{
log.trace("insertBefore: " + newChild.getNodeName());
expandToDOM();
- if (!(newChild instanceof SOAPBodyElement || newChild instanceof DocumentFragment))
+
+ if (needsConversionToBodyElement(newChild))
newChild = convertToBodyElement(newChild);
return super.insertBefore(newChild, refChild);
@@ -249,10 +251,9 @@
{
log.trace("replaceChild: " + newChild.getNodeName());
expandToDOM();
- if (!(newChild instanceof SOAPBodyElement || newChild instanceof DocumentFragment))
- {
+
+ if (needsConversionToBodyElement(newChild))
newChild = convertToBodyElement(newChild);
- }
return super.replaceChild(newChild, oldChild);
}
@@ -299,6 +300,16 @@
return super.hasChildNodes();
}
+ private static boolean needsConversionToBodyElement(Node newChild)
+ {
+ // JBCTS-440 #addTextNodeTest1 appends a Text node to a SOAPBody
+ boolean validChild = newChild instanceof SOAPBodyElement;
+ validChild = validChild || newChild instanceof DocumentFragment;
+ validChild = validChild || newChild instanceof Text;
+ validChild = validChild || newChild instanceof Comment;
+ return validChild == false;
+ }
+
private SOAPBodyElementDoc convertToBodyElement(Node node)
{
if (!(node instanceof SOAPElementImpl))
@@ -419,22 +430,6 @@
return child;
}
- @Override
- public void writeElementContent(Writer writer) throws IOException
- {
- if (payload != null)
- {
- Element child = getBodyElementFromSource();
- String xmlPayload = DOMWriter.printNode(child, false);
- if(log.isDebugEnabled()) log.debug("writeElementContent from payload: " + xmlPayload);
- writer.write(xmlPayload);
- }
- else
- {
- super.writeElementContent(writer);
- }
- }
-
public Document extractContentAsDocument() throws SOAPException
{
//TODO: SAAJ 1.3
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPEnvelopeImpl.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPEnvelopeImpl.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPEnvelopeImpl.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -54,7 +54,7 @@
/** Construct a SOAP envelope for the given SOAP version URI prefix, etc.
*/
- public SOAPEnvelopeImpl(SOAPPartImpl soapPart, SOAPElement element) throws SOAPException
+ public SOAPEnvelopeImpl(SOAPPartImpl soapPart, SOAPElement element, boolean addHeaderAndBody) throws SOAPException
{
super((SOAPElementImpl)element);
@@ -71,14 +71,16 @@
assertEnvelopeNamespace(namespaceURI);
addNamespaceDeclaration(prefix, namespaceURI);
- // the Element source might already contain a Header and Body declaration
- if(null == soapPart.getEnvelope().getHeader()) addHeader();
- if(null == soapPart.getEnvelope().getBody()) addBody();
+ if (addHeaderAndBody)
+ {
+ addHeader();
+ addBody();
+ }
}
/** Construct a SOAP envelope for the given SOAP version URI.
*/
- SOAPEnvelopeImpl(SOAPPartImpl soapPart, String namespace) throws SOAPException
+ SOAPEnvelopeImpl(SOAPPartImpl soapPart, String namespace, boolean addHeaderAndBody) throws SOAPException
{
super("Envelope", Constants.PREFIX_ENV, namespace);
@@ -88,8 +90,11 @@
assertEnvelopeNamespace(namespace);
addNamespaceDeclaration(getPrefix(), namespace);
- addHeader();
- addBody();
+ if (addHeaderAndBody)
+ {
+ addHeader();
+ addBody();
+ }
}
private void assertEnvelopeNamespace(String namespaceURI)
@@ -153,7 +158,7 @@
while (it.hasNext())
{
Node node = (Node)it.next();
- if (node.getLocalName().equals("Body"))
+ if ("Body".equals(node.getLocalName()))
return (SOAPBody)node;
}
return null;
@@ -165,7 +170,7 @@
while (it.hasNext())
{
Node node = (Node)it.next();
- if (node.getLocalName().equals("Header"))
+ if ("Header".equals(node.getLocalName()))
return (SOAPHeader)node;
}
return null;
@@ -176,7 +181,10 @@
*/
public SOAPElement addTextNode(String value) throws SOAPException
{
- throw new SOAPException("Cannot add Text node to SOAPEnvelope");
+ if (value.trim().length() > 0)
+ throw new SOAPException("Cannot add Text node to SOAPEnvelope");
+
+ return super.addTextNode(value);
}
public Document getOwnerDocument()
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPFaultImpl.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPFaultImpl.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPFaultImpl.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -67,6 +67,7 @@
private SOAPElement faultstring;
private SOAPElement faultactor;
private Locale faultStringLocale;
+ private Detail detail;
public SOAPFaultImpl() throws SOAPException
{
@@ -75,10 +76,7 @@
public SOAPFaultImpl(String prefix, String namespace) throws SOAPException
{
- super(new NameImpl("Fault", prefix, namespace));
- SOAPFactoryImpl factory = new SOAPFactoryImpl();
- addChildElement(faultcode = factory.createElement("faultcode"));
- addChildElement(faultstring = factory.createElement("faultstring"));
+ super(new NameImpl("Fault", prefix, namespace));
}
/** Creates an optional Detail object and sets it as the Detail object for this SOAPFault object.
@@ -138,15 +136,23 @@
*/
public String getFaultActor()
{
- return (faultactor != null ? faultactor.getValue() : null);
+ if (faultactor == null)
+ {
+ findFaultActorElement();
+ if (faultactor == null)
+ return null;
+ }
+ return faultactor.getValue();
}
/** Gets the fault code for this SOAPFault object.
*/
public String getFaultCode()
{
- String value = faultcode.getValue();
- return value;
+ if (faultcode == null)
+ findFaultCodeElement();
+
+ return faultcode.getValue();
}
/**
@@ -154,17 +160,33 @@
*/
public Name getFaultCodeAsName()
{
- QName qname = QNameBuilder.buildQName(this, faultcode.getValue());
- return new NameImpl(qname);
+ return new NameImpl(getFaultCodeAsQName());
}
/** Gets the fault string for this SOAPFault object.
*/
public String getFaultString()
{
- String value = faultstring.getValue();
- return value;
+ if (faultstring == null)
+ {
+ findFaultStringElement();
+ if (faultstring == null)
+ return null;
+ }
+ return faultstring.getValue();
}
+
+ private void findFaultStringElement()
+ {
+ faultstring = getChildElement(this, Constants.SOAP11_FAULTSTRING);
+ log.trace("findFaultStringElement : " + faultstring);
+ }
+
+ private void findFaultActorElement()
+ {
+ faultactor = getChildElement(this, Constants.SOAP11_FAULTACTOR);
+ log.trace("findFaultActorElement : " + faultactor);
+ }
/** Gets the locale of the fault string for this SOAPFault object.
*/
@@ -186,6 +208,12 @@
faultactor.setValue(faultActor);
}
+ private void findFaultCodeElement()
+ {
+ faultcode = getChildElement(this, Constants.SOAP11_FAULTCODE);
+ log.trace("findFaultCodeElement : " + faultcode);
+ }
+
/** Sets this SOAPFault object with the give fault code.
*/
public void setFaultCode(String faultCode) throws SOAPException
@@ -217,24 +245,44 @@
if (nsURI.length() > 0 && prefix.length() == 0)
prefix = "codeNS";
-
+
String prevNS = getNamespaceURI(prefix);
if (prevNS == null)
addNamespaceDeclaration(prefix, nsURI);
String faultCode = prefix + ":" + localName;
+
+ if (faultcode == null)
+ {
+ findFaultCodeElement();
+ if (faultcode == null)
+ faultcode = addUnqualifiedFaultElement("faultcode");
+ }
+
faultcode.setValue(faultCode);
}
+
+ private static SOAPElement getChildElement(SOAPElement element, QName name)
+ {
+ Iterator it = element.getChildElements(name);
+ return it.hasNext() ? (SOAPElement)it.next() : null;
+ }
public void setFaultCode(QName faultCode) throws SOAPException
{
setFaultCode(new NameImpl(faultCode));
}
-
+
/** Sets the fault string for this SOAPFault object to the given string.
*/
public void setFaultString(String faultString) throws SOAPException
{
+ if (faultstring == null)
+ {
+ findFaultStringElement();
+ if (faultstring == null)
+ faultstring = addUnqualifiedFaultElement("faultstring");
+ }
faultstring.setValue(faultString);
}
@@ -250,6 +298,12 @@
{
new DOMWriter(writer).print(this);
}
+
+ private SOAPElement addUnqualifiedFaultElement(String localName) throws SOAPException
+ {
+ log.trace("addUnqualifiedFaultElement(" + localName + ")");
+ return addChildElement(new SOAPFaultElementImpl(localName));
+ }
public void addFaultReasonText(String text, Locale locale) throws SOAPException
{
@@ -265,8 +319,10 @@
public QName getFaultCodeAsQName()
{
- //TODO: SAAJ 1.3
- throw new NotImplementedException();
+ if (faultcode == null)
+ findFaultCodeElement();
+
+ return QNameBuilder.buildQName(faultcode, faultcode.getValue());
}
public String getFaultNode()
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPHeaderImpl.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPHeaderImpl.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPHeaderImpl.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -30,8 +30,10 @@
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
+import javax.xml.soap.Text;
import org.jboss.util.NotImplementedException;
+import org.w3c.dom.Comment;
import org.w3c.dom.DOMException;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Node;
@@ -50,18 +52,6 @@
super("Header", prefix, namespace);
}
- private SOAPHeaderElementImpl convertToHeaderElement(Node node)
- {
- if (!(node instanceof SOAPElementImpl))
- throw new IllegalArgumentException("SOAPElement expected");
-
- SOAPElementImpl element = (SOAPElementImpl)node;
-
- // convert to SOAPHeaderElement
- element.detachNode();
- return new SOAPHeaderElementImpl(element);
- }
-
/*** Add a SOAPHeaderElement as a child of this SOAPHeader instance.
*/
public SOAPElement addChildElement(SOAPElement child) throws SOAPException
@@ -180,7 +170,7 @@
public Node appendChild(Node newChild) throws DOMException
{
- if (!(newChild instanceof SOAPHeaderElementImpl || newChild instanceof DocumentFragment))
+ if (needsConversionToHeaderElement(newChild))
newChild = convertToHeaderElement(newChild);
return super.appendChild(newChild);
@@ -188,7 +178,7 @@
public Node insertBefore(Node newChild, Node refChild) throws DOMException
{
- if (!(newChild instanceof SOAPHeaderElementImpl || newChild instanceof DocumentFragment))
+ if (needsConversionToHeaderElement(newChild))
newChild = convertToHeaderElement(newChild);
return super.insertBefore(newChild, refChild);
@@ -196,7 +186,7 @@
public Node replaceChild(Node newChild, Node oldChild) throws DOMException
{
- if (!(newChild instanceof SOAPHeaderElementImpl || newChild instanceof DocumentFragment))
+ if (needsConversionToHeaderElement(newChild))
newChild = convertToHeaderElement(newChild);
return super.replaceChild(newChild, oldChild);
@@ -225,4 +215,27 @@
//TODO: SAAJ 1.3
throw new NotImplementedException();
}
+
+ private static boolean needsConversionToHeaderElement(Node newChild)
+ {
+ // JBCTS-440 #addTextNodeTest2 appends a Text node to a SOAPHeader
+ boolean validChild = newChild instanceof SOAPHeaderElementImpl;
+ validChild = validChild || newChild instanceof DocumentFragment;
+ validChild = validChild || newChild instanceof Text;
+ validChild = validChild || newChild instanceof Comment;
+ return validChild == false;
+ }
+
+ private static SOAPHeaderElementImpl convertToHeaderElement(Node node)
+ {
+ if (!(node instanceof SOAPElementImpl))
+ throw new IllegalArgumentException("SOAPElement expected");
+
+ SOAPElementImpl element = (SOAPElementImpl)node;
+
+ // convert to SOAPHeaderElement
+ element.detachNode();
+ return new SOAPHeaderElementImpl(element);
+ }
+
}
\ No newline at end of file
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/TextImpl.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/TextImpl.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/TextImpl.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -42,8 +42,7 @@
*/
public boolean isComment()
{
- String value = getNodeValue().trim();
- return value.startsWith("<!--") && value.endsWith("-->");
+ return domNode.getNodeType() == org.w3c.dom.Node.COMMENT_NODE;
}
public String getValue()
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/XMLContent.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/XMLContent.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/soap/XMLContent.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -41,6 +41,8 @@
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import org.w3c.dom.Comment;
+import org.w3c.dom.Document;
import javax.activation.DataHandler;
import javax.activation.DataSource;
@@ -265,7 +267,7 @@
if (!contentRootName.equals(name))
throw new WSException("Content root name does not match element name: " + contentRootName + " != " + name);
- // Copy attributes
+ Document ownerDoc = container.getOwnerDocument();
DOMUtils.copyAttributes(container, contentRoot);
SOAPFactoryImpl soapFactory = new SOAPFactoryImpl();
@@ -289,6 +291,12 @@
String nodeValue = child.getNodeValue();
container.addTextNode(nodeValue);
}
+ else if (childType == Node.COMMENT_NODE)
+ {
+ String nodeValue = child.getNodeValue();
+ Comment comment = ownerDoc.createComment(nodeValue);
+ container.appendChild(comment);
+ }
else if (childType == Node.CDATA_SECTION_NODE)
{
String nodeValue = child.getNodeValue();
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/utils/DOMUtils.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/utils/DOMUtils.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-core/src/main/java/org/jboss/ws/core/utils/DOMUtils.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -233,7 +233,17 @@
if (namespaceURI.equals(""))
throw new IllegalArgumentException("Cannot find namespace uri for: " + qualifiedName);
}
-
+ else
+ {
+ Element nsElement = el;
+ while (namespaceURI.equals("") && nsElement != null)
+ {
+ namespaceURI = nsElement.getAttribute("xmlns");
+ if (namespaceURI.equals(""))
+ nsElement = getParentElement(nsElement);
+ }
+ }
+
qname = new QName(namespaceURI, localPart, prefix);
return qname;
}
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/MessageFactoryTestCase.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/MessageFactoryTestCase.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/MessageFactoryTestCase.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -25,18 +25,22 @@
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
+import java.io.IOException;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.stream.StreamSource;
import org.jboss.test.ws.JBossWSTest;
import org.jboss.ws.Constants;
+import org.jboss.ws.core.jaxrpc.Style;
import org.jboss.ws.core.soap.MessageFactoryImpl;
import org.jboss.ws.core.utils.DOMUtils;
+import org.jboss.ws.core.utils.DOMWriter;
import org.w3c.dom.Element;
/**
@@ -153,7 +157,7 @@
public void testPreserveComments() throws Exception
{
String expMsg =
- "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>" +
+ "<soapenv:Envelope xmlns:ns1='http://somens.org' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>" +
" <!-- header -->" +
" <soapenv:Header>" +
" <!-- header element -->" +
@@ -169,12 +173,25 @@
" </soapenv:Body>" +
"</soapenv:Envelope>";
- MessageFactory factory = new MessageFactoryImpl();
- ByteArrayInputStream inputStream = new ByteArrayInputStream(expMsg.getBytes());
+ // Verify that DOM parse/write do not modify the message
+ Element expEnv = DOMUtils.parse(expMsg);
+ assertEquals(expMsg, DOMWriter.printNode(expEnv, false));
+
+ doPreserveCommentsPerStyle(expMsg, Style.DOCUMENT);
+ doPreserveCommentsPerStyle(expMsg, Style.RPC);
+ doPreserveCommentsPerStyle(expMsg, null);
+ }
+
+ private void doPreserveCommentsPerStyle(String expXML, Style style) throws IOException, SOAPException
+ {
+ MessageFactoryImpl factory = new MessageFactoryImpl();
+ factory.setStyle(style);
+
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(expXML.getBytes());
SOAPMessage soapMsg = factory.createMessage(null, inputStream);
- SOAPEnvelope env = soapMsg.getSOAPPart().getEnvelope();
+ SOAPEnvelope wasEnv = soapMsg.getSOAPPart().getEnvelope();
- System.out.println("FIXME: [JBWS-1511] MessageFactory does not preserve comments");
- //assertEquals(DOMUtils.parse(expMsg), (Element)env);
+ String wasXML = DOMWriter.printNode(wasEnv, false);
+ assertEquals(expXML, wasXML);
}
}
\ No newline at end of file
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/SOAPContentElementTestCase.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/SOAPContentElementTestCase.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/SOAPContentElementTestCase.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -1,24 +1,24 @@
/*
- * 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.
- */
+ * 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.test.ws.common.soap;
import java.io.ByteArrayInputStream;
@@ -52,18 +52,11 @@
{
Name name = new NameImpl("Order", "tns", "http://someURI");
- String xmlFragment =
- "<tns:Order xmlns:tns='http://someURI'>" +
- "<OrderItem>Ferarri</OrderItem>" +
- "<OrderItem>Lamborgini</OrderItem>" +
- "<OrderItem>JBoss Support</OrderItem>" +
- "<Customer>" +
- "<Name>Thomas</Name>" +
- "</Customer>" +
- "</tns:Order>";
+ String xmlFragment = "<tns:Order xmlns:tns='http://someURI'>" + "<OrderItem>Ferarri</OrderItem>" + "<OrderItem>Lamborgini</OrderItem>"
+ + "<OrderItem>JBoss Support</OrderItem>" + "<Customer>" + "<Name>Thomas</Name>" + "</Customer>" + "</tns:Order>";
SOAPContentElement soapEl = new SOAPContentElement(name);
- soapEl.setXMLFragment( XMLFragment.fromStringFragment(xmlFragment) );
+ soapEl.setXMLFragment(XMLFragment.fromStringFragment(xmlFragment));
assertEquals(name, soapEl.getElementName());
@@ -95,7 +88,7 @@
String xmlFragment = "<tns:Order xmlns:tns='http://someURI'>No child element</tns:Order>";
SOAPContentElement soapEl = new SOAPContentElement(name);
- soapEl.setXMLFragment( XMLFragment.fromStringFragment(xmlFragment) );
+ soapEl.setXMLFragment(XMLFragment.fromStringFragment(xmlFragment));
assertEquals(name, soapEl.getElementName());
assertEquals("No child element", soapEl.getValue());
@@ -109,7 +102,7 @@
String xmlFragment = "<tns:Order xmlns:tns='http://someURI'/>";
SOAPContentElement soapEl = new SOAPContentElement(name);
- soapEl.setXMLFragment( XMLFragment.fromStringFragment(xmlFragment) );
+ soapEl.setXMLFragment(XMLFragment.fromStringFragment(xmlFragment));
assertEquals(name, soapEl.getElementName());
assertFalse(soapEl.hasChildNodes());
@@ -124,7 +117,7 @@
String xmlFragment = "<tns:BadName xmlns:tns='http://someURI'>No child element</tns:BadName>";
SOAPContentElement soapEl = new SOAPContentElement(name);
- soapEl.setXMLFragment( XMLFragment.fromStringFragment(xmlFragment) );
+ soapEl.setXMLFragment(XMLFragment.fromStringFragment(xmlFragment));
try
{
@@ -147,7 +140,7 @@
SOAPContentElement soapEl = new SOAPContentElement(name);
soapEl.setAttribute("foo", "Kermit");
- soapEl.setXMLFragment( XMLFragment.fromStringFragment(xmlFragment) );
+ soapEl.setXMLFragment(XMLFragment.fromStringFragment(xmlFragment));
assertEquals(name, soapEl.getElementName());
assertEquals("Kermit", soapEl.getAttributeValue(new NameImpl("foo")));
@@ -158,14 +151,8 @@
*/
public void testTextNodeAccess() throws Exception
{
- String envStr =
- "<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>" +
- "<env:Body>" +
- "<ns1:hello xmlns:ns1='http://handlerservice1.org/wsdl'>" +
- "<String_1>world</String_1>" +
- "</ns1:hello>" +
- "</env:Body>" +
- "</env:Envelope>";
+ String envStr = "<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>" + "<env:Body>" + "<ns1:hello xmlns:ns1='http://handlerservice1.org/wsdl'>"
+ + "<String_1>world</String_1>" + "</ns1:hello>" + "</env:Body>" + "</env:Envelope>";
MessageFactory factory = MessageFactory.newInstance();
SOAPMessage soapMessage = factory.createMessage(null, new ByteArrayInputStream(envStr.getBytes()));
@@ -185,6 +172,8 @@
soapMessage.writeTo(baos);
String expEnv = "<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'><env:Header></env:Header><env:Body><ns1:hello xmlns:ns1='http://handlerservice1.org/wsdl'><String_1>world::SOAP header was added</String_1></ns1:hello></env:Body></env:Envelope>";
+ System.out.println(expEnv);
+ System.out.println(baos.toString());
assertEquals(expEnv, baos.toString());
}
}
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/SOAPFaultTestCase.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/SOAPFaultTestCase.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/common/soap/SOAPFaultTestCase.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -71,7 +71,8 @@
assertEquals("Some fault message", soapFault.getFaultString());
assertEquals("Some fault actor", soapFault.getFaultActor());
assertEquals(createDetailElement(), soapFault.getDetail());
-
+ assertEquals(createDetailElement(), soapFault.getDetail());
+
SOAPFaultException faultEx = SOAPFaultHelperJAXRPC.getSOAPFaultException((SOAPFault)soapFault);
assertEquals(Constants.SOAP11_FAULT_CODE_CLIENT, faultEx.getFaultCode());
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/jaxrpc/marshall/MarshallTest.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/jaxrpc/marshall/MarshallTest.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/jaxrpc/marshall/MarshallTest.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -1,24 +1,24 @@
/*
- * 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.
- */
+ * 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.test.ws.jaxrpc.marshall;
import java.math.BigDecimal;
@@ -36,7 +36,7 @@
/**
* Test standard JAX-RPC types.
- *
+ *
* @author Thomas.Diesler at jboss.org
* @since 15-Feb-2005
*/
@@ -227,8 +227,8 @@
{
Calendar in = new GregorianCalendar(1968, 5, 16, 14, 23, 55);
/**
- * Will be a problem where the JVM is running in a TZ which
- * has Daylight Saving Time influence. So offset the TZ to GMT.
+ * Will be a problem where the JVM is running in a TZ which has Daylight
+ * Saving Time influence. So offset the TZ to GMT.
*/
in.setTimeZone(TimeZone.getTimeZone("GMT-0"));
Calendar out = calendarTest(in);
@@ -607,6 +607,11 @@
String in = "one";
String out = stringTest(in);
assertEquals(in, out);
+
+ System.out.println("FIXME: [JBWS-1617] JAXRPC doc/literal trims empty string");
+ //in = " ";
+ //out = stringTest(in);
+ //assertEquals(in, out);
}
public void testStringSpecialChars() throws Exception
Modified: branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/samples/provider/ProviderPayloadTestCase.java
===================================================================
--- branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/samples/provider/ProviderPayloadTestCase.java 2007-04-26 12:07:14 UTC (rev 2929)
+++ branches/jbossws-1.2.0.GA_JBWS-1610/jbossws-tests/src/main/java/org/jboss/test/ws/jaxws/samples/provider/ProviderPayloadTestCase.java 2007-04-26 12:34:40 UTC (rev 2930)
@@ -101,6 +101,7 @@
{
String reqString =
"<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>" +
+ " <env:Header/>" +
" <env:Body>" +
" <ns1:somePayload xmlns:ns1='http://org.jboss.ws/provider'/>" +
" </env:Body>" +
More information about the jbossws-commits
mailing list