< prev index next >

jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPDocumentImpl.java

Print this page

        

*** 30,46 **** --- 30,49 ---- package com.sun.xml.internal.messaging.saaj.soap; 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.NamedNodeMapImpl; + import com.sun.xml.internal.messaging.saaj.soap.impl.NodeListImpl; 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.CharacterData; 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;
*** 50,84 **** 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 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); } --- 53,87 ---- 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.Text; 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.lang.reflect.Constructor; import java.text.MessageFormat; import java.util.logging.Logger; public class SOAPDocumentImpl implements SOAPDocument, javax.xml.soap.Node, Document { + public static final String SAAJ_NODE = "javax.xml.soap.Node"; + 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; public SOAPDocumentImpl(SOAPPartImpl enclosingDocument) { document = createDocument(); this.enclosingSOAPPart = enclosingDocument; register(this); }
*** 103,175 **** // // public SOAPDocumentImpl(DocumentType doctype, boolean grammarAccess) { // super(doctype, grammarAccess); // } public SOAPPartImpl getSOAPPart() { if (enclosingSOAPPart == null) { log.severe("SAAJ0541.soap.fragment.not.bound.to.part"); throw new RuntimeException("Could not complete operation. Fragment not bound to SOAP part."); } return enclosingSOAPPart; } public SOAPDocumentImpl getDocument() { return this; } public DocumentType getDoctype() { // SOAP means no DTD, No DTD means no doctype (SOAP 1.2 only?) return null; } public DOMImplementation getImplementation() { return document.getImplementation(); } public Element getDocumentElement() { // This had better be an Envelope! getSOAPPart().doGetDocumentElement(); return doGetDocumentElement(); } protected Element doGetDocumentElement() { return document.getDocumentElement(); } public Element createElement(String tagName) throws DOMException { return ElementFactory.createElement( this, NameImpl.getLocalNameFromTagName(tagName), NameImpl.getPrefixFromTagName(tagName), null); } public DocumentFragment createDocumentFragment() { ! return document.createDocumentFragment(); } public org.w3c.dom.Text createTextNode(String data) { return new SOAPTextImpl(this, data); } public Comment createComment(String data) { return new SOAPCommentImpl(this, data); } public CDATASection createCDATASection(String data) throws DOMException { return new CDATAImpl(this, data); } public ProcessingInstruction createProcessingInstruction( String target, String data) throws DOMException { log.severe("SAAJ0542.soap.proc.instructions.not.allowed.in.docs"); throw new UnsupportedOperationException("Processing Instructions are not allowed in SOAP documents"); } public Attr createAttribute(String name) throws DOMException { boolean isQualifiedName = (name.indexOf(":") > 0); if (isQualifiedName) { String nsUri = null; String prefix = name.substring(0, name.indexOf(":")); --- 106,190 ---- // // public SOAPDocumentImpl(DocumentType doctype, boolean grammarAccess) { // super(doctype, grammarAccess); // } + @Override public SOAPPartImpl getSOAPPart() { if (enclosingSOAPPart == null) { log.severe("SAAJ0541.soap.fragment.not.bound.to.part"); throw new RuntimeException("Could not complete operation. Fragment not bound to SOAP part."); } return enclosingSOAPPart; } + @Override public SOAPDocumentImpl getDocument() { return this; } + @Override public DocumentType getDoctype() { // SOAP means no DTD, No DTD means no doctype (SOAP 1.2 only?) return null; } + @Override public DOMImplementation getImplementation() { return document.getImplementation(); } + @Override public Element getDocumentElement() { // This had better be an Envelope! getSOAPPart().doGetDocumentElement(); return doGetDocumentElement(); } protected Element doGetDocumentElement() { return document.getDocumentElement(); } + @Override public Element createElement(String tagName) throws DOMException { return ElementFactory.createElement( this, NameImpl.getLocalNameFromTagName(tagName), NameImpl.getPrefixFromTagName(tagName), null); } + @Override public DocumentFragment createDocumentFragment() { ! return new SOAPDocumentFragment(this); } + @Override public org.w3c.dom.Text createTextNode(String data) { return new SOAPTextImpl(this, data); } + @Override public Comment createComment(String data) { return new SOAPCommentImpl(this, data); } + @Override public CDATASection createCDATASection(String data) throws DOMException { return new CDATAImpl(this, data); } + @Override public ProcessingInstruction createProcessingInstruction( String target, String data) throws DOMException { log.severe("SAAJ0542.soap.proc.instructions.not.allowed.in.docs"); throw new UnsupportedOperationException("Processing Instructions are not allowed in SOAP documents"); } + @Override public Attr createAttribute(String name) throws DOMException { boolean isQualifiedName = (name.indexOf(":") > 0); if (isQualifiedName) { String nsUri = null; String prefix = name.substring(0, name.indexOf(":"));
*** 182,231 **** } 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 document.getElementsByTagName(tagname); } public org.w3c.dom.Node importNode(Node importedNode, boolean deep) throws DOMException { ! 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( this, NameImpl.getLocalNameFromTagName(qualifiedName), NameImpl.getPrefixFromTagName(qualifiedName), namespaceURI); } public Attr createAttributeNS(String namespaceURI, String qualifiedName) throws DOMException { return document.createAttributeNS(namespaceURI, qualifiedName); } public NodeList getElementsByTagNameNS( String namespaceURI, String localName) { ! return document.getElementsByTagNameNS(namespaceURI, localName); } public Element getElementById(String elementId) { ! return document.getElementById(elementId); } @Override public String getInputEncoding() { return document.getInputEncoding(); --- 197,295 ---- } return document.createAttribute(name); } + @Override 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"); } + @Override public NodeList getElementsByTagName(String tagname) { ! return new NodeListImpl(this, document.getElementsByTagName(tagname)); } + @Override public org.w3c.dom.Node importNode(Node importedNode, boolean deep) throws DOMException { ! Node domNode = getDomNode(importedNode); ! final Node newNode = document.importNode(domNode, deep); ! ! if (importedNode instanceof javax.xml.soap.Node) { ! Node newSoapNode = createSoapNode(importedNode.getClass(), newNode); ! newNode.setUserData(SAAJ_NODE, newSoapNode, null); ! if (deep && importedNode.hasChildNodes()) { ! NodeList childNodes = importedNode.getChildNodes(); ! for (int i = 0; i < childNodes.getLength(); i++) { ! registerChildNodes(childNodes.item(i), deep); ! } ! } ! return newSoapNode; ! } ! ! registerChildNodes(newNode, deep); ! return findIfPresent(newNode); ! } ! ! //If the parentNode is not registered to domToSoap, create soap wapper for parentNode and register it to domToSoap ! //If deep = true, also register all children of parentNode to domToSoap map. ! public void registerChildNodes(Node parentNode, boolean deep) { ! if (parentNode.getUserData(SAAJ_NODE) == null) { ! if (parentNode instanceof Element) { ! ElementFactory.createElement(this, (Element) parentNode); ! } else if (parentNode instanceof CharacterData) { ! switch (parentNode.getNodeType()) { ! case CDATA_SECTION_NODE: ! new CDATAImpl(this, (CharacterData) parentNode); ! break; ! case COMMENT_NODE: ! new SOAPCommentImpl(this, (CharacterData) parentNode); ! break; ! case TEXT_NODE: ! new SOAPTextImpl(this, (CharacterData) parentNode); ! break; ! } ! } ! } ! if (deep) { ! NodeList nodeList = parentNode.getChildNodes(); ! for (int i = 0; i < nodeList.getLength(); i++) { ! Node nextChild = nodeList.item(i); ! registerChildNodes(nextChild, true); ! } ! } } + @Override public Element createElementNS(String namespaceURI, String qualifiedName) throws DOMException { return ElementFactory.createElement( this, NameImpl.getLocalNameFromTagName(qualifiedName), NameImpl.getPrefixFromTagName(qualifiedName), namespaceURI); } + @Override public Attr createAttributeNS(String namespaceURI, String qualifiedName) throws DOMException { return document.createAttributeNS(namespaceURI, qualifiedName); } + @Override public NodeList getElementsByTagNameNS( String namespaceURI, String localName) { ! return new NodeListImpl(this, document.getElementsByTagNameNS(namespaceURI, localName)); } + @Override public Element getElementById(String elementId) { ! return (Element) findIfPresent(document.getElementById(elementId)); } @Override public String getInputEncoding() { return document.getInputEncoding();
*** 291,301 **** 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(); --- 355,365 ---- document.normalizeDocument(); } @Override public Node renameNode(Node n, String namespaceURI, String qualifiedName) throws DOMException { ! return findIfPresent(document.renameNode(n, namespaceURI, qualifiedName)); } @Override public String getNodeName() { return document.getNodeName();
*** 316,356 **** 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(); --- 380,420 ---- return document.getNodeType(); } @Override public Node getParentNode() { ! return findIfPresent(document.getParentNode()); } @Override public NodeList getChildNodes() { ! return new NodeListImpl(this, document.getChildNodes()); } @Override public Node getFirstChild() { ! return findIfPresent(document.getFirstChild()); } @Override public Node getLastChild() { ! return findIfPresent(document.getLastChild()); } @Override public Node getPreviousSibling() { ! return findIfPresent(document.getPreviousSibling()); } @Override public Node getNextSibling() { ! return findIfPresent(document.getNextSibling()); } @Override public NamedNodeMap getAttributes() { ! return new NamedNodeMapImpl(document.getAttributes(), this); } @Override public Document getOwnerDocument() { return document.getOwnerDocument();
*** 381,391 **** return document.hasChildNodes(); } @Override public Node cloneNode(boolean deep) { ! return document.cloneNode(deep); } @Override public void normalize() { document.normalize(); --- 445,457 ---- return document.hasChildNodes(); } @Override public Node cloneNode(boolean deep) { ! Node node = document.cloneNode(deep); ! registerChildNodes(node, deep); ! return findIfPresent(node); } @Override public void normalize() { document.normalize();
*** 426,436 **** return document.getBaseURI(); } @Override public short compareDocumentPosition(Node other) throws DOMException { ! return document.compareDocumentPosition(other); } @Override public String getTextContent() throws DOMException { return document.getTextContent(); --- 492,502 ---- return document.getBaseURI(); } @Override public short compareDocumentPosition(Node other) throws DOMException { ! return document.compareDocumentPosition(getDomNode(other)); } @Override public String getTextContent() throws DOMException { return document.getTextContent();
*** 441,451 **** document.setTextContent(textContent); } @Override public boolean isSameNode(Node other) { ! return document.isSameNode(other); } @Override public String lookupPrefix(String namespaceURI) { return document.lookupPrefix(namespaceURI); --- 507,517 ---- document.setTextContent(textContent); } @Override public boolean isSameNode(Node other) { ! return document.isSameNode(getDomNode(other)); } @Override public String lookupPrefix(String namespaceURI) { return document.lookupPrefix(namespaceURI);
*** 461,471 **** 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); --- 527,537 ---- return document.lookupNamespaceURI(prefix); } @Override public boolean isEqualNode(Node arg) { ! return document.isEqualNode(getDomNode(arg)); } @Override public Object getFeature(String feature, String version) { return document.getFeature(feature, version);
*** 494,508 **** * * @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. * --- 560,574 ---- * * @param node SAAJ wrapper node for w3c DOM node */ public void register(javax.xml.soap.Node node) { final Node domElement = getDomNode(node); ! if (domElement.getUserData(SAAJ_NODE) != null) { throw new IllegalStateException("Element " + domElement.getNodeName() + " is already registered"); } ! domElement.setUserData(SAAJ_NODE, node, null); } /** * Find a soap wrapper for w3c dom node. *
*** 520,530 **** 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; } --- 586,596 ---- return null; } if (node instanceof javax.xml.soap.Node) { return (javax.xml.soap.Node) node; } ! final javax.xml.soap.Node found = (javax.xml.soap.Node) node.getUserData(SAAJ_NODE); if (found == null && required) { throw new IllegalArgumentException(MessageFormat.format("Cannot find SOAP wrapper for element {0}", node)); } return found; }
*** 560,569 **** --- 626,653 ---- return ((CDATAImpl) node).getDomElement(); } return node; } + + private Node createSoapNode(Class nodeType, Node node) { + if (SOAPTextImpl.class.isAssignableFrom(nodeType)) { + return new SOAPTextImpl(this, (Text) node); + } else if (SOAPCommentImpl.class.isAssignableFrom(nodeType)) { + return new SOAPCommentImpl(this, (Comment) node); + } else if (CDATAImpl.class.isAssignableFrom(nodeType)) { + return new CDATAImpl(this, (CDATASection) node); + } + try { + Constructor<Node> constructor = nodeType.getConstructor(SOAPDocumentImpl.class, Element.class); + return constructor.newInstance(this, node); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + public Document getDomElement() { return document; } @Override
< prev index next >