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.io.*;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.*;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.xmlpull.v1.*;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In order to create an element, please use the createElement method
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instead of invoking the constructor directly. The right place to
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * add user defined initialization code is the init method. */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Element extends Node {
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected String namespace;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected String name;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected Vector attributes;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected Node parent;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected Vector prefixes;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Element() {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * called when all properties are set, but before children
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * are parsed. Please do not use setParent for initialization
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * code any longer. */
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void init() {
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * removes all children and attributes */
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void clear() {
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        attributes = null;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        children = null;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Forwards creation request to parent if any, otherwise
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls super.createElement. */
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Element createElement(
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String namespace,
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String name) {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (this.parent == null)
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ? super.createElement(namespace, name)
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            : this.parent.createElement(namespace, name);
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the number of attributes of this element. */
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getAttributeCount() {
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return attributes == null ? 0 : attributes.size();
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getAttributeNamespace (int index) {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((String []) attributes.elementAt (index)) [0];
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*    public String getAttributePrefix (int index) {
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((String []) attributes.elementAt (index)) [1];
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }*/
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getAttributeName (int index) {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((String []) attributes.elementAt (index)) [1];
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getAttributeValue (int index) {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((String []) attributes.elementAt (index)) [2];
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getAttributeValue (String namespace, String name) {
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < getAttributeCount (); i++) {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (name.equals (getAttributeName (i))
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                && (namespace == null || namespace.equals (getAttributeNamespace(i)))) {
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return getAttributeValue (i);
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the root node, determined by ascending to the
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * all parents un of the root element. */
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Node getRoot() {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Element current = this;
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (current.parent != null) {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!(current.parent instanceof Element)) return current.parent;
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            current = (Element) current.parent;
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return current;
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * returns the (local) name of the element */
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getName() {
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return name;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * returns the namespace of the element */
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getNamespace() {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return namespace;
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * returns the namespace for the given prefix */
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getNamespaceUri (String prefix) {
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int cnt = getNamespaceCount ();
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < cnt; i++) {
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (prefix == getNamespacePrefix (i) ||
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                (prefix != null && prefix.equals (getNamespacePrefix (i))))
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return getNamespaceUri (i);
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return parent instanceof Element ? ((Element) parent).getNamespaceUri (prefix) : null;
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * returns the number of declared namespaces, NOT including
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * parent elements */
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getNamespaceCount () {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (prefixes == null ? 0 : prefixes.size ());
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getNamespacePrefix (int i) {
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((String []) prefixes.elementAt (i)) [0];
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getNamespaceUri (int i) {
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ((String []) prefixes.elementAt (i)) [1];
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the parent node of this element */
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Node getParent() {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return parent;
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the parent element if available, null otherwise
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Element getParentElement() {
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (parent instanceof Element)
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ? ((Element) parent)
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            : null;
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Builds the child elements from the given Parser. By overwriting
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * parse, an element can take complete control over parsing its
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * subtree. */
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void parse(XmlPullParser parser)
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws IOException, XmlPullParserException {
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = parser.getNamespaceCount (parser.getDepth () - 1);
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            i < parser.getNamespaceCount (parser.getDepth ()); i++) {
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            setPrefix (parser.getNamespacePrefix (i), parser.getNamespaceUri(i));
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < parser.getAttributeCount (); i++)
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            setAttribute (parser.getAttributeNamespace (i),
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                          parser.getAttributePrefix (i),
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                          parser.getAttributeName (i),
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                          parser.getAttributeValue (i));
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //        if (prefixMap == null) throw new RuntimeException ("!!");
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        init();
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (parser.isEmptyElementTag())
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            parser.nextToken ();
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else {
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            parser.nextToken ();
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super.parse(parser);
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (getChildCount() == 0)
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                addChild(IGNORABLE_WHITESPACE, "");
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        parser.require(
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            XmlPullParser.END_TAG,
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            getNamespace(),
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            getName());
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        parser.nextToken ();
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the given attribute; a value of null removes the attribute */
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setAttribute (String namespace, String name, String value) {
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (attributes == null)
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            attributes = new Vector ();
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (namespace == null)
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            namespace = "";
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = attributes.size()-1; i >=0; i--){
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String[] attribut = (String[]) attributes.elementAt(i);
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (attribut[0].equals(namespace) &&
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                attribut[1].equals(name)){
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (value == null) {
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    attributes.removeElementAt(i);
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else {
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    attribut[2] = value;
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return;
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        attributes.addElement
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            (new String [] {namespace, name, value});
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the given prefix; a namespace value of null removess the
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * prefix */
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setPrefix (String prefix, String namespace) {
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (prefixes == null) prefixes = new Vector ();
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        prefixes.addElement (new String [] {prefix, namespace});
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * sets the name of the element */
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setName(String name) {
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.name = name;
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * sets the namespace of the element. Please note: For no
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * namespace, please use Xml.NO_NAMESPACE, null is not a legal
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * value. Currently, null is converted to Xml.NO_NAMESPACE, but
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * future versions may throw an exception. */
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setNamespace(String namespace) {
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (namespace == null)
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException ("Use \"\" for empty namespace");
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.namespace = namespace;
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the Parent of this element. Automatically called from the
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * add method.  Please use with care, you can simply
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * create inconsitencies in the document tree structure using
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this method!  */
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void setParent(Node parent) {
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.parent = parent;
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes this element and all children to the given XmlWriter. */
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void write(XmlSerializer writer)
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws IOException {
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (prefixes != null) {
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < prefixes.size(); i++) {
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                writer.setPrefix (getNamespacePrefix (i), getNamespaceUri (i));
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        writer.startTag(
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            getNamespace(),
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            getName());
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int len = getAttributeCount();
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < len; i++) {
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            writer.attribute(
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                getAttributeNamespace(i),
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                getAttributeName(i),
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                getAttributeValue(i));
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        writeChildren(writer);
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        writer.endTag(getNamespace (), getName ());
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
336