Clover coverage report - dom4j - 1.6.1 Coverage timestamp: ma mei 16 2005 14:23:01 GMT+01:00 FRAMES NO FRAMES |
file stats: | LOC: | 583 |  | Methods: | 47
| NCLOC: | 402 |  | Classes: | 2
Source file | Conditionals | Statements | Methods | TOTAL
DOMNodeHelper.java | 11% | 15,4% | 21,3% | 14,9% |

1 |  | /*
2 |  | * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
3 |  | *
4 |  | * This software is open source.
5 |  | * See the bottom of this file for the licence.
6 |  | */
7 |  |
8 |  | package org.dom4j.dom;
9 |  |
10 |  | import java.util.List;
11 |  |
12 |  | import org.dom4j.Branch;
13 |  | import org.dom4j.CharacterData;
14 |  | import org.dom4j.Document;
15 |  | import org.dom4j.DocumentType;
16 |  | import org.dom4j.Element;
17 |  | import org.dom4j.Node;
18 |  |
19 |  | import org.w3c.dom.DOMException;
20 |  | import org.w3c.dom.NamedNodeMap;
21 |  | import org.w3c.dom.NodeList;
22 |  |
23 |  | /**
24 |  | * <p>
25 |  | * <code>DOMNodeHelper</code> contains a collection of utility methods for use
26 |  | * across Node implementations.
27 |  | * </p>
28 |  | *
29 |  | * @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a>
30 |  | * @version $Revision: 1.20 $
31 |  | */
32 |  | public class DOMNodeHelper {
33 |  | public static final NodeList EMPTY_NODE_LIST = new EmptyNodeList();
34 |  |
35 | 0 | protected DOMNodeHelper() {
36 |  | }
37 |  |
38 |  | // Node API
39 |  | // -------------------------------------------------------------------------
40 | 0 | public static boolean supports(Node node, String feature, String version) {
41 | 0 | return false;
42 |  | }
43 |  |
44 | 0 | public static String getNamespaceURI(Node node) {
45 | 0 | return null;
46 |  | }
47 |  |
48 | 0 | public static String getPrefix(Node node) {
49 | 0 | return null;
50 |  | }
51 |  |
52 | 0 | public static String getLocalName(Node node) {
53 | 0 | return null;
54 |  | }
55 |  |
56 | 0 | public static void setPrefix(Node node, String prefix) throws DOMException {
57 | 0 | notSupported();
58 |  | }
59 |  |
60 | 73 | public static String getNodeValue(Node node) throws DOMException {
61 | 73 | return node.getText();
62 |  | }
63 |  |
64 | 0 | public static void setNodeValue(Node node, String nodeValue)
65 |  | throws DOMException {
66 | 0 | node.setText(nodeValue);
67 |  | }
68 |  |
69 | 30 | public static org.w3c.dom.Node getParentNode(Node node) {
70 | 30 | return asDOMNode(node.getParent());
71 |  | }
72 |  |
73 | 0 | public static NodeList getChildNodes(Node node) {
74 | 0 | return EMPTY_NODE_LIST;
75 |  | }
76 |  |
77 | 0 | public static org.w3c.dom.Node getFirstChild(Node node) {
78 | 0 | return null;
79 |  | }
80 |  |
81 | 0 | public static org.w3c.dom.Node getLastChild(Node node) {
82 | 0 | return null;
83 |  | }
84 |  |
85 | 0 | public static org.w3c.dom.Node getPreviousSibling(Node node) {
86 | 0 | Element parent = node.getParent();
87 |  |
88 | 0 | if (parent != null) {
89 | 0 | int index = parent.indexOf(node);
90 |  |
91 | 0 | if (index > 0) {
92 | 0 | Node previous = parent.node(index - 1);
93 |  |
94 | 0 | return asDOMNode(previous);
95 |  | }
96 |  | }
97 |  |
98 | 0 | return null;
99 |  | }
100 |  |
101 | 0 | public static org.w3c.dom.Node getNextSibling(Node node) {
102 | 0 | Element parent = node.getParent();
103 |  |
104 | 0 | if (parent != null) {
105 | 0 | int index = parent.indexOf(node);
106 |  |
107 | 0 | if (index >= 0) {
108 | 0 | if (++index < parent.nodeCount()) {
109 | 0 | Node next = parent.node(index);
110 |  |
111 | 0 | return asDOMNode(next);
112 |  | }
113 |  | }
114 |  | }
115 |  |
116 | 0 | return null;
117 |  | }
118 |  |
119 | 0 | public static NamedNodeMap getAttributes(Node node) {
120 | 0 | return null;
121 |  | }
122 |  |
123 | 0 | public static org.w3c.dom.Document getOwnerDocument(Node node) {
124 | 0 | return asDOMDocument(node.getDocument());
125 |  | }
126 |  |
127 | 0 | public static org.w3c.dom.Node insertBefore(Node node,
128 |  | org.w3c.dom.Node newChild, org.w3c.dom.Node refChild)
129 |  | throws DOMException {
130 | 0 | if (node instanceof Branch) {
131 | 0 | Branch branch = (Branch) node;
132 | 0 | List list = branch.content();
133 | 0 | int index = list.indexOf(refChild);
134 |  |
135 | 0 | if (index < 0) {
136 | 0 | branch.add((Node) newChild);
137 |  | } else {
138 | 0 | list.add(index, newChild);
139 |  | }
140 |  |
141 | 0 | return newChild;
142 |  | } else {
143 | 0 | throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
144 |  | "Children not allowed for this node: " + node);
145 |  | }
146 |  | }
147 |  |
148 | 2 | public static org.w3c.dom.Node replaceChild(Node node,
149 |  | org.w3c.dom.Node newChild, org.w3c.dom.Node oldChild)
150 |  | throws DOMException {
151 | 2 | if (node instanceof Branch) {
152 | 2 | Branch branch = (Branch) node;
153 | 2 | List list = branch.content();
154 | 2 | int index = list.indexOf(oldChild);
155 |  |
156 | 2 | if (index < 0) {
157 | 1 | throw new DOMException(DOMException.NOT_FOUND_ERR,
158 |  | "Tried to replace a non existing child " + "for node: "
159 |  | + node);
160 |  | }
161 |  |
162 | 1 | list.set(index, newChild);
163 |  |
164 | 1 | return oldChild;
165 |  | } else {
166 | 0 | throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
167 |  | "Children not allowed for this node: " + node);
168 |  | }
169 |  | }
170 |  |
171 | 0 | public static org.w3c.dom.Node removeChild(Node node,
172 |  | org.w3c.dom.Node oldChild) throws DOMException {
173 | 0 | if (node instanceof Branch) {
174 | 0 | Branch branch = (Branch) node;
175 | 0 | branch.remove((Node) oldChild);
176 |  |
177 | 0 | return oldChild;
178 |  | }
179 |  |
180 | 0 | throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
181 |  | "Children not allowed for this node: " + node);
182 |  | }
183 |  |
184 | 30 | public static org.w3c.dom.Node appendChild(Node node,
185 |  | org.w3c.dom.Node newChild) throws DOMException {
186 | 30 | if (node instanceof Branch) {
187 | 30 | Branch branch = (Branch) node;
188 | 30 | org.w3c.dom.Node previousParent = newChild.getParentNode();
189 |  |
190 | 30 | if (previousParent != null) {
191 | 0 | previousParent.removeChild(newChild);
192 |  | }
193 |  |
194 | 30 | branch.add((Node) newChild);
195 |  |
196 | 30 | return newChild;
197 |  | }
198 |  |
199 | 0 | throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
200 |  | "Children not allowed for this node: " + node);
201 |  | }
202 |  |
203 | 0 | public static boolean hasChildNodes(Node node) {
204 | 0 | return false;
205 |  | }
206 |  |
207 | 1 | public static org.w3c.dom.Node cloneNode(Node node, boolean deep) {
208 | 1 | return asDOMNode((Node) node.clone());
209 |  | }
210 |  |
211 | 0 | public static void normalize(Node node) {
212 | 0 | notSupported();
213 |  | }
214 |  |
215 | 0 | public static boolean isSupported(Node n, String feature, String version) {
216 | 0 | return false;
217 |  | }
218 |  |
219 | 0 | public static boolean hasAttributes(Node node) {
220 | 0 | if ((node != null) && node instanceof Element) {
221 | 0 | return ((Element) node).attributeCount() > 0;
222 |  | } else {
223 | 0 | return false;
224 |  | }
225 |  | }
226 |  |
227 |  | // CharacterData API
228 |  | // -------------------------------------------------------------------------
229 | 0 | public static String getData(CharacterData charData) throws DOMException {
230 | 0 | return charData.getText();
231 |  | }
232 |  |
233 | 0 | public static void setData(CharacterData charData, String data)
234 |  | throws DOMException {
235 | 0 | charData.setText(data);
236 |  | }
237 |  |
238 | 0 | public static int getLength(CharacterData charData) {
239 | 0 | String text = charData.getText();
240 |  |
241 | 0 | return (text != null) ? text.length() : 0;
242 |  | }
243 |  |
244 | 0 | public static String substringData(CharacterData charData, int offset,
245 |  | int count) throws DOMException {
246 | 0 | if (count < 0) {
247 | 0 | throw new DOMException(DOMException.INDEX_SIZE_ERR,
248 |  | "Illegal value for count: " + count);
249 |  | }
250 |  |
251 | 0 | String text = charData.getText();
252 | 0 | int length = (text != null) ? text.length() : 0;
253 |  |
254 | 0 | if ((offset < 0) || (offset >= length)) {
255 | 0 | throw new DOMException(DOMException.INDEX_SIZE_ERR,
256 |  | "No text at offset: " + offset);
257 |  | }
258 |  |
259 | 0 | if ((offset + count) > length) {
260 | 0 | return text.substring(offset);
261 |  | }
262 |  |
263 | 0 | return text.substring(offset, offset + count);
264 |  | }
265 |  |
266 | 0 | public static void appendData(CharacterData charData, String arg)
267 |  | throws DOMException {
268 | 0 | if (charData.isReadOnly()) {
269 | 0 | throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR,
270 |  | "CharacterData node is read only: " + charData);
271 |  | } else {
272 | 0 | String text = charData.getText();
273 |  |
274 | 0 | if (text == null) {
275 | 0 | charData.setText(text);
276 |  | } else {
277 | 0 | charData.setText(text + arg);
278 |  | }
279 |  | }
280 |  | }
281 |  |
282 | 0 | public static void insertData(CharacterData data, int offset, String arg)
283 |  | throws DOMException {
284 | 0 | if (data.isReadOnly()) {
285 | 0 | throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR,
286 |  | "CharacterData node is read only: " + data);
287 |  | } else {
288 | 0 | String text = data.getText();
289 |  |
290 | 0 | if (text == null) {
291 | 0 | data.setText(arg);
292 |  | } else {
293 | 0 | int length = text.length();
294 |  |
295 | 0 | if ((offset < 0) || (offset > length)) {
296 | 0 | throw new DOMException(DOMException.INDEX_SIZE_ERR,
297 |  | "No text at offset: " + offset);
298 |  | } else {
299 | 0 | StringBuffer buffer = new StringBuffer(text);
300 | 0 | buffer.insert(offset, arg);
301 | 0 | data.setText(buffer.toString());
302 |  | }
303 |  | }
304 |  | }
305 |  | }
306 |  |
307 | 0 | public static void deleteData(CharacterData charData, int offset, int count)
308 |  | throws DOMException {
309 | 0 | if (charData.isReadOnly()) {
310 | 0 | throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR,
311 |  | "CharacterData node is read only: " + charData);
312 |  | } else {
313 | 0 | if (count < 0) {
314 | 0 | throw new DOMException(DOMException.INDEX_SIZE_ERR,
315 |  | "Illegal value for count: " + count);
316 |  | }
317 |  |
318 | 0 | String text = charData.getText();
319 |  |
320 | 0 | if (text != null) {
321 | 0 | int length = text.length();
322 |  |
323 | 0 | if ((offset < 0) || (offset >= length)) {
324 | 0 | throw new DOMException(DOMException.INDEX_SIZE_ERR,
325 |  | "No text at offset: " + offset);
326 |  | } else {
327 | 0 | StringBuffer buffer = new StringBuffer(text);
328 | 0 | buffer.delete(offset, offset + count);
329 | 0 | charData.setText(buffer.toString());
330 |  | }
331 |  | }
332 |  | }
333 |  | }
334 |  |
335 | 0 | public static void replaceData(CharacterData charData, int offset,
336 |  | int count, String arg) throws DOMException {
337 | 0 | if (charData.isReadOnly()) {
338 | 0 | throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR,
339 |  | "CharacterData node is read only: " + charData);
340 |  | } else {
341 | 0 | if (count < 0) {
342 | 0 | throw new DOMException(DOMException.INDEX_SIZE_ERR,
343 |  | "Illegal value for count: " + count);
344 |  | }
345 |  |
346 | 0 | String text = charData.getText();
347 |  |
348 | 0 | if (text != null) {
349 | 0 | int length = text.length();
350 |  |
351 | 0 | if ((offset < 0) || (offset >= length)) {
352 | 0 | throw new DOMException(DOMException.INDEX_SIZE_ERR,
353 |  | "No text at offset: " + offset);
354 |  | } else {
355 | 0 | StringBuffer buffer = new StringBuffer(text);
356 | 0 | buffer.replace(offset, offset + count, arg);
357 | 0 | charData.setText(buffer.toString());
358 |  | }
359 |  | }
360 |  | }
361 |  | }
362 |  |
363 |  | // Branch API
364 |  | // -------------------------------------------------------------------------
365 | 0 | public static void appendElementsByTagName(List list, Branch parent,
366 |  | String name) {
367 | 0 | final boolean isStar = "*".equals(name);
368 |  |
369 | 0 | for (int i = 0, size = parent.nodeCount(); i < size; i++) {
370 | 0 | Node node = parent.node(i);
371 |  |
372 | 0 | if (node instanceof Element) {
373 | 0 | Element element = (Element) node;
374 |  |
375 | 0 | if (isStar || name.equals(element.getName())) {
376 | 0 | list.add(element);
377 |  | }
378 |  |
379 | 0 | appendElementsByTagName(list, element, name);
380 |  | }
381 |  | }
382 |  | }
383 |  |
384 | 0 | public static void appendElementsByTagNameNS(List list, Branch parent,
385 |  | String namespace, String localName) {
386 | 0 | final boolean isStarNS = "*".equals(namespace);
387 | 0 | final boolean isStar = "*".equals(localName);
388 |  |
389 | 0 | for (int i = 0, size = parent.nodeCount(); i < size; i++) {
390 | 0 | Node node = parent.node(i);
391 |  |
392 | 0 | if (node instanceof Element) {
393 | 0 | Element element = (Element) node;
394 |  |
395 | 0 | if ((isStarNS
396 |  | || (((namespace == null)
397 |  | || (namespace.length() == 0)) && ((element
398 |  | .getNamespaceURI() == null) || (element
399 |  | .getNamespaceURI().length() == 0)))
400 |  | || ((namespace != null) && namespace
401 |  | .equals(element.getNamespaceURI())))
402 |  | && (isStar || localName.equals(element.getName()))) {
403 | 0 | list.add(element);
404 |  | }
405 |  |
406 | 0 | appendElementsByTagNameNS(list, element, namespace, localName);
407 |  | }
408 |  | }
409 |  | }
410 |  |
411 |  | // Helper methods
412 |  | // -------------------------------------------------------------------------
413 | 34 | public static NodeList createNodeList(final List list) {
414 | 34 | return new NodeList() {
415 | 112 | public org.w3c.dom.Node item(int index) {
416 | 112 | if (index >= getLength()) {
417 |  | /*
418 |  | * From the NodeList specification: If index is greater than
419 |  | * or equal to the number of nodes in the list, this returns
420 |  | * null.
421 |  | */
422 | 0 | return null;
423 |  | } else {
424 | 112 | return DOMNodeHelper.asDOMNode((Node) list.get(index));
425 |  | }
426 |  | }
427 |  |
428 | 145 | public int getLength() {
429 | 145 | return list.size();
430 |  | }
431 |  | };
432 |  | }
433 |  |
434 | 143 | public static org.w3c.dom.Node asDOMNode(Node node) {
435 | 143 | if (node == null) {
436 | 30 | return null;
437 |  | }
438 |  |
439 | 113 | if (node instanceof org.w3c.dom.Node) {
440 | 113 | return (org.w3c.dom.Node) node;
441 |  | } else {
442 |  | // Use DOMWriter?
443 | 0 | System.out.println("Cannot convert: " + node
444 |  | + " into a W3C DOM Node");
445 | 0 | notSupported();
446 |  |
447 | 0 | return null;
448 |  | }
449 |  | }
450 |  |
451 | 0 | public static org.w3c.dom.Document asDOMDocument(Document document) {
452 | 0 | if (document == null) {
453 | 0 | return null;
454 |  | }
455 |  |
456 | 0 | if (document instanceof org.w3c.dom.Document) {
457 | 0 | return (org.w3c.dom.Document) document;
458 |  | } else {
459 |  | // Use DOMWriter?
460 | 0 | notSupported();
461 |  |
462 | 0 | return null;
463 |  | }
464 |  | }
465 |  |
466 | 0 | public static org.w3c.dom.DocumentType asDOMDocumentType(DocumentType dt) {
467 | 0 | if (dt == null) {
468 | 0 | return null;
469 |  | }
470 |  |
471 | 0 | if (dt instanceof org.w3c.dom.DocumentType) {
472 | 0 | return (org.w3c.dom.DocumentType) dt;
473 |  | } else {
474 |  | // Use DOMWriter?
475 | 0 | notSupported();
476 |  |
477 | 0 | return null;
478 |  | }
479 |  | }
480 |  |
481 | 0 | public static org.w3c.dom.Text asDOMText(CharacterData text) {
482 | 0 | if (text == null) {
483 | 0 | return null;
484 |  | }
485 |  |
486 | 0 | if (text instanceof org.w3c.dom.Text) {
487 | 0 | return (org.w3c.dom.Text) text;
488 |  | } else {
489 |  | // Use DOMWriter?
490 | 0 | notSupported();
491 |  |
492 | 0 | return null;
493 |  | }
494 |  | }
495 |  |
496 | 3 | public static org.w3c.dom.Element asDOMElement(Node element) {
497 | 3 | if (element == null) {
498 | 0 | return null;
499 |  | }
500 |  |
501 | 3 | if (element instanceof org.w3c.dom.Element) {
502 | 3 | return (org.w3c.dom.Element) element;
503 |  | } else {
504 |  | // Use DOMWriter?
505 | 0 | notSupported();
506 |  |
507 | 0 | return null;
508 |  | }
509 |  | }
510 |  |
511 | 0 | public static org.w3c.dom.Attr asDOMAttr(Node attribute) {
512 | 0 | if (attribute == null) {
513 | 0 | return null;
514 |  | }
515 |  |
516 | 0 | if (attribute instanceof org.w3c.dom.Attr) {
517 | 0 | return (org.w3c.dom.Attr) attribute;
518 |  | } else {
519 |  | // Use DOMWriter?
520 | 0 | notSupported();
521 |  |
522 | 0 | return null;
523 |  | }
524 |  | }
525 |  |
526 |  | /**
527 |  | * Called when a method has not been implemented yet
528 |  | *
529 |  | * @throws DOMException
530 |  | * DOCUMENT ME!
531 |  | */
532 | 0 | public static void notSupported() {
533 | 0 | throw new DOMException(DOMException.NOT_SUPPORTED_ERR,
534 |  | "Not supported yet");
535 |  | }
536 |  |
537 |  | public static class EmptyNodeList implements NodeList {
538 | 0 | public org.w3c.dom.Node item(int index) {
539 | 0 | return null;
540 |  | }
541 |  |
542 | 0 | public int getLength() {
543 | 0 | return 0;
544 |  | }
545 |  | }
546 |  | }
547 |  |
548 |  | /*
549 |  | * Redistribution and use of this software and associated documentation
550 |  | * ("Software"), with or without modification, are permitted provided that the
551 |  | * following conditions are met:
552 |  | *
553 |  | * 1. Redistributions of source code must retain copyright statements and
554 |  | * notices. Redistributions must also contain a copy of this document.
555 |  | *
556 |  | * 2. Redistributions in binary form must reproduce the above copyright notice,
557 |  | * this list of conditions and the following disclaimer in the documentation
558 |  | * and/or other materials provided with the distribution.
559 |  | *
560 |  | * 3. The name "DOM4J" must not be used to endorse or promote products derived
561 |  | * from this Software without prior written permission of MetaStuff, Ltd. For
562 |  | * written permission, please contact dom4j-info@metastuff.com.
563 |  | *
564 |  | * 4. Products derived from this Software may not be called "DOM4J" nor may
565 |  | * "DOM4J" appear in their names without prior written permission of MetaStuff,
566 |  | * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
567 |  | *
568 |  | * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
569 |  | *
570 |  | * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
571 |  | * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
572 |  | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
573 |  | * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
574 |  | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
575 |  | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
576 |  | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
577 |  | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
578 |  | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
579 |  | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
580 |  | * POSSIBILITY OF SUCH DAMAGE.
581 |  | *
582 |  | * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
583 |  | */