KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > dom4j > dom > DOMTest


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 junit.textui.TestRunner;
11
12 import java.io.StringReader JavaDoc;
13
14 import org.dom4j.AbstractTestCase;
15 import org.dom4j.io.DOMWriter;
16 import org.dom4j.io.SAXReader;
17
18 import org.w3c.dom.DOMException JavaDoc;
19 import org.w3c.dom.NamedNodeMap JavaDoc;
20 import org.w3c.dom.Node JavaDoc;
21 import org.w3c.dom.NodeList JavaDoc;
22
23 /**
24  * A test harness to test the native DOM implementation of dom4j
25  *
26  * @author <a HREF="mailto:james.strachan@metastuff.com">James Strachan </a>
27  * @version $Revision: 1.4 $
28  */

29 public class DOMTest extends AbstractTestCase {
30     /** Elements. */
31     private long elements;
32
33     /** Attributes. */
34     private long attributes;
35
36     /** Characters. */
37     private long characters;
38
39     public static void main(String JavaDoc[] args) {
40         TestRunner.run(DOMTest.class);
41     }
42
43     // Test case(s)
44
// -------------------------------------------------------------------------
45
public void testCount() throws Exception JavaDoc {
46         DOMWriter domWriter = new DOMWriter();
47
48         long start = System.currentTimeMillis();
49         org.w3c.dom.Document JavaDoc domDocument = domWriter.write(document);
50         long end = System.currentTimeMillis();
51
52         System.out.println("Converting to a W3C Document took: "
53                 + (end - start) + " milliseconds");
54
55         traverse(domDocument);
56
57         log("elements: " + elements + " attributes: " + attributes
58                 + " characters: " + characters);
59     }
60
61     public void testNamespace() throws Exception JavaDoc {
62         String JavaDoc xml = "<prefix:root xmlns:prefix=\"myuri\" />";
63         SAXReader xmlReader = new SAXReader(DOMDocumentFactory.getInstance());
64         DOMDocument d = (DOMDocument) xmlReader.read(new StringReader JavaDoc(xml));
65
66         assertEquals("namespace prefix not correct", "prefix", d
67                 .getRootElement().getNamespace().getPrefix());
68         assertEquals("namespace uri not correct", "myuri", d.getRootElement()
69                 .getNamespace().getURI());
70
71         System.out.println(d.asXML());
72     }
73
74     /**
75      * Tests the bug found by Soumanjoy
76      *
77      * @throws Exception
78      * DOCUMENT ME!
79      */

80     public void testClassCastBug() throws Exception JavaDoc {
81         DOMDocument oDocument = new DOMDocument("Root");
82         org.w3c.dom.Element JavaDoc oParent = oDocument.createElement("Parent");
83
84         // <-- Fails here when the code is broken.
85
oParent.setAttribute("name", "N01");
86         oParent.setAttribute("id", "ID01");
87
88         oDocument.appendChild(oParent); // <-- Fails here, Error message is
89
// below
90
}
91
92     public void testReplaceChild() throws Exception JavaDoc {
93         DOMDocument document = new DOMDocument("Root");
94         org.w3c.dom.Element JavaDoc parent = document.createElement("Parent");
95         org.w3c.dom.Element JavaDoc first = document.createElement("FirstChild");
96         org.w3c.dom.Element JavaDoc second = document.createElement("SecondChild");
97         org.w3c.dom.Element JavaDoc third = document.createElement("ThirdChild");
98
99         document.appendChild(parent);
100         parent.appendChild(first);
101         parent.appendChild(second);
102         parent.appendChild(third);
103
104         org.w3c.dom.Element JavaDoc newFirst = document.createElement("NewFirst");
105         org.w3c.dom.Element JavaDoc oldFirst = (org.w3c.dom.Element JavaDoc) parent
106                 .replaceChild(newFirst, first);
107
108         /* check the return value of replaceChild */
109         assertEquals(oldFirst, first);
110
111         /* make sure the old node has been replaced */
112         NodeList JavaDoc children = parent.getChildNodes();
113         Node JavaDoc firstChild = children.item(0);
114         assertEquals(Node.ELEMENT_NODE, firstChild.getNodeType());
115         assertEquals(newFirst, firstChild);
116
117         /* try to replace a node that doesn't exist */
118         org.w3c.dom.Element JavaDoc badNode = document.createElement("No Child");
119
120         try {
121             parent.replaceChild(newFirst, badNode);
122             fail("DOMException not thrown");
123         } catch (DOMException JavaDoc e) {
124             assertEquals(DOMException.NOT_FOUND_ERR, e.code);
125         }
126     }
127
128     // Implementation methods
129
// -------------------------------------------------------------------------
130
protected void setUp() throws Exception JavaDoc {
131         super.setUp();
132
133         SAXReader reader = new SAXReader(DOMDocumentFactory.getInstance());
134         document = getDocument("/xml/contents.xml", reader);
135     }
136
137     /**
138      * Traverses the specified node, recursively.
139      *
140      * @param node
141      * DOCUMENT ME!
142      */

143     protected void traverse(Node JavaDoc node) {
144         // is there anything to do?
145
if (node == null) {
146             return;
147         }
148
149         int type = node.getNodeType();
150
151         switch (type) {
152             case Node.DOCUMENT_NODE: {
153                 elements = 0;
154                 attributes = 0;
155                 characters = 0;
156                 traverse(((org.w3c.dom.Document JavaDoc) node).getDocumentElement());
157
158                 break;
159             }
160
161             case Node.ELEMENT_NODE: {
162                 elements++;
163
164                 NamedNodeMap JavaDoc attrs = node.getAttributes();
165
166                 if (attrs != null) {
167                     attributes += attrs.getLength();
168                 }
169
170                 NodeList JavaDoc children = node.getChildNodes();
171
172                 if (children != null) {
173                     int len = children.getLength();
174
175                     for (int i = 0; i < len; i++) {
176                         traverse(children.item(i));
177                     }
178                 }
179
180                 break;
181             }
182
183             case Node.ENTITY_REFERENCE_NODE: {
184                 NodeList JavaDoc children = node.getChildNodes();
185
186                 if (children != null) {
187                     int len = children.getLength();
188
189                     for (int i = 0; i < len; i++) {
190                         traverse(children.item(i));
191                     }
192                 }
193
194                 break;
195             }
196
197             case Node.CDATA_SECTION_NODE: {
198                 characters += node.getNodeValue().length();
199
200                 break;
201             }
202
203             case Node.TEXT_NODE: {
204                 characters += node.getNodeValue().length();
205
206                 break;
207             }
208
209             default:
210                 break;
211         }
212     }
213 }
214
215 /*
216  * Redistribution and use of this software and associated documentation
217  * ("Software"), with or without modification, are permitted provided that the
218  * following conditions are met:
219  *
220  * 1. Redistributions of source code must retain copyright statements and
221  * notices. Redistributions must also contain a copy of this document.
222  *
223  * 2. Redistributions in binary form must reproduce the above copyright notice,
224  * this list of conditions and the following disclaimer in the documentation
225  * and/or other materials provided with the distribution.
226  *
227  * 3. The name "DOM4J" must not be used to endorse or promote products derived
228  * from this Software without prior written permission of MetaStuff, Ltd. For
229  * written permission, please contact dom4j-info@metastuff.com.
230  *
231  * 4. Products derived from this Software may not be called "DOM4J" nor may
232  * "DOM4J" appear in their names without prior written permission of MetaStuff,
233  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
234  *
235  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
236  *
237  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
238  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
239  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
240  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
241  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
242  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
243  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
244  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
245  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
246  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
247  * POSSIBILITY OF SUCH DAMAGE.
248  *
249  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
250  */

251
Popular Tags