comparison NGSrich_0.5.5/src/org/jdom/input/DOMBuilder.java @ 0:89ad0a9cca52 default tip

Uploaded
author pfrommolt
date Mon, 21 Nov 2011 08:12:19 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:89ad0a9cca52
1 /*--
2
3 $Id: DOMBuilder.java,v 1.60 2007/11/10 05:29:00 jhunter Exp $
4
5 Copyright (C) 2000-2007 Jason Hunter & Brett McLaughlin.
6 All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions
10 are met:
11
12 1. Redistributions of source code must retain the above copyright
13 notice, this list of conditions, and the following disclaimer.
14
15 2. Redistributions in binary form must reproduce the above copyright
16 notice, this list of conditions, and the disclaimer that follows
17 these conditions in the documentation and/or other materials
18 provided with the distribution.
19
20 3. The name "JDOM" must not be used to endorse or promote products
21 derived from this software without prior written permission. For
22 written permission, please contact <request_AT_jdom_DOT_org>.
23
24 4. Products derived from this software may not be called "JDOM", nor
25 may "JDOM" appear in their name, without prior written permission
26 from the JDOM Project Management <request_AT_jdom_DOT_org>.
27
28 In addition, we request (but do not require) that you include in the
29 end-user documentation provided with the redistribution and/or in the
30 software itself an acknowledgement equivalent to the following:
31 "This product includes software developed by the
32 JDOM Project (http://www.jdom.org/)."
33 Alternatively, the acknowledgment may be graphical using the logos
34 available at http://www.jdom.org/images/logos.
35
36 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39 DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
40 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43 USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47 SUCH DAMAGE.
48
49 This software consists of voluntary contributions made by many
50 individuals on behalf of the JDOM Project and was originally
51 created by Jason Hunter <jhunter_AT_jdom_DOT_org> and
52 Brett McLaughlin <brett_AT_jdom_DOT_org>. For more information
53 on the JDOM Project, please see <http://www.jdom.org/>.
54
55 */
56
57 package org.jdom.input;
58
59 import org.jdom.*;
60 import org.jdom.Document;
61 import org.jdom.Element;
62 import org.w3c.dom.*;
63
64 /**
65 * Builds a JDOM {@link org.jdom.Document org.jdom.Document} from a pre-existing
66 * DOM {@link org.w3c.dom.Document org.w3c.dom.Document}. Also handy for testing
67 * builds from files to sanity check {@link SAXBuilder}.
68 *
69 * @version $Revision: 1.60 $, $Date: 2007/11/10 05:29:00 $
70 * @author Brett McLaughlin
71 * @author Jason Hunter
72 * @author Philip Nelson
73 * @author Kevin Regan
74 * @author Yusuf Goolamabbas
75 * @author Dan Schaffer
76 * @author Bradley S. Huffman
77 */
78 public class DOMBuilder {
79
80 private static final String CVS_ID =
81 "@(#) $RCSfile: DOMBuilder.java,v $ $Revision: 1.60 $ $Date: 2007/11/10 05:29:00 $ $Name: jdom_1_1_1 $";
82
83 /** Adapter class to use */
84 private String adapterClass;
85
86 /** The factory for creating new JDOM objects */
87 private JDOMFactory factory = new DefaultJDOMFactory();
88
89 /**
90 * This creates a new DOMBuilder which will attempt to first locate
91 * a parser via JAXP, then will try to use a set of default parsers.
92 * The underlying parser will not validate.
93 */
94 public DOMBuilder() {
95 }
96
97 /**
98 * This creates a new DOMBuilder using the specified DOMAdapter
99 * implementation as a way to choose the underlying parser.
100 * The underlying parser will not validate.
101 *
102 * @param adapterClass <code>String</code> name of class
103 * to use for DOM building.
104 */
105 public DOMBuilder(String adapterClass) {
106 this.adapterClass = adapterClass;
107 }
108
109 /*
110 * This sets a custom JDOMFactory for the builder. Use this to build
111 * the tree with your own subclasses of the JDOM classes.
112 *
113 * @param factory <code>JDOMFactory</code> to use
114 */
115 public void setFactory(JDOMFactory factory) {
116 this.factory = factory;
117 }
118
119 /**
120 * Returns the current {@link org.jdom.JDOMFactory} in use.
121 * @return the factory in use
122 */
123 public JDOMFactory getFactory() {
124 return factory;
125 }
126
127 /**
128 * This will build a JDOM tree from an existing DOM tree.
129 *
130 * @param domDocument <code>org.w3c.dom.Document</code> object
131 * @return <code>Document</code> - JDOM document object.
132 */
133 public Document build(org.w3c.dom.Document domDocument) {
134 Document doc = factory.document(null);
135 buildTree(domDocument, doc, null, true);
136 return doc;
137 }
138
139 /**
140 * This will build a JDOM Element from an existing DOM Element
141 *
142 * @param domElement <code> org.w3c.dom.Element</code> object
143 * @return <code>Element</code> - JDOM Element object
144 */
145 public org.jdom.Element build(org.w3c.dom.Element domElement) {
146 Document doc = factory.document(null);
147 buildTree(domElement, doc, null, true);
148 return doc.getRootElement();
149 }
150
151 /**
152 * This takes a DOM <code>Node</code> and builds up
153 * a JDOM tree, recursing until the DOM tree is exhausted
154 * and the JDOM tree results.
155 *
156 * @param node <code>Code</node> to examine.
157 * @param doc JDOM <code>Document</code> being built.
158 * @param current <code>Element</code> that is current parent.
159 * @param atRoot <code>boolean</code> indicating whether at root level.
160 */
161 private void buildTree(Node node,
162 Document doc,
163 Element current,
164 boolean atRoot) {
165 // Recurse through the tree
166 switch (node.getNodeType()) {
167 case Node.DOCUMENT_NODE:
168 NodeList nodes = node.getChildNodes();
169 for (int i=0, size=nodes.getLength(); i<size; i++) {
170 buildTree(nodes.item(i), doc, current, true);
171 }
172 break;
173
174 case Node.ELEMENT_NODE:
175 String nodeName = node.getNodeName();
176 String prefix = "";
177 String localName = nodeName;
178 int colon = nodeName.indexOf(':');
179 if (colon >= 0) {
180 prefix = nodeName.substring(0, colon);
181 localName = nodeName.substring(colon + 1);
182 }
183
184 // Get element's namespace
185 Namespace ns = null;
186 String uri = node.getNamespaceURI();
187 if (uri == null) {
188 ns = (current == null) ? Namespace.NO_NAMESPACE
189 : current.getNamespace(prefix);
190 }
191 else {
192 ns = Namespace.getNamespace(prefix, uri);
193 }
194
195 Element element = factory.element(localName, ns);
196
197 if (atRoot) {
198 // If at root, set as document root
199 doc.setRootElement(element); // XXX should we use a factory call?
200 } else {
201 // else add to parent element
202 factory.addContent(current, element);
203 }
204
205 // Add namespaces
206 NamedNodeMap attributeList = node.getAttributes();
207 int attsize = attributeList.getLength();
208
209 for (int i = 0; i < attsize; i++) {
210 Attr att = (Attr) attributeList.item(i);
211
212 String attname = att.getName();
213 if (attname.startsWith("xmlns")) {
214 String attPrefix = "";
215 colon = attname.indexOf(':');
216 if (colon >= 0) {
217 attPrefix = attname.substring(colon + 1);
218 }
219
220 String attvalue = att.getValue();
221
222 Namespace declaredNS =
223 Namespace.getNamespace(attPrefix, attvalue);
224
225 // Add as additional namespaces if it's different
226 // than this element's namespace (perhaps we should
227 // also have logic not to mark them as additional if
228 // it's been done already, but it probably doesn't
229 // matter)
230 if (prefix.equals(attPrefix)) {
231 element.setNamespace(declaredNS);
232 }
233 else {
234 factory.addNamespaceDeclaration(element, declaredNS);
235 }
236 }
237 }
238
239 // Add attributes
240 for (int i = 0; i < attsize; i++) {
241 Attr att = (Attr) attributeList.item(i);
242
243 String attname = att.getName();
244
245 if ( !attname.startsWith("xmlns")) {
246 String attPrefix = "";
247 String attLocalName = attname;
248 colon = attname.indexOf(':');
249 if (colon >= 0) {
250 attPrefix = attname.substring(0, colon);
251 attLocalName = attname.substring(colon + 1);
252 }
253
254 String attvalue = att.getValue();
255
256 // Get attribute's namespace
257 Namespace attns = null;
258 if ("".equals(attPrefix)) {
259 attns = Namespace.NO_NAMESPACE;
260 }
261 else {
262 attns = element.getNamespace(attPrefix);
263 }
264
265 Attribute attribute =
266 factory.attribute(attLocalName, attvalue, attns);
267 factory.setAttribute(element, attribute);
268 }
269 }
270
271 // Recurse on child nodes
272 // The list should never be null nor should it ever contain
273 // null nodes, but some DOM impls are broken
274 NodeList children = node.getChildNodes();
275 if (children != null) {
276 int size = children.getLength();
277 for (int i = 0; i < size; i++) {
278 Node item = children.item(i);
279 if (item != null) {
280 buildTree(item, doc, element, false);
281 }
282 }
283 }
284 break;
285
286 case Node.TEXT_NODE:
287 String data = node.getNodeValue();
288 factory.addContent(current, factory.text(data));
289 break;
290
291 case Node.CDATA_SECTION_NODE:
292 String cdata = node.getNodeValue();
293 factory.addContent(current, factory.cdata(cdata));
294 break;
295
296
297 case Node.PROCESSING_INSTRUCTION_NODE:
298 if (atRoot) {
299 factory.addContent(doc,
300 factory.processingInstruction(node.getNodeName(),
301 node.getNodeValue()));
302 } else {
303 factory.addContent(current,
304 factory.processingInstruction(node.getNodeName(),
305 node.getNodeValue()));
306 }
307 break;
308
309 case Node.COMMENT_NODE:
310 if (atRoot) {
311 factory.addContent(doc, factory.comment(node.getNodeValue()));
312 } else {
313 factory.addContent(current, factory.comment(node.getNodeValue()));
314 }
315 break;
316
317 case Node.ENTITY_REFERENCE_NODE:
318 EntityRef entity = factory.entityRef(node.getNodeName());
319 factory.addContent(current, entity);
320 break;
321
322 case Node.ENTITY_NODE:
323 // ??
324 break;
325
326 case Node.DOCUMENT_TYPE_NODE:
327 DocumentType domDocType = (DocumentType)node;
328 String publicID = domDocType.getPublicId();
329 String systemID = domDocType.getSystemId();
330 String internalDTD = domDocType.getInternalSubset();
331
332 DocType docType = factory.docType(domDocType.getName());
333 docType.setPublicID(publicID);
334 docType.setSystemID(systemID);
335 docType.setInternalSubset(internalDTD);
336
337 factory.addContent(doc, docType);
338 break;
339 }
340 }
341 }