Mercurial > repos > pfrommolt > ngsrich
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 } |
