/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ package org.kxml2.kdom; import java.io.*; import org.xmlpull.v1.*; /** The document consists of some legacy events and a single root element. This class basically adds some consistency checks to Node. */ public class Document extends Node { protected int rootIndex = -1; String encoding; Boolean standalone; /** returns "#document" */ public String getEncoding () { return encoding; } public void setEncoding(String enc) { this.encoding = enc; } public void setStandalone (Boolean standalone) { this.standalone = standalone; } public Boolean getStandalone() { return standalone; } public String getName() { return "#document"; } /** Adds a child at the given index position. Throws an exception when a second root element is added */ public void addChild(int index, int type, Object child) { if (type == ELEMENT) { // if (rootIndex != -1) // throw new RuntimeException("Only one document root element allowed"); rootIndex = index; } else if (rootIndex >= index) rootIndex++; super.addChild(index, type, child); } /** reads the document and checks if the last event is END_DOCUMENT. If not, an exception is thrown. The end event is consumed. For parsing partial XML structures, consider using Node.parse (). */ public void parse(XmlPullParser parser) throws IOException, XmlPullParserException { parser.require(XmlPullParser.START_DOCUMENT, null, null); parser.nextToken (); encoding = parser.getInputEncoding(); standalone = (Boolean)parser.getProperty ("http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone"); super.parse(parser); if (parser.getEventType() != XmlPullParser.END_DOCUMENT) throw new RuntimeException("Document end expected!"); } public void removeChild(int index) { if (index == rootIndex) rootIndex = -1; else if (index < rootIndex) rootIndex--; super.removeChild(index); } /** returns the root element of this document. */ public Element getRootElement() { if (rootIndex == -1) throw new RuntimeException("Document has no root element!"); return (Element) getChild(rootIndex); } /** Writes this node to the given XmlWriter. For node and document, this method is identical to writeChildren, except that the stream is flushed automatically. */ public void write(XmlSerializer writer) throws IOException { writer.startDocument(encoding, standalone); writeChildren(writer); writer.endDocument(); } }