1997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
2997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
3997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Permission is hereby granted, free of charge, to any person obtaining a copy
4997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * of this software and associated documentation files (the "Software"), to deal
5997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * in the Software without restriction, including without limitation the rights
6997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * to use, copy, modify, merge, publish, distribute, sublicense, and/or
7997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * sell copies of the Software, and to permit persons to whom the Software is
8997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * furnished to do so, subject to the following conditions:
9997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
10997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * The  above copyright notice and this permission notice shall be included in
11997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * all copies or substantial portions of the Software.
12997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
13997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IN THE SOFTWARE. */
20997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
21997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupackage org.ksoap2.kdom;
22997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
23997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.*;
24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.*;
25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.xmlpull.v1.*;
26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/** A common base class for Document and Element, also used for
28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    storing XML fragments. */
29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class Node { //implements XmlIO{
31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int DOCUMENT = 0;
33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int ELEMENT = 2;
34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int TEXT = 4;
35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int CDSECT = 5;
36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int ENTITY_REF = 6;
37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int IGNORABLE_WHITESPACE = 7;
38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int PROCESSING_INSTRUCTION = 8;
39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int COMMENT = 9;
40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int DOCDECL = 10;
41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    protected Vector children;
43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    protected StringBuffer types;
44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** inserts the given child object of the given type at the
46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    given index. */
47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void addChild(int index, int type, Object child) {
49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (child == null)
51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throw new NullPointerException();
52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (children == null) {
54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            children = new Vector();
55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            types = new StringBuffer();
56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (type == ELEMENT) {
59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (!(child instanceof Element))
60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                throw new RuntimeException("Element obj expected)");
61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            ((Element) child).setParent(this);
63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        else if (!(child instanceof String))
65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throw new RuntimeException("String expected");
66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        children.insertElementAt(child, index);
68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        types.insert(index, (char) type);
69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** convenience method for addChild (getChildCount (), child) */
72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void addChild(int type, Object child) {
74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        addChild(getChildCount(), type, child);
75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Builds a default element with the given properties. Elements
78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    should always be created using this method instead of the
79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    constructor in order to enable construction of specialized
80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    subclasses by deriving custom Document classes. Please note:
81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    For no namespace, please use Xml.NO_NAMESPACE, null is not a
82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    legal value. Currently, null is converted to Xml.NO_NAMESPACE,
83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    but future versions may throw an exception. */
84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Element createElement(String namespace, String name) {
86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        Element e = new Element();
88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        e.namespace = namespace == null ? "" : namespace;
89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        e.name = name;
90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return e;
91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Returns the child object at the given index.  For child
94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        elements, an Element object is returned. For all other child
95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        types, a String is returned. */
96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Object getChild(int index) {
98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return children.elementAt(index);
99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Returns the number of child objects */
102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int getChildCount() {
104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return children == null ? 0 : children.size();
105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** returns the element at the given index. If the node at the
108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    given index is a text node, null is returned */
109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Element getElement(int index) {
111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        Object child = getChild(index);
112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return (child instanceof Element) ? (Element) child : null;
113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Returns the element with the given namespace and name. If the
116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        element is not found, or more than one matching elements are
117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        found, an exception is thrown. */
118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Element getElement(String namespace, String name) {
120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int i = indexOf(namespace, name, 0);
122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int j = indexOf(namespace, name, i + 1);
123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (i == -1 || j != -1)
125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throw new RuntimeException(
126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    "Element {"
127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                            + namespace
128997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                            + "}"
129997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                            + name
130997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                            + (i == -1 ? " not found in " : " more than once in ")
131997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                            + this);
132997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
133997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return getElement(i);
134997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
135997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
136997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /* returns "#document-fragment". For elements, the element name is returned
137997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
138997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getName() {
139997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return "#document-fragment";
140997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
141997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
142997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Returns the namespace of the current element. For Node
143997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        and Document, Xml.NO_NAMESPACE is returned.
144997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
145997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getNamespace() {
146997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return "";
147997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
148997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
149997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int getNamespaceCount () {
150997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return 0;
151997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
152997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
153997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** returns the text content if the element has text-only
154997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    content. Throws an exception for mixed content
155997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
156997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getText() {
157997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
158997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        StringBuffer buf = new StringBuffer();
159997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int len = getChildCount();
160997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
161997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (int i = 0; i < len; i++) {
162997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (isText(i))
163997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                buf.append(getText(i));
164997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            else if (getType(i) == ELEMENT)
165997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                throw new RuntimeException("not text-only content!");
166997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
167997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
168997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return buf.toString();
169997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
170997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    */
171997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
172997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Returns the text node with the given index or null if the node
173997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        with the given index is not a text node. */
174997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
175997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getText(int index) {
176997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return (isText(index)) ? (String) getChild(index) : null;
177997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
178997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
179997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Returns the type of the child at the given index. Possible
180997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    types are ELEMENT, TEXT, COMMENT, and PROCESSING_INSTRUCTION */
181997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
182997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int getType(int index) {
183997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return types.charAt(index);
184997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
185997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
186997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Convenience method for indexOf (getNamespace (), name,
187997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        startIndex).
188997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
189997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int indexOf(String name, int startIndex) {
190997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return indexOf(getNamespace(), name, startIndex);
191997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
192997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    */
193997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
194997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Performs search for an element with the given namespace and
195997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    name, starting at the given start index. A null namespace
196997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    matches any namespace, please use Xml.NO_NAMESPACE for no
197997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    namespace).  returns -1 if no matching element was found. */
198997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
199997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int indexOf(String namespace, String name, int startIndex) {
200997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
201997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int len = getChildCount();
202997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
203997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (int i = startIndex; i < len; i++) {
204997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
205997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            Element child = getElement(i);
206997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
207997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (child != null
208997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    && name.equals(child.getName())
209997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    && (namespace == null || namespace.equals(child.getNamespace())))
210997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                return i;
211997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
212997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return -1;
213997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
214997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
215997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public boolean isText(int i) {
216997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int t = getType(i);
217997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return t == TEXT || t == IGNORABLE_WHITESPACE || t == CDSECT;
218997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
219997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
220997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Recursively builds the child elements from the given parser
221997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    until an end tag or end document is found.
222997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        The end tag is not consumed. */
223997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
224997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void parse(XmlPullParser parser)
225997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throws IOException, XmlPullParserException {
226997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
227997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        boolean leave = false;
228997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
229997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        do {
230997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            int type = parser.getEventType();
231997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
232997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            //         System.out.println(parser.getPositionDescription());
233997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
234997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            switch (type) {
235997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
236997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case XmlPullParser.START_TAG: {
237997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    Element child =
238997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                            createElement(
239997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                                    parser.getNamespace(),
240997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                                    parser.getName());
241997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    //    child.setAttributes (event.getAttributes ());
242997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    addChild(ELEMENT, child);
243997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
244997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    // order is important here since
245997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    // setparent may perform some init code!
246997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
247997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    child.parse(parser);
248997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
249997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                }
250997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
251997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case XmlPullParser.END_DOCUMENT:
252997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case XmlPullParser.END_TAG:
253997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    leave = true;
254997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
255997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
256997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                default:
257997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    if (parser.getText() != null)
258997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                        addChild(
259997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                                type == XmlPullParser.ENTITY_REF ? TEXT : type,
260997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                                parser.getText());
261997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    else if (type == XmlPullParser.ENTITY_REF
262997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                            && parser.getName() != null) {
263997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                        addChild(ENTITY_REF, parser.getName());
264997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    }
265997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    parser.nextToken();
266997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
267997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } while (!leave);
268997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
269997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
270997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Removes the child object at the given index */
271997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
272997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void removeChild(int idx) {
273997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        children.removeElementAt(idx);
274997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
275997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        /***  Modification by HHS - start ***/
276997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        //      types.deleteCharAt (index);
277997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        /***/
278997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int n = types.length() - 1;
279997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
280997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (int i = idx; i < n; i++)
281997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            types.setCharAt(i, types.charAt(i + 1));
282997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
283997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        types.setLength(n);
284997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
285997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        /***  Modification by HHS - end   ***/
286997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
287997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
288997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /* returns a valid XML representation of this Element including
289997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        attributes and children.
290997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String toString() {
291997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        try {
292997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            ByteArrayOutputStream bos =
293997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                new ByteArrayOutputStream();
294997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            XmlWriter xw =
295997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                new XmlWriter(new OutputStreamWriter(bos));
296997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            write(xw);
297997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            xw.close();
298997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            return new String(bos.toByteArray());
299997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
300997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        catch (IOException e) {
301997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throw new RuntimeException(e.toString());
302997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
303997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
304997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    */
305997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
306997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Writes this node to the given XmlWriter. For node and document,
307997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this method is identical to writeChildren, except that the
308997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        stream is flushed automatically. */
309997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
310997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void write(XmlSerializer writer) throws IOException {
311997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        writeChildren(writer);
312997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        writer.flush();
313997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
314997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
315997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Writes the children of this node to the given XmlWriter. */
316997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
317997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void writeChildren(XmlSerializer writer) throws IOException {
318997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (children == null)
319997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            return;
320997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
321997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int len = children.size();
322997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
323997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (int i = 0; i < len; i++) {
324997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            int type = getType(i);
325997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            Object child = children.elementAt(i);
326997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            switch (type) {
327997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case ELEMENT:
328997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    ((Element) child).write(writer);
329997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
330997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
331997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case TEXT:
332997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    writer.text((String) child);
333997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
334997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
335997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case IGNORABLE_WHITESPACE:
336997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    writer.ignorableWhitespace((String) child);
337997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
338997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
339997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case CDSECT:
340997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    writer.cdsect((String) child);
341997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
342997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
343997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case COMMENT:
344997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    writer.comment((String) child);
345997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
346997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
347997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case ENTITY_REF:
348997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    writer.entityRef((String) child);
349997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
350997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
351997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case PROCESSING_INSTRUCTION:
352997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    writer.processingInstruction((String) child);
353997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
354997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
355997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                case DOCDECL:
356997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    writer.docdecl((String) child);
357997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
358997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
359997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                default:
360997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    throw new RuntimeException("Illegal type: " + type);
361997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
362997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
363997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
364997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu}
365