< 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 >