Author: alex.guizar(a)jboss.com
Date: 2007-02-23 04:01:36 -0500 (Fri, 23 Feb 2007)
New Revision: 2445
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/Constants.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyImpl.java
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPElementImpl.java
Log:
JBCTS-438
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/Constants.java
===================================================================
--- trunk/jbossws-core/src/main/java/org/jboss/ws/Constants.java 2007-02-23 03:03:43 UTC
(rev 2444)
+++ trunk/jbossws-core/src/main/java/org/jboss/ws/Constants.java 2007-02-23 09:01:36 UTC
(rev 2445)
@@ -148,6 +148,7 @@
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 Name SOAP12_FAULT = new NameImpl("Fault", PREFIX_ENV,
NS_SOAP12_ENV);
/** The default RPC return parameter name */
static final String DEFAULT_RPC_RETURN_NAME = "result"; // FIXME: According
to JSR-181 this should be 'return'
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyImpl.java
===================================================================
--- trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyImpl.java 2007-02-23
03:03:43 UTC (rev 2444)
+++ trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPBodyImpl.java 2007-02-23
09:01:36 UTC (rev 2445)
@@ -48,7 +48,6 @@
import javax.xml.transform.stream.StreamSource;
import org.jboss.logging.Logger;
-import org.jboss.util.NotImplementedException;
import org.jboss.ws.Constants;
import org.jboss.ws.WSException;
import org.jboss.ws.core.CommonMessageContext;
@@ -218,17 +217,24 @@
{
log.trace("getFault");
expandToDOM();
- Iterator it = getChildElements(new NameImpl("Fault",
Constants.PREFIX_ENV, getSOAPEnvelope().getNamespaceURI()));
- return (it.hasNext() ? (SOAPFault)it.next() : null);
+ Iterator it = getFaultIterator();
+ return it.hasNext() ? (SOAPFault)it.next() : null;
}
public boolean hasFault()
{
log.trace("hasFault");
expandToDOM();
- return getChildElements(Constants.SOAP11_FAULT).hasNext();
+ return getFaultIterator().hasNext();
}
+ private Iterator getFaultIterator()
+ {
+ Name faultName = Constants.NS_SOAP11_ENV.equals(getNamespaceURI()) ?
+ Constants.SOAP11_FAULT : Constants.SOAP12_FAULT;
+ return getChildElements(faultName);
+ }
+
public Node appendChild(Node newChild) throws DOMException
{
log.trace("appendChild: " + newChild.getNodeName());
@@ -448,7 +454,38 @@
public Document extractContentAsDocument() throws SOAPException
{
- //TODO: SAAJ 1.3
- throw new NotImplementedException();
+ log.trace("extractContentAsDocument");
+ expandToDOM();
+
+ Iterator childElements = DOMUtils.getChildElements(this);
+ // zero child elements?
+ if (!childElements.hasNext())
+ throw new SOAPException("there is no child SOAPElement of this
SOAPBody");
+
+ SOAPElementImpl childElement = (SOAPElementImpl)childElements.next();
+
+ // more than one child element?
+ if (childElements.hasNext())
+ throw new SOAPException("there is more than one child SOAPElement of this
SOAPBody");
+
+ if (childElement instanceof SOAPContentElement)
+ {
+ // cause expansion to DOM
+ SOAPContentElement contentElement = (SOAPContentElement) childElement;
+ // TODO change visibility of SOAPContentElement.expandToDOM() to package?
+ contentElement.getPayload();
+ }
+
+ // child SOAPElement is removed as part of this process
+ childElement.detachNode();
+
+ /* child element's owner document might be shared with other elements;
+ * we have to create a separate document for returning to our caller
+ */
+ Document newDocument = DOMUtils.getDocumentBuilder().newDocument();
+ Node adoptedElement = newDocument.adoptNode(childElement.domNode);
+ newDocument.appendChild(adoptedElement);
+
+ return newDocument;
}
}
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPElementImpl.java
===================================================================
---
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPElementImpl.java 2007-02-23
03:03:43 UTC (rev 2444)
+++
trunk/jbossws-core/src/main/java/org/jboss/ws/core/soap/SOAPElementImpl.java 2007-02-23
09:01:36 UTC (rev 2445)
@@ -44,6 +44,7 @@
import org.jboss.ws.core.utils.DOMUtils;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.NodeList;
@@ -68,8 +69,8 @@
private Element element;
// The element name
private Name elementName;
- /* The element's encoding style
- * JBCTS-440 #getEncodingStyleTest1 expects the initial value of the
+ // The element's encoding style
+ /* JBCTS-440 #getEncodingStyleTest1 expects the initial value of the
* encodingStyle property to be null
*/
private String encodingStyle = null;
@@ -143,39 +144,13 @@
if (Constants.NS_SOAP11_ENV.equals(getNamespaceURI()) ||
Constants.NS_SOAP12_ENV.equals(getNamespaceURI()))
throw new SOAPException("Changing the name of this SOAP Element is not
allowed: " + getLocalName());
- // Since DOM Elements do not support renaming, we must copy the content
- Element copy = DOMUtils.createElement(qname.getLocalPart(), qname.getPrefix(),
qname.getNamespaceURI());
+ elementName = new NameImpl(qname);
- // copy attributes (and namespaces by the way)
- NamedNodeMap attributes = element.getAttributes();
- for (int i = 0; i < attributes.getLength(); i++)
- {
- org.w3c.dom.Node attribute = attributes.item(i);
+ Document owner = domNode.getOwnerDocument();
+ domNode = owner.renameNode(domNode, elementName.getURI(),
elementName.getQualifiedName());
+ element = (Element)domNode;
- // DOM disallows moving an attribute, it must explicitly be cloned
- copy.setAttributeNode((Attr)attribute.cloneNode(true));
- }
-
- // move child nodes
- for (org.w3c.dom.Node child = element.getFirstChild(), next; child != null; child =
next)
- {
- next = child.getNextSibling();
-
- // DOM removes a node from the tree before adding it to a different element
- copy.appendChild(child);
- }
-
- // replace element with copy
- org.w3c.dom.Node parent = element.getParentNode();
- if (parent != null)
- parent.replaceChild(copy, element);
-
- // update fields
- domNode = copy;
- element = copy;
- elementName = null; // getElementName() regenerates this field
-
- return this;
+ return this.completeNamespaceDeclaration();
}
/**
@@ -460,7 +435,7 @@
String nsURI = getNamespaceURI(prefix);
if (nsURI == null)
throw new SOAPException("CAnnot obtain namespace URI for prefix: " +
prefix);
-
+
return new QName(nsURI, localName, prefix);
}
Show replies by date