< prev index next >
jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPDocumentImpl.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -27,30 +27,72 @@
*
* @author SAAJ RI Development Team
*/
package com.sun.xml.internal.messaging.saaj.soap;
-import java.util.logging.Logger;
-
-import com.sun.org.apache.xerces.internal.dom.DocumentImpl;
-import org.w3c.dom.*;
-
-import com.sun.xml.internal.messaging.saaj.soap.impl.*;
+import com.sun.xml.internal.messaging.saaj.soap.impl.CDATAImpl;
+import com.sun.xml.internal.messaging.saaj.soap.impl.ElementFactory;
+import com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl;
+import com.sun.xml.internal.messaging.saaj.soap.impl.SOAPCommentImpl;
+import com.sun.xml.internal.messaging.saaj.soap.impl.SOAPTextImpl;
import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
+import com.sun.xml.internal.messaging.saaj.util.SAAJUtil;
+import org.w3c.dom.Attr;
+import org.w3c.dom.CDATASection;
+import org.w3c.dom.Comment;
+import org.w3c.dom.DOMConfiguration;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.EntityReference;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.ProcessingInstruction;
+import org.w3c.dom.UserDataHandler;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPException;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
-public class SOAPDocumentImpl extends DocumentImpl implements SOAPDocument {
+public class SOAPDocumentImpl implements SOAPDocument, javax.xml.soap.Node, Document {
private static final String XMLNS = "xmlns".intern();
protected static final Logger log =
Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
SOAPPartImpl enclosingSOAPPart;
+ private Document document;
+
+ private Map<Node, javax.xml.soap.Node> domToSoap = new HashMap<>();
+
public SOAPDocumentImpl(SOAPPartImpl enclosingDocument) {
+ document = createDocument();
this.enclosingSOAPPart = enclosingDocument;
+ register(this);
+ }
+
+ private Document createDocument() {
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance("com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", SAAJUtil.getSystemClassLoader());
+ try {
+ final DocumentBuilder documentBuilder = docFactory.newDocumentBuilder();
+ return documentBuilder.newDocument();
+ } catch (ParserConfigurationException e) {
+ throw new RuntimeException("Error creating xml document", e);
+ }
}
// public SOAPDocumentImpl(boolean grammarAccess) {
// super(grammarAccess);
// }
@@ -79,21 +121,21 @@
// SOAP means no DTD, No DTD means no doctype (SOAP 1.2 only?)
return null;
}
public DOMImplementation getImplementation() {
- return super.getImplementation();
+ return document.getImplementation();
}
public Element getDocumentElement() {
// This had better be an Envelope!
getSOAPPart().doGetDocumentElement();
return doGetDocumentElement();
}
protected Element doGetDocumentElement() {
- return super.getDocumentElement();
+ return document.getDocumentElement();
}
public Element createElement(String tagName) throws DOMException {
return ElementFactory.createElement(
this,
@@ -101,11 +143,11 @@
NameImpl.getPrefixFromTagName(tagName),
null);
}
public DocumentFragment createDocumentFragment() {
- return new SOAPDocumentFragment(this);
+ return document.createDocumentFragment();
}
public org.w3c.dom.Text createTextNode(String data) {
return new SOAPTextImpl(this, data);
}
@@ -137,26 +179,29 @@
nsUri = ElementImpl.XMLNS_URI;
return createAttributeNS(nsUri, name);
}
}
- return super.createAttribute(name);
+ return document.createAttribute(name);
}
public EntityReference createEntityReference(String name)
throws DOMException {
log.severe("SAAJ0543.soap.entity.refs.not.allowed.in.docs");
throw new UnsupportedOperationException("Entity References are not allowed in SOAP documents");
}
public NodeList getElementsByTagName(String tagname) {
- return super.getElementsByTagName(tagname);
+ return document.getElementsByTagName(tagname);
}
public org.w3c.dom.Node importNode(Node importedNode, boolean deep)
throws DOMException {
- return super.importNode(importedNode, deep);
+ final Node node = document.importNode(getDomNode(importedNode), deep);
+ return node instanceof Element ?
+ ElementFactory.createElement(this, (Element) node)
+ : node;
}
public Element createElementNS(String namespaceURI, String qualifiedName)
throws DOMException {
return ElementFactory.createElement(
@@ -166,28 +211,388 @@
namespaceURI);
}
public Attr createAttributeNS(String namespaceURI, String qualifiedName)
throws DOMException {
- return super.createAttributeNS(namespaceURI, qualifiedName);
+ return document.createAttributeNS(namespaceURI, qualifiedName);
}
public NodeList getElementsByTagNameNS(
String namespaceURI,
String localName) {
- return super.getElementsByTagNameNS(namespaceURI, localName);
+ return document.getElementsByTagNameNS(namespaceURI, localName);
}
public Element getElementById(String elementId) {
- return super.getElementById(elementId);
+ return document.getElementById(elementId);
+ }
+
+ @Override
+ public String getInputEncoding() {
+ return document.getInputEncoding();
+ }
+
+ @Override
+ public String getXmlEncoding() {
+ return document.getXmlEncoding();
+ }
+
+ @Override
+ public boolean getXmlStandalone() {
+ return document.getXmlStandalone();
+ }
+
+ @Override
+ public void setXmlStandalone(boolean xmlStandalone) throws DOMException {
+ document.setXmlStandalone(xmlStandalone);
+ }
+
+ @Override
+ public String getXmlVersion() {
+ return document.getXmlVersion();
}
+ @Override
+ public void setXmlVersion(String xmlVersion) throws DOMException {
+ document.setXmlVersion(xmlVersion);
+ }
+
+ @Override
+ public boolean getStrictErrorChecking() {
+ return document.getStrictErrorChecking();
+ }
+
+ @Override
+ public void setStrictErrorChecking(boolean strictErrorChecking) {
+ document.setStrictErrorChecking(strictErrorChecking);
+ }
+
+ @Override
+ public String getDocumentURI() {
+ return document.getDocumentURI();
+ }
+
+ @Override
+ public void setDocumentURI(String documentURI) {
+ document.setDocumentURI(documentURI);
+ }
+
+ @Override
+ public Node adoptNode(Node source) throws DOMException {
+ return document.adoptNode(source);
+ }
+
+ @Override
+ public DOMConfiguration getDomConfig() {
+ return document.getDomConfig();
+ }
+
+ @Override
+ public void normalizeDocument() {
+ document.normalizeDocument();
+ }
+
+ @Override
+ public Node renameNode(Node n, String namespaceURI, String qualifiedName) throws DOMException {
+ return document.renameNode(n, namespaceURI, qualifiedName);
+ }
+
+ @Override
+ public String getNodeName() {
+ return document.getNodeName();
+ }
+
+ @Override
+ public String getNodeValue() throws DOMException {
+ return document.getNodeValue();
+ }
+
+ @Override
+ public void setNodeValue(String nodeValue) throws DOMException {
+ document.setNodeValue(nodeValue);
+ }
+
+ @Override
+ public short getNodeType() {
+ return document.getNodeType();
+ }
+
+ @Override
+ public Node getParentNode() {
+ return document.getParentNode();
+ }
+
+ @Override
+ public NodeList getChildNodes() {
+ return document.getChildNodes();
+ }
+
+ @Override
+ public Node getFirstChild() {
+ return document.getFirstChild();
+ }
+
+ @Override
+ public Node getLastChild() {
+ return document.getLastChild();
+ }
+
+ @Override
+ public Node getPreviousSibling() {
+ return document.getPreviousSibling();
+ }
+
+ @Override
+ public Node getNextSibling() {
+ return document.getNextSibling();
+ }
+
+ @Override
+ public NamedNodeMap getAttributes() {
+ return document.getAttributes();
+ }
+
+ @Override
+ public Document getOwnerDocument() {
+ return document.getOwnerDocument();
+ }
+
+ @Override
+ public Node insertBefore(Node newChild, Node refChild) throws DOMException {
+ return document.insertBefore(getDomNode(newChild), getDomNode(refChild));
+ }
+
+ @Override
+ public Node replaceChild(Node newChild, Node oldChild) throws DOMException {
+ return document.replaceChild(getDomNode(newChild), getDomNode(oldChild));
+ }
+
+ @Override
+ public Node removeChild(Node oldChild) throws DOMException {
+ return document.removeChild(getDomNode(oldChild));
+ }
+
+ @Override
+ public Node appendChild(Node newChild) throws DOMException {
+ return document.appendChild(getDomNode(newChild));
+ }
+
+ @Override
+ public boolean hasChildNodes() {
+ return document.hasChildNodes();
+ }
+
+ @Override
public Node cloneNode(boolean deep) {
- SOAPPartImpl newSoapPart = getSOAPPart().doCloneNode();
- super.cloneNode(newSoapPart.getDocument(), deep);
- return newSoapPart;
+ return document.cloneNode(deep);
+ }
+
+ @Override
+ public void normalize() {
+ document.normalize();
+ }
+
+ @Override
+ public boolean isSupported(String feature, String version) {
+ return document.isSupported(feature, version);
+ }
+
+ @Override
+ public String getNamespaceURI() {
+ return document.getNamespaceURI();
+ }
+
+ @Override
+ public String getPrefix() {
+ return document.getPrefix();
+ }
+
+ @Override
+ public void setPrefix(String prefix) throws DOMException {
+ document.setPrefix(prefix);
+ }
+
+ @Override
+ public String getLocalName() {
+ return document.getLocalName();
+ }
+
+ @Override
+ public boolean hasAttributes() {
+ return document.hasAttributes();
+ }
+
+ @Override
+ public String getBaseURI() {
+ return document.getBaseURI();
+ }
+
+ @Override
+ public short compareDocumentPosition(Node other) throws DOMException {
+ return document.compareDocumentPosition(other);
+ }
+
+ @Override
+ public String getTextContent() throws DOMException {
+ return document.getTextContent();
+ }
+
+ @Override
+ public void setTextContent(String textContent) throws DOMException {
+ document.setTextContent(textContent);
+ }
+
+ @Override
+ public boolean isSameNode(Node other) {
+ return document.isSameNode(other);
+ }
+
+ @Override
+ public String lookupPrefix(String namespaceURI) {
+ return document.lookupPrefix(namespaceURI);
+ }
+
+ @Override
+ public boolean isDefaultNamespace(String namespaceURI) {
+ return document.isDefaultNamespace(namespaceURI);
+ }
+
+ @Override
+ public String lookupNamespaceURI(String prefix) {
+ return document.lookupNamespaceURI(prefix);
+ }
+
+ @Override
+ public boolean isEqualNode(Node arg) {
+ return document.isEqualNode(arg);
+ }
+
+ @Override
+ public Object getFeature(String feature, String version) {
+ return document.getFeature(feature, version);
+ }
+
+ @Override
+ public Object setUserData(String key, Object data, UserDataHandler handler) {
+ return document.setUserData(key, data, handler);
+ }
+
+ @Override
+ public Object getUserData(String key) {
+ return document.getUserData(key);
+ }
+
+ public Document getDomDocument() {
+ return document;
+ }
+
+ /**
+ * Insert a mapping information for {@link org.w3c.dom.Node} - {@link javax.xml.soap.Node}.
+ *
+ * In SAAJ, elements in DOM are expected to be interfaces of SAAJ, on the other hand in JDKs Xerces,
+ * they are casted to internal impl classes. After removal of SAAJ dependency
+ * to JDKs internal classes elements in DOM can never be both of them.
+ *
+ * @param node SAAJ wrapper node for w3c DOM node
+ */
+ public void register(javax.xml.soap.Node node) {
+ final Node domElement = getDomNode(node);
+ if (domToSoap.containsKey(domElement)) {
+ throw new IllegalStateException("Element " + domElement.getNodeName()
+ + " is already registered");
+ }
+ domToSoap.put(domElement, node);
+ }
+
+ /**
+ * Find a soap wrapper for w3c dom node.
+ *
+ * @param node w3c dom node nullable
+ * @return soap wrapper for w3c dom node
+ *
+ * @throws
+ */
+ public javax.xml.soap.Node find(Node node) {
+ return find(node, true);
+ }
+
+ private javax.xml.soap.Node find(Node node, boolean required) {
+ if (node == null) {
+ return null;
+ }
+ if (node instanceof javax.xml.soap.Node) {
+ return (javax.xml.soap.Node) node;
+ }
+ final javax.xml.soap.Node found = domToSoap.get(node);
+ if (found == null && required) {
+ throw new IllegalArgumentException(MessageFormat.format("Cannot find SOAP wrapper for element {0}", node));
+ }
+ return found;
+ }
+
+ /**
+ * If corresponding soap wrapper exists for w3c dom node it is returned,
+ * if not passed dom element is returned.
+ *
+ * @param node w3c dom node
+ * @return soap wrapper or passed w3c dom node if not found
+ */
+ public Node findIfPresent(Node node) {
+ final javax.xml.soap.Node found = find(node, false);
+ return found != null ? found : node;
+ }
+
+ /**
+ * Extracts w3c dom node from corresponding soap wrapper.
+ *
+ * @param node soap or dom nullable
+ * @return dom node
+ */
+ public Node getDomNode(Node node) {
+ if (node instanceof SOAPDocumentImpl) {
+ return ((SOAPDocumentImpl)node).getDomElement();
+ } else if (node instanceof ElementImpl) {
+ return ((ElementImpl) node).getDomElement();
+ } else if (node instanceof SOAPTextImpl) {
+ return ((SOAPTextImpl)node).getDomElement();
+ } else if (node instanceof SOAPCommentImpl) {
+ return ((SOAPCommentImpl)node).getDomElement();
+ } else if (node instanceof CDATAImpl) {
+ return ((CDATAImpl) node).getDomElement();
+ }
+ return node;
+ }
+
+ public Document getDomElement() {
+ return document;
+ }
+
+ @Override
+ public String getValue() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void setValue(String value) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void setParentElement(SOAPElement parent) throws SOAPException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public SOAPElement getParentElement() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void detachNode() {
+ throw new UnsupportedOperationException();
}
- public void cloneNode(SOAPDocumentImpl newdoc, boolean deep) {
- super.cloneNode(newdoc, deep);
+ @Override
+ public void recycleNode() {
+ throw new UnsupportedOperationException();
}
}
< prev index next >