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 Projectpackage org.kxml2.kdom;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.*;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.*;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.xmlpull.v1.*;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** A common base class for Document and Element, also used for
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    storing XML fragments. */
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Node { //implements XmlIO{
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int DOCUMENT = 0;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int ELEMENT = 2;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int TEXT = 4;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int CDSECT = 5;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int ENTITY_REF = 6;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int IGNORABLE_WHITESPACE = 7;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int PROCESSING_INSTRUCTION = 8;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int COMMENT = 9;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int DOCDECL = 10;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected Vector children;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected StringBuffer types;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** inserts the given child object of the given type at the
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    given index. */
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addChild(int index, int type, Object child) {
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (child == null)
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (children == null) {
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            children = new Vector();
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            types = new StringBuffer();
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (type == ELEMENT) {
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!(child instanceof Element))
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new RuntimeException("Element obj expected)");
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ((Element) child).setParent(this);
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (!(child instanceof String))
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new RuntimeException("String expected");
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        children.insertElementAt(child, index);
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        types.insert(index, (char) type);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** convenience method for addChild (getChildCount (), child) */
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addChild(int type, Object child) {
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        addChild(getChildCount(), type, child);
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Builds a default element with the given properties. Elements
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    should always be created using this method instead of the
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    constructor in order to enable construction of specialized
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subclasses by deriving custom Document classes. Please note:
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    For no namespace, please use Xml.NO_NAMESPACE, null is not a
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    legal value. Currently, null is converted to Xml.NO_NAMESPACE,
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    but future versions may throw an exception. */
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Element createElement(String namespace, String name) {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Element e = new Element();
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        e.namespace = namespace == null ? "" : namespace;
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        e.name = name;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return e;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Returns the child object at the given index.  For child
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        elements, an Element object is returned. For all other child
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        types, a String is returned. */
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Object getChild(int index) {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return children.elementAt(index);
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Returns the number of child objects */
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getChildCount() {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return children == null ? 0 : children.size();
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** returns the element at the given index. If the node at the
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    given index is a text node, null is returned */
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Element getElement(int index) {
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object child = getChild(index);
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (child instanceof Element) ? (Element) child : null;
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Returns the element with the given namespace and name. If the
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        element is not found, or more than one matching elements are
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        found, an exception is thrown. */
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Element getElement(String namespace, String name) {
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int i = indexOf(namespace, name, 0);
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int j = indexOf(namespace, name, i + 1);
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (i == -1 || j != -1)
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new RuntimeException(
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "Element {"
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + namespace
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + "}"
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + name
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + (i == -1 ? " not found in " : " more than once in ")
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + this);
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getElement(i);
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* returns "#document-fragment". For elements, the element name is returned
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getName() {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "#document-fragment";
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Returns the namespace of the current element. For Node
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        and Document, Xml.NO_NAMESPACE is returned.
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getNamespace() {
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "";
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getNamespaceCount () {
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return 0;
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** returns the text content if the element has text-only
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    content. Throws an exception for mixed content
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getText() {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuffer buf = new StringBuffer();
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int len = getChildCount();
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < len; i++) {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (isText(i))
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append(getText(i));
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else if (getType(i) == ELEMENT)
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new RuntimeException("not text-only content!");
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return buf.toString();
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Returns the text node with the given index or null if the node
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        with the given index is not a text node. */
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getText(int index) {
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (isText(index)) ? (String) getChild(index) : null;
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Returns the type of the child at the given index. Possible
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    types are ELEMENT, TEXT, COMMENT, and PROCESSING_INSTRUCTION */
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getType(int index) {
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return types.charAt(index);
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Convenience method for indexOf (getNamespace (), name,
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        startIndex).
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int indexOf(String name, int startIndex) {
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return indexOf(getNamespace(), name, startIndex);
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Performs search for an element with the given namespace and
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    name, starting at the given start index. A null namespace
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    matches any namespace, please use Xml.NO_NAMESPACE for no
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    namespace).  returns -1 if no matching element was found. */
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int indexOf(String namespace, String name, int startIndex) {
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int len = getChildCount();
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = startIndex; i < len; i++) {
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Element child = getElement(i);
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (child != null
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                && name.equals(child.getName())
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                && (namespace == null || namespace.equals(child.getNamespace())))
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return i;
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return -1;
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isText(int i) {
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int t = getType(i);
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return t == TEXT || t == IGNORABLE_WHITESPACE || t == CDSECT;
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Recursively builds the child elements from the given parser
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    until an end tag or end document is found.
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        The end tag is not consumed. */
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void parse(XmlPullParser parser)
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws IOException, XmlPullParserException {
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean leave = false;
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        do {
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int type = parser.getEventType();
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   //         System.out.println(parser.getPositionDescription());
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            switch (type) {
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case XmlPullParser.START_TAG :
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    {
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        Element child =
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            createElement(
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                parser.getNamespace(),
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                parser.getName());
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        //    child.setAttributes (event.getAttributes ());
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        addChild(ELEMENT, child);
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        // order is important here since
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        // setparent may perform some init code!
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        child.parse(parser);
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        break;
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case XmlPullParser.END_DOCUMENT :
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case XmlPullParser.END_TAG :
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    leave = true;
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                default :
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (parser.getText() != null)
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        addChild(
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            type == XmlPullParser.ENTITY_REF ? TEXT : type,
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            parser.getText());
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    else if (
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        type == XmlPullParser.ENTITY_REF
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            && parser.getName() != null) {
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        addChild(ENTITY_REF, parser.getName());
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    parser.nextToken();
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (!leave);
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Removes the child object at the given index */
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void removeChild(int idx) {
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        children.removeElementAt(idx);
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /***  Modification by HHS - start ***/
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //      types.deleteCharAt (index);
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /***/
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int n = types.length() - 1;
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = idx; i < n; i++)
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            types.setCharAt(i, types.charAt(i + 1));
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        types.setLength(n);
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /***  Modification by HHS - end   ***/
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* returns a valid XML representation of this Element including
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        attributes and children.
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ByteArrayOutputStream bos =
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ByteArrayOutputStream();
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            XmlWriter xw =
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new XmlWriter(new OutputStreamWriter(bos));
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            write(xw);
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            xw.close();
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new String(bos.toByteArray());
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catch (IOException e) {
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new RuntimeException(e.toString());
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Writes this node to the given XmlWriter. For node and document,
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this method is identical to writeChildren, except that the
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        stream is flushed automatically. */
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void write(XmlSerializer writer) throws IOException {
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        writeChildren(writer);
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        writer.flush();
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** Writes the children of this node to the given XmlWriter. */
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void writeChildren(XmlSerializer writer) throws IOException {
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (children == null)
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int len = children.size();
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < len; i++) {
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int type = getType(i);
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object child = children.elementAt(i);
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            switch (type) {
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case ELEMENT :
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                     ((Element) child).write(writer);
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case TEXT :
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    writer.text((String) child);
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case IGNORABLE_WHITESPACE :
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    writer.ignorableWhitespace((String) child);
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case CDSECT :
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    writer.cdsect((String) child);
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case COMMENT :
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    writer.comment((String) child);
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case ENTITY_REF :
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    writer.entityRef((String) child);
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case PROCESSING_INSTRUCTION :
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    writer.processingInstruction((String) child);
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case DOCDECL :
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    writer.docdecl((String) child);
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                default :
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new RuntimeException("Illegal type: " + type);
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
367