1
2
3
4
5
6
7
8 package org.dom4j.dom;
9
10 import java.util.ArrayList;
11
12 import org.dom4j.DocumentFactory;
13 import org.dom4j.QName;
14 import org.dom4j.tree.DefaultDocument;
15
16 import org.w3c.dom.Attr;
17 import org.w3c.dom.CDATASection;
18 import org.w3c.dom.DOMException;
19 import org.w3c.dom.Document;
20 import org.w3c.dom.EntityReference;
21 import org.w3c.dom.NamedNodeMap;
22 import org.w3c.dom.NodeList;
23 import org.w3c.dom.ProcessingInstruction;
24
25 /***
26 * <p>
27 * <code>DOMDocument</code> implements an XML document which supports the W3C
28 * DOM API.
29 * </p>
30 *
31 * @author <a href="mailto:jstrachan@apache.org">James Strachan </a>
32 * @version $Revision: 1.17 $
33 */
34 public class DOMDocument extends DefaultDocument implements Document {
35 /*** The <code>DocumentFactory</code> instance used by default */
36 private static final DOMDocumentFactory DOCUMENT_FACTORY
37 = (DOMDocumentFactory) DOMDocumentFactory.getInstance();
38
39 public DOMDocument() {
40 init();
41 }
42
43 public DOMDocument(String name) {
44 super(name);
45 init();
46 }
47
48 public DOMDocument(DOMElement rootElement) {
49 super(rootElement);
50 init();
51 }
52
53 public DOMDocument(DOMDocumentType docType) {
54 super(docType);
55 init();
56 }
57
58 public DOMDocument(DOMElement rootElement, DOMDocumentType docType) {
59 super(rootElement, docType);
60 init();
61 }
62
63 public DOMDocument(String name, DOMElement rootElement,
64 DOMDocumentType docType) {
65 super(name, rootElement, docType);
66 init();
67 }
68
69 private void init() {
70 setDocumentFactory(DOCUMENT_FACTORY);
71 }
72
73
74
75 public boolean supports(String feature, String version) {
76 return DOMNodeHelper.supports(this, feature, version);
77 }
78
79 public String getNamespaceURI() {
80 return DOMNodeHelper.getNamespaceURI(this);
81 }
82
83 public String getPrefix() {
84 return DOMNodeHelper.getPrefix(this);
85 }
86
87 public void setPrefix(String prefix) throws DOMException {
88 DOMNodeHelper.setPrefix(this, prefix);
89 }
90
91 public String getLocalName() {
92 return DOMNodeHelper.getLocalName(this);
93 }
94
95 public String getNodeName() {
96 return "#document";
97 }
98
99
100
101
102 public String getNodeValue() throws DOMException {
103 return null;
104 }
105
106 public void setNodeValue(String nodeValue) throws DOMException {
107 }
108
109 public org.w3c.dom.Node getParentNode() {
110 return DOMNodeHelper.getParentNode(this);
111 }
112
113 public NodeList getChildNodes() {
114 return DOMNodeHelper.createNodeList(content());
115 }
116
117 public org.w3c.dom.Node getFirstChild() {
118 return DOMNodeHelper.asDOMNode(node(0));
119 }
120
121 public org.w3c.dom.Node getLastChild() {
122 return DOMNodeHelper.asDOMNode(node(nodeCount() - 1));
123 }
124
125 public org.w3c.dom.Node getPreviousSibling() {
126 return DOMNodeHelper.getPreviousSibling(this);
127 }
128
129 public org.w3c.dom.Node getNextSibling() {
130 return DOMNodeHelper.getNextSibling(this);
131 }
132
133 public NamedNodeMap getAttributes() {
134 return null;
135 }
136
137 public org.w3c.dom.Document getOwnerDocument() {
138 return null;
139 }
140
141 public org.w3c.dom.Node insertBefore(org.w3c.dom.Node newChild,
142 org.w3c.dom.Node refChild) throws DOMException {
143 checkNewChildNode(newChild);
144
145 return DOMNodeHelper.insertBefore(this, newChild, refChild);
146 }
147
148 public org.w3c.dom.Node replaceChild(org.w3c.dom.Node newChild,
149 org.w3c.dom.Node oldChild) throws DOMException {
150 checkNewChildNode(newChild);
151
152 return DOMNodeHelper.replaceChild(this, newChild, oldChild);
153 }
154
155 public org.w3c.dom.Node removeChild(org.w3c.dom.Node oldChild)
156 throws DOMException {
157 return DOMNodeHelper.removeChild(this, oldChild);
158 }
159
160 public org.w3c.dom.Node appendChild(org.w3c.dom.Node newChild)
161 throws DOMException {
162 checkNewChildNode(newChild);
163
164 return DOMNodeHelper.appendChild(this, newChild);
165 }
166
167 private void checkNewChildNode(org.w3c.dom.Node newChild)
168 throws DOMException {
169 final int nodeType = newChild.getNodeType();
170
171 if (!((nodeType == org.w3c.dom.Node.ELEMENT_NODE)
172 || (nodeType == org.w3c.dom.Node.COMMENT_NODE)
173 || (nodeType == org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE)
174 || (nodeType == org.w3c.dom.Node.DOCUMENT_TYPE_NODE))) {
175 throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
176 "Given node cannot be a child of document");
177 }
178 }
179
180 public boolean hasChildNodes() {
181 return nodeCount() > 0;
182 }
183
184 public org.w3c.dom.Node cloneNode(boolean deep) {
185 return DOMNodeHelper.cloneNode(this, deep);
186 }
187
188 public boolean isSupported(String feature, String version) {
189 return DOMNodeHelper.isSupported(this, feature, version);
190 }
191
192 public boolean hasAttributes() {
193 return DOMNodeHelper.hasAttributes(this);
194 }
195
196
197
198 public NodeList getElementsByTagName(String name) {
199 ArrayList list = new ArrayList();
200 DOMNodeHelper.appendElementsByTagName(list, this, name);
201
202 return DOMNodeHelper.createNodeList(list);
203 }
204
205 public NodeList getElementsByTagNameNS(String namespace, String name) {
206 ArrayList list = new ArrayList();
207 DOMNodeHelper.appendElementsByTagNameNS(list, this, namespace, name);
208
209 return DOMNodeHelper.createNodeList(list);
210 }
211
212 public org.w3c.dom.DocumentType getDoctype() {
213 return DOMNodeHelper.asDOMDocumentType(getDocType());
214 }
215
216 public org.w3c.dom.DOMImplementation getImplementation() {
217 if (getDocumentFactory() instanceof org.w3c.dom.DOMImplementation) {
218 return (org.w3c.dom.DOMImplementation) getDocumentFactory();
219 } else {
220 return DOCUMENT_FACTORY;
221 }
222 }
223
224 public org.w3c.dom.Element getDocumentElement() {
225 return DOMNodeHelper.asDOMElement(getRootElement());
226 }
227
228 public org.w3c.dom.Element createElement(String name) throws DOMException {
229 return (org.w3c.dom.Element) getDocumentFactory().createElement(name);
230 }
231
232 public org.w3c.dom.DocumentFragment createDocumentFragment() {
233 DOMNodeHelper.notSupported();
234
235 return null;
236 }
237
238 public org.w3c.dom.Text createTextNode(String data) {
239 return (org.w3c.dom.Text) getDocumentFactory().createText(data);
240 }
241
242 public org.w3c.dom.Comment createComment(String data) {
243 return (org.w3c.dom.Comment) getDocumentFactory().createComment(data);
244 }
245
246 public CDATASection createCDATASection(String data) throws DOMException {
247 return (CDATASection) getDocumentFactory().createCDATA(data);
248 }
249
250 public ProcessingInstruction createProcessingInstruction(String target,
251 String data) throws DOMException {
252 return (ProcessingInstruction) getDocumentFactory()
253 .createProcessingInstruction(target, data);
254 }
255
256 public Attr createAttribute(String name) throws DOMException {
257 QName qname = getDocumentFactory().createQName(name);
258
259 return (Attr) getDocumentFactory().createAttribute(null, qname, "");
260 }
261
262 public EntityReference createEntityReference(String name)
263 throws DOMException {
264 return (EntityReference) getDocumentFactory().createEntity(name, null);
265 }
266
267 public org.w3c.dom.Node importNode(org.w3c.dom.Node importedNode,
268 boolean deep) throws DOMException {
269 DOMNodeHelper.notSupported();
270
271 return null;
272 }
273
274 public org.w3c.dom.Element createElementNS(String namespaceURI,
275 String qualifiedName) throws DOMException {
276 QName qname = getDocumentFactory().createQName(qualifiedName,
277 namespaceURI);
278
279 return (org.w3c.dom.Element) getDocumentFactory().createElement(qname);
280 }
281
282 public org.w3c.dom.Attr createAttributeNS(String namespaceURI,
283 String qualifiedName) throws DOMException {
284 QName qname = getDocumentFactory().createQName(qualifiedName,
285 namespaceURI);
286
287 return (org.w3c.dom.Attr) getDocumentFactory().createAttribute(null,
288 qname, null);
289 }
290
291 public org.w3c.dom.Element getElementById(String elementId) {
292 return DOMNodeHelper.asDOMElement(elementByID(elementId));
293 }
294
295
296
297 protected DocumentFactory getDocumentFactory() {
298 if (super.getDocumentFactory() == null) {
299 return DOCUMENT_FACTORY;
300 } else {
301 return super.getDocumentFactory();
302 }
303 }
304 }
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341