1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in the Software without restriction, including without limitation the rights
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sell copies of the Software, and to permit persons to whom the Software is
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * furnished to do so, subject to the following conditions:
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The  above copyright notice and this permission notice shall be included in
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * all copies or substantial portions of the Software.
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IN THE SOFTWARE. */
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.kxml2.kdom;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.*;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.xmlpull.v1.*;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** The document consists of some legacy events and a single root
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    element. This class basically adds some consistency checks to
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Node. */
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Document extends Node {
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected int rootIndex = -1;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    String encoding;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Boolean standalone;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** returns "#document" */
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getEncoding () {
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return encoding;
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setEncoding(String enc) {
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.encoding = enc;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setStandalone (Boolean standalone) {
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.standalone = standalone;
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Boolean getStandalone() {
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return standalone;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getName() {
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "#document";
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Adds a child at the given index position. Throws
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    an exception when a second root element is added */
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addChild(int index, int type, Object child) {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (type == ELEMENT) {
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         //   if (rootIndex != -1)
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project           //     throw new RuntimeException("Only one document root element allowed");
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            rootIndex = index;
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (rootIndex >= index)
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            rootIndex++;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.addChild(index, type, child);
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** reads the document and checks if the last event
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    is END_DOCUMENT. If not, an exception is thrown.
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    The end event is consumed. For parsing partial
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        XML structures, consider using Node.parse (). */
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void parse(XmlPullParser parser)
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws IOException, XmlPullParserException {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        parser.require(XmlPullParser.START_DOCUMENT, null, null);
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        parser.nextToken ();
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        encoding = parser.getInputEncoding();
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        standalone = (Boolean)parser.getProperty ("http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone");
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.parse(parser);
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (parser.getEventType() != XmlPullParser.END_DOCUMENT)
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new RuntimeException("Document end expected!");
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void removeChild(int index) {
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (index == rootIndex)
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            rootIndex = -1;
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (index < rootIndex)
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            rootIndex--;
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.removeChild(index);
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** returns the root element of this document. */
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Element getRootElement() {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (rootIndex == -1)
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new RuntimeException("Document has no root element!");
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (Element) getChild(rootIndex);
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Writes this node to the given XmlWriter. For node and document,
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this method is identical to writeChildren, except that the
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        stream is flushed automatically. */
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void write(XmlSerializer writer)
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws IOException {
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        writer.startDocument(encoding, standalone);
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        writeChildren(writer);
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        writer.endDocument();
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}