Skip to content

Package: SOAPDocumentImpl

SOAPDocumentImpl

nameinstructionbranchcomplexitylinemethod
SOAPDocumentImpl(SOAPPartImpl)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
SOAPDocumentImpl(SOAPPartImpl, Document)
M: 0 C: 12
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
adoptNode(Node)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
appendChild(Node)
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
cloneNode(boolean)
M: 0 C: 15
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
compareDocumentPosition(Node)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
createAttribute(String)
M: 35 C: 0
0%
M: 6 C: 0
0%
M: 4 C: 0
0%
M: 8 C: 0
0%
M: 1 C: 0
0%
createAttributeNS(String, String)
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
createCDATASection(String)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
createComment(String)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
createDocument()
M: 7 C: 10
59%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 2 C: 3
60%
M: 0 C: 1
100%
createDocumentFragment()
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
createElement(String)
M: 0 C: 8
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
createElementNS(String, String)
M: 0 C: 8
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
createEntityReference(String)
M: 8 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
createProcessingInstruction(String, String)
M: 8 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
createSoapNode(Class, Node)
M: 34 C: 43
56%
M: 4 C: 4
50%
M: 4 C: 1
20%
M: 6 C: 6
50%
M: 0 C: 1
100%
createTextNode(String)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
detachNode()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
doGetDocumentElement()
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
find(Node)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
find(Node, boolean)
M: 12 C: 21
64%
M: 1 C: 7
88%
M: 1 C: 4
80%
M: 1 C: 7
88%
M: 0 C: 1
100%
findIfPresent(Node)
M: 0 C: 11
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
getAttributes()
M: 14 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
getBaseURI()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getChildNodes()
M: 0 C: 8
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getDoctype()
M: 2 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getDocument()
M: 0 C: 2
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getDocumentElement()
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
getDocumentURI()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getDomConfig()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getDomDocument()
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getDomElement()
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getDomNode(Node)
M: 4 C: 40
91%
M: 1 C: 11
92%
M: 1 C: 6
86%
M: 1 C: 12
92%
M: 0 C: 1
100%
getElementById(String)
M: 8 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getElementsByTagName(String)
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getElementsByTagNameNS(String, String)
M: 0 C: 10
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getFeature(String, String)
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getFirstChild()
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getImplementation()
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getInputEncoding()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getLastChild()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getLocalName()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getNamespaceURI()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getNextSibling()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getNodeName()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getNodeType()
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getNodeValue()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getOwnerDocument()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getParentElement()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getParentNode()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getPrefix()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getPreviousSibling()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getSOAPPart()
M: 8 C: 6
43%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 2 C: 2
50%
M: 0 C: 1
100%
getStrictErrorChecking()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getTextContent()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getUserData(String)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getValue()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getXmlEncoding()
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getXmlStandalone()
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getXmlVersion()
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
hasAttributes()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
hasChildNodes()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
importNode(Node, boolean)
M: 0 C: 57
100%
M: 1 C: 7
88%
M: 1 C: 4
80%
M: 0 C: 12
100%
M: 0 C: 1
100%
insertBefore(Node, Node)
M: 0 C: 10
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
isDefaultNamespace(String)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
isEqualNode(Node)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
isSameNode(Node)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
isSupported(String, String)
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
lookupNamespaceURI(String)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
lookupPrefix(String)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
normalize()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
normalizeDocument()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
recycleNode()
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
register(Node)
M: 7 C: 15
68%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 1 C: 4
80%
M: 0 C: 1
100%
registerChildNodes(Node, boolean)
M: 8 C: 67
89%
M: 3 C: 13
81%
M: 3 C: 7
70%
M: 2 C: 17
89%
M: 0 C: 1
100%
removeChild(Node)
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
renameNode(Node, String, String)
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
replaceChild(Node, Node)
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
setDocumentURI(String)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setNodeValue(String)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setParentElement(SOAPElement)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
setPrefix(String)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setStrictErrorChecking(boolean)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setTextContent(String)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setUserData(String, Object, UserDataHandler)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
setValue(String)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
setXmlStandalone(boolean)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setXmlVersion(String)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
static {...}
M: 0 C: 8
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%

Coverage

1: /*
2: * Copyright (c) 1997, 2021 Oracle and/or its affiliates. All rights reserved.
3: *
4: * This program and the accompanying materials are made available under the
5: * terms of the Eclipse Distribution License v. 1.0, which is available at
6: * http://www.eclipse.org/org/documents/edl-v10.php.
7: *
8: * SPDX-License-Identifier: BSD-3-Clause
9: */
10:
11: /**
12: *
13: * @author SAAJ RI Development Team
14: */
15: package com.sun.xml.messaging.saaj.soap;
16:
17: import com.sun.xml.messaging.saaj.soap.impl.CDATAImpl;
18: import com.sun.xml.messaging.saaj.soap.impl.ElementFactory;
19: import com.sun.xml.messaging.saaj.soap.impl.ElementImpl;
20: import com.sun.xml.messaging.saaj.soap.impl.NamedNodeMapImpl;
21: import com.sun.xml.messaging.saaj.soap.impl.NodeListImpl;
22: import com.sun.xml.messaging.saaj.soap.impl.SOAPCommentImpl;
23: import com.sun.xml.messaging.saaj.soap.impl.SOAPTextImpl;
24: import com.sun.xml.messaging.saaj.soap.name.NameImpl;
25: import com.sun.xml.messaging.saaj.util.LogDomainConstants;
26: import com.sun.xml.messaging.saaj.util.SAAJUtil;
27: import org.w3c.dom.Attr;
28: import org.w3c.dom.CDATASection;
29: import org.w3c.dom.CharacterData;
30: import org.w3c.dom.Comment;
31: import org.w3c.dom.DOMConfiguration;
32: import org.w3c.dom.DOMException;
33: import org.w3c.dom.DOMImplementation;
34: import org.w3c.dom.Document;
35: import org.w3c.dom.DocumentFragment;
36: import org.w3c.dom.DocumentType;
37: import org.w3c.dom.Element;
38: import org.w3c.dom.EntityReference;
39: import org.w3c.dom.NamedNodeMap;
40: import org.w3c.dom.Node;
41: import org.w3c.dom.NodeList;
42: import org.w3c.dom.ProcessingInstruction;
43: import org.w3c.dom.Text;
44: import org.w3c.dom.UserDataHandler;
45:
46: import javax.xml.parsers.DocumentBuilder;
47: import javax.xml.parsers.DocumentBuilderFactory;
48: import javax.xml.parsers.ParserConfigurationException;
49: import jakarta.xml.soap.SOAPElement;
50: import jakarta.xml.soap.SOAPException;
51: import java.lang.reflect.Constructor;
52: import java.text.MessageFormat;
53: import java.util.logging.Logger;
54:
55: public class SOAPDocumentImpl implements SOAPDocument, jakarta.xml.soap.Node, Document {
56:
57: public static final String SAAJ_NODE = "jakarta.xml.soap.Node";
58:
59: private static final String XMLNS = "xmlns".intern();
60: protected static final Logger log =
61: Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
62: "com.sun.xml.messaging.saaj.soap.LocalStrings");
63:
64: SOAPPartImpl enclosingSOAPPart;
65:
66: private Document document;
67:
68: public SOAPDocumentImpl(SOAPPartImpl enclosingDocument) {
69: this(enclosingDocument, createDocument());
70: }
71:
72: SOAPDocumentImpl(SOAPPartImpl enclosingDocument, Document document) {
73: this.document = document;
74: this.enclosingSOAPPart = enclosingDocument;
75: register(this);
76: }
77:
78: private static Document createDocument() {
79: DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance("com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", SAAJUtil.getSystemClassLoader());
80: try {
81: final DocumentBuilder documentBuilder = docFactory.newDocumentBuilder();
82: return documentBuilder.newDocument();
83: } catch (ParserConfigurationException e) {
84: throw new RuntimeException("Error creating xml document", e);
85: }
86: }
87:
88: // public SOAPDocumentImpl(boolean grammarAccess) {
89: // super(grammarAccess);
90: // }
91: //
92: // public SOAPDocumentImpl(DocumentType doctype) {
93: // super(doctype);
94: // }
95: //
96: // public SOAPDocumentImpl(DocumentType doctype, boolean grammarAccess) {
97: // super(doctype, grammarAccess);
98: // }
99:
100: @Override
101: public SOAPPartImpl getSOAPPart() {
102:• if (enclosingSOAPPart == null) {
103: log.severe("SAAJ0541.soap.fragment.not.bound.to.part");
104: throw new RuntimeException("Could not complete operation. Fragment not bound to SOAP part.");
105: }
106: return enclosingSOAPPart;
107: }
108:
109: @Override
110: public SOAPDocumentImpl getDocument() {
111: return this;
112: }
113:
114: @Override
115: public DocumentType getDoctype() {
116: // SOAP means no DTD, No DTD means no doctype (SOAP 1.2 only?)
117: return null;
118: }
119:
120: @Override
121: public DOMImplementation getImplementation() {
122: return document.getImplementation();
123: }
124:
125: @Override
126: public Element getDocumentElement() {
127: // This had better be an Envelope!
128: getSOAPPart().doGetDocumentElement();
129: return doGetDocumentElement();
130: }
131:
132: protected Element doGetDocumentElement() {
133: return document.getDocumentElement();
134: }
135:
136: @Override
137: public Element createElement(String tagName) throws DOMException {
138: return ElementFactory.createElement(
139: this,
140: NameImpl.getLocalNameFromTagName(tagName),
141: NameImpl.getPrefixFromTagName(tagName),
142: null);
143: }
144:
145: @Override
146: public DocumentFragment createDocumentFragment() {
147: return new SOAPDocumentFragment(this);
148: }
149:
150: @Override
151: public org.w3c.dom.Text createTextNode(String data) {
152: return new SOAPTextImpl(this, data);
153: }
154:
155: @Override
156: public Comment createComment(String data) {
157: return new SOAPCommentImpl(this, data);
158: }
159:
160: @Override
161: public CDATASection createCDATASection(String data) throws DOMException {
162: return new CDATAImpl(this, data);
163: }
164:
165: @Override
166: public ProcessingInstruction createProcessingInstruction(
167: String target,
168: String data)
169: throws DOMException {
170: log.severe("SAAJ0542.soap.proc.instructions.not.allowed.in.docs");
171: throw new UnsupportedOperationException("Processing Instructions are not allowed in SOAP documents");
172: }
173:
174: @Override
175: public Attr createAttribute(String name) throws DOMException {
176:• boolean isQualifiedName = (name.indexOf(":") > 0);
177:• if (isQualifiedName) {
178: String nsUri = null;
179: String prefix = name.substring(0, name.indexOf(":"));
180: //cannot do anything to resolve the URI if prefix is not
181: //XMLNS.
182:• if (XMLNS.equals(prefix)) {
183: nsUri = ElementImpl.XMLNS_URI;
184: return createAttributeNS(nsUri, name);
185: }
186: }
187:
188: return document.createAttribute(name);
189: }
190:
191: @Override
192: public EntityReference createEntityReference(String name)
193: throws DOMException {
194: log.severe("SAAJ0543.soap.entity.refs.not.allowed.in.docs");
195: throw new UnsupportedOperationException("Entity References are not allowed in SOAP documents");
196: }
197:
198: @Override
199: public NodeList getElementsByTagName(String tagname) {
200: return new NodeListImpl(this, document.getElementsByTagName(tagname));
201: }
202:
203: @Override
204: public org.w3c.dom.Node importNode(Node importedNode, boolean deep)
205: throws DOMException {
206: Node domNode = getDomNode(importedNode);
207: final Node newNode = document.importNode(domNode, deep);
208:
209:• if (importedNode instanceof jakarta.xml.soap.Node) {
210: Node newSoapNode = createSoapNode(importedNode.getClass(), newNode);
211: newNode.setUserData(SAAJ_NODE, newSoapNode, null);
212:• if (deep && newSoapNode.hasChildNodes()) {
213: NodeList childNodes = newSoapNode.getChildNodes();
214:• for (int i = 0; i < childNodes.getLength(); i++) {
215: registerChildNodes(childNodes.item(i), deep);
216: }
217: }
218: return newSoapNode;
219: }
220:
221: registerChildNodes(newNode, deep);
222: return findIfPresent(newNode);
223: }
224:
225: /**
226: * If the parentNode is not registered to domToSoap, create soap wapper for parentNode and register it to domToSoap
227: * If deep = true, also register all children transitively of parentNode to domToSoap map.
228: * @param parentNode node to wrap
229: * @param deep wrap child nodes transitively
230: */
231: public void registerChildNodes(Node parentNode, boolean deep) {
232:• if (parentNode.getUserData(SAAJ_NODE) == null) {
233:• if (parentNode instanceof Element) {
234: ElementFactory.createElement(this, (Element) parentNode);
235:• } else if (parentNode instanceof CharacterData) {
236:• switch (parentNode.getNodeType()) {
237: case CDATA_SECTION_NODE:
238: new CDATAImpl(this, (CharacterData) parentNode);
239: break;
240: case COMMENT_NODE:
241: new SOAPCommentImpl(this, (CharacterData) parentNode);
242: break;
243: case TEXT_NODE:
244: new SOAPTextImpl(this, (CharacterData) parentNode);
245: break;
246: }
247:• } else if (parentNode instanceof DocumentFragment) {
248: new SOAPDocumentFragment(this, (DocumentFragment) parentNode);
249: }
250: }
251:• if (deep) {
252: NodeList nodeList = parentNode.getChildNodes();
253:• for (int i = 0; i < nodeList.getLength(); i++) {
254: Node nextChild = nodeList.item(i);
255: registerChildNodes(nextChild, true);
256: }
257: }
258: }
259:
260: @Override
261: public Element createElementNS(String namespaceURI, String qualifiedName)
262: throws DOMException {
263: return ElementFactory.createElement(
264: this,
265: NameImpl.getLocalNameFromTagName(qualifiedName),
266: NameImpl.getPrefixFromTagName(qualifiedName),
267: namespaceURI);
268: }
269:
270: @Override
271: public Attr createAttributeNS(String namespaceURI, String qualifiedName)
272: throws DOMException {
273: return document.createAttributeNS(namespaceURI, qualifiedName);
274: }
275:
276: @Override
277: public NodeList getElementsByTagNameNS(
278: String namespaceURI,
279: String localName) {
280: return new NodeListImpl(this, document.getElementsByTagNameNS(namespaceURI, localName));
281: }
282:
283: @Override
284: public Element getElementById(String elementId) {
285: return (Element) findIfPresent(document.getElementById(elementId));
286: }
287:
288: @Override
289: public String getInputEncoding() {
290: return document.getInputEncoding();
291: }
292:
293: @Override
294: public String getXmlEncoding() {
295: return document.getXmlEncoding();
296: }
297:
298: @Override
299: public boolean getXmlStandalone() {
300: return document.getXmlStandalone();
301: }
302:
303: @Override
304: public void setXmlStandalone(boolean xmlStandalone) throws DOMException {
305: document.setXmlStandalone(xmlStandalone);
306: }
307:
308: @Override
309: public String getXmlVersion() {
310: return document.getXmlVersion();
311: }
312:
313: @Override
314: public void setXmlVersion(String xmlVersion) throws DOMException {
315: document.setXmlVersion(xmlVersion);
316: }
317:
318: @Override
319: public boolean getStrictErrorChecking() {
320: return document.getStrictErrorChecking();
321: }
322:
323: @Override
324: public void setStrictErrorChecking(boolean strictErrorChecking) {
325: document.setStrictErrorChecking(strictErrorChecking);
326: }
327:
328: @Override
329: public String getDocumentURI() {
330: return document.getDocumentURI();
331: }
332:
333: @Override
334: public void setDocumentURI(String documentURI) {
335: document.setDocumentURI(documentURI);
336: }
337:
338: @Override
339: public Node adoptNode(Node source) throws DOMException {
340: return document.adoptNode(source);
341: }
342:
343: @Override
344: public DOMConfiguration getDomConfig() {
345: return document.getDomConfig();
346: }
347:
348: @Override
349: public void normalizeDocument() {
350: document.normalizeDocument();
351: }
352:
353: @Override
354: public Node renameNode(Node n, String namespaceURI, String qualifiedName) throws DOMException {
355: return findIfPresent(document.renameNode(n, namespaceURI, qualifiedName));
356: }
357:
358: @Override
359: public String getNodeName() {
360: return document.getNodeName();
361: }
362:
363: @Override
364: public String getNodeValue() throws DOMException {
365: return document.getNodeValue();
366: }
367:
368: @Override
369: public void setNodeValue(String nodeValue) throws DOMException {
370: document.setNodeValue(nodeValue);
371: }
372:
373: @Override
374: public short getNodeType() {
375: return document.getNodeType();
376: }
377:
378: @Override
379: public Node getParentNode() {
380: return findIfPresent(document.getParentNode());
381: }
382:
383: @Override
384: public NodeList getChildNodes() {
385: return new NodeListImpl(this, document.getChildNodes());
386: }
387:
388: @Override
389: public Node getFirstChild() {
390: return findIfPresent(document.getFirstChild());
391: }
392:
393: @Override
394: public Node getLastChild() {
395: return findIfPresent(document.getLastChild());
396: }
397:
398: @Override
399: public Node getPreviousSibling() {
400: return findIfPresent(document.getPreviousSibling());
401: }
402:
403: @Override
404: public Node getNextSibling() {
405: return findIfPresent(document.getNextSibling());
406: }
407:
408: @Override
409: public NamedNodeMap getAttributes() {
410: NamedNodeMap attributes = document.getAttributes();
411:• if (attributes == null) {
412: return null;
413: }
414: return new NamedNodeMapImpl(attributes, this);
415: }
416:
417: @Override
418: public Document getOwnerDocument() {
419: return document.getOwnerDocument();
420: }
421:
422: @Override
423: public Node insertBefore(Node newChild, Node refChild) throws DOMException {
424: return document.insertBefore(getDomNode(newChild), getDomNode(refChild));
425: }
426:
427: @Override
428: public Node replaceChild(Node newChild, Node oldChild) throws DOMException {
429: return document.replaceChild(getDomNode(newChild), getDomNode(oldChild));
430: }
431:
432: @Override
433: public Node removeChild(Node oldChild) throws DOMException {
434: return document.removeChild(getDomNode(oldChild));
435: }
436:
437: @Override
438: public Node appendChild(Node newChild) throws DOMException {
439: return document.appendChild(getDomNode(newChild));
440: }
441:
442: @Override
443: public boolean hasChildNodes() {
444: return document.hasChildNodes();
445: }
446:
447: @Override
448: public Node cloneNode(boolean deep) {
449: SOAPPartImpl enclosingPartClone = (SOAPPartImpl) enclosingSOAPPart.cloneNode(deep);
450: registerChildNodes(enclosingPartClone.getDocument().getDomDocument(), deep);
451: return enclosingPartClone.getDocument();
452: }
453:
454: @Override
455: public void normalize() {
456: document.normalize();
457: }
458:
459: @Override
460: public boolean isSupported(String feature, String version) {
461: return document.isSupported(feature, version);
462: }
463:
464: @Override
465: public String getNamespaceURI() {
466: return document.getNamespaceURI();
467: }
468:
469: @Override
470: public String getPrefix() {
471: return document.getPrefix();
472: }
473:
474: @Override
475: public void setPrefix(String prefix) throws DOMException {
476: document.setPrefix(prefix);
477: }
478:
479: @Override
480: public String getLocalName() {
481: return document.getLocalName();
482: }
483:
484: @Override
485: public boolean hasAttributes() {
486: return document.hasAttributes();
487: }
488:
489: @Override
490: public String getBaseURI() {
491: return document.getBaseURI();
492: }
493:
494: @Override
495: public short compareDocumentPosition(Node other) throws DOMException {
496: return document.compareDocumentPosition(getDomNode(other));
497: }
498:
499: @Override
500: public String getTextContent() throws DOMException {
501: return document.getTextContent();
502: }
503:
504: @Override
505: public void setTextContent(String textContent) throws DOMException {
506: document.setTextContent(textContent);
507: }
508:
509: @Override
510: public boolean isSameNode(Node other) {
511: return document.isSameNode(getDomNode(other));
512: }
513:
514: @Override
515: public String lookupPrefix(String namespaceURI) {
516: return document.lookupPrefix(namespaceURI);
517: }
518:
519: @Override
520: public boolean isDefaultNamespace(String namespaceURI) {
521: return document.isDefaultNamespace(namespaceURI);
522: }
523:
524: @Override
525: public String lookupNamespaceURI(String prefix) {
526: return document.lookupNamespaceURI(prefix);
527: }
528:
529: @Override
530: public boolean isEqualNode(Node arg) {
531: return document.isEqualNode(getDomNode(arg));
532: }
533:
534: @Override
535: public Object getFeature(String feature, String version) {
536: return document.getFeature(feature, version);
537: }
538:
539: @Override
540: public Object setUserData(String key, Object data, UserDataHandler handler) {
541: return document.setUserData(key, data, handler);
542: }
543:
544: @Override
545: public Object getUserData(String key) {
546: return document.getUserData(key);
547: }
548:
549: public Document getDomDocument() {
550: return document;
551: }
552:
553: /**
554: * Insert a mapping information for {@link org.w3c.dom.Node} - {@link jakarta.xml.soap.Node}.
555: *
556: * In SAAJ, elements in DOM are expected to be interfaces of SAAJ, on the other hand in JDKs Xerces,
557: * they are casted to internal impl classes. After removal of SAAJ dependency
558: * to JDKs internal classes elements in DOM can never be both of them.
559: *
560: * @param node SAAJ wrapper node for w3c DOM node
561: */
562: public void register(jakarta.xml.soap.Node node) {
563: final Node domElement = getDomNode(node);
564:• if (domElement.getUserData(SAAJ_NODE) != null) {
565: throw new IllegalStateException("Element " + domElement.getNodeName()
566: + " is already registered");
567: }
568: domElement.setUserData(SAAJ_NODE, node, null);
569: }
570:
571: /**
572: * Find a soap wrapper for w3c dom node.
573: *
574: * @param node w3c dom node nullable
575: * @return soap wrapper for w3c dom node
576: */
577: public jakarta.xml.soap.Node find(Node node) {
578: return find(node, true);
579: }
580:
581: private jakarta.xml.soap.Node find(Node node, boolean required) {
582:• if (node == null) {
583: return null;
584: }
585:• if (node instanceof jakarta.xml.soap.Node) {
586: return (jakarta.xml.soap.Node) node;
587: }
588: final jakarta.xml.soap.Node found = (jakarta.xml.soap.Node) node.getUserData(SAAJ_NODE);
589:• if (found == null && required) {
590: throw new IllegalArgumentException(MessageFormat.format("Cannot find SOAP wrapper for element {0}", node));
591: }
592: return found;
593: }
594:
595: /**
596: * If corresponding soap wrapper exists for w3c dom node it is returned,
597: * if not passed dom element is returned.
598: *
599: * @param node w3c dom node
600: * @return soap wrapper or passed w3c dom node if not found
601: */
602: public Node findIfPresent(Node node) {
603: final jakarta.xml.soap.Node found = find(node, false);
604:• return found != null ? found : node;
605: }
606:
607: /**
608: * Extracts w3c dom node from corresponding soap wrapper.
609: *
610: * @param node soap or dom nullable
611: * @return dom node
612: */
613: public Node getDomNode(Node node) {
614:• if (node instanceof SOAPDocumentImpl) {
615: return ((SOAPDocumentImpl)node).getDomElement();
616:• } else if (node instanceof ElementImpl) {
617: return ((ElementImpl) node).getDomElement();
618:• } else if (node instanceof SOAPTextImpl) {
619: return ((SOAPTextImpl)node).getDomElement();
620:• } else if (node instanceof SOAPCommentImpl) {
621: return ((SOAPCommentImpl)node).getDomElement();
622:• } else if (node instanceof CDATAImpl) {
623: return ((CDATAImpl) node).getDomElement();
624:• } else if (node instanceof SOAPDocumentFragment) {
625: return ((SOAPDocumentFragment)node).getDomNode();
626: }
627: return node;
628: }
629:
630:
631: private Node createSoapNode(Class nodeType, Node node) {
632:• if (SOAPTextImpl.class.isAssignableFrom(nodeType)) {
633: return new SOAPTextImpl(this, (Text) node);
634:• } else if (SOAPCommentImpl.class.isAssignableFrom(nodeType)) {
635: return new SOAPCommentImpl(this, (Comment) node);
636:• } else if (CDATAImpl.class.isAssignableFrom(nodeType)) {
637: return new CDATAImpl(this, (CDATASection) node);
638:• } else if (SOAPDocumentFragment.class.isAssignableFrom(nodeType)) {
639: return new SOAPDocumentFragment(this, (DocumentFragment) node);
640: }
641: try {
642: Constructor<Node> constructor = nodeType.getConstructor(SOAPDocumentImpl.class, Element.class);
643: return constructor.newInstance(this, node);
644: } catch (Exception e) {
645: throw new IllegalStateException(e);
646: }
647: }
648:
649:
650: public Document getDomElement() {
651: return document;
652: }
653:
654: @Override
655: public String getValue() {
656: throw new UnsupportedOperationException();
657: }
658:
659: @Override
660: public void setValue(String value) {
661: throw new UnsupportedOperationException();
662: }
663:
664: @Override
665: public void setParentElement(SOAPElement parent) throws SOAPException {
666: throw new UnsupportedOperationException();
667: }
668:
669: @Override
670: public SOAPElement getParentElement() {
671: throw new UnsupportedOperationException();
672: }
673:
674: @Override
675: public void detachNode() {
676: throw new UnsupportedOperationException();
677: }
678:
679: @Override
680: public void recycleNode() {
681: throw new UnsupportedOperationException();
682: }
683: }