1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// AttributesImpl.java - default implementation of Attributes.
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// http://www.saxproject.org
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// Written by David Megginson
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// NO WARRANTY!  This class is in the public domain.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// $Id: AttributesImpl.java,v 1.9 2002/01/30 20:52:24 dbrownell Exp $
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.xml.sax.helpers;
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.xml.sax.Attributes;
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Default implementation of the Attributes interface.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <blockquote>
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <em>This module, both source code and documentation, is in the
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for further information.
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </blockquote>
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>This class provides a default implementation of the SAX2
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link org.xml.sax.Attributes Attributes} interface, with the
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * addition of manipulators so that the list can be modified or
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * reused.</p>
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>There are two typical uses of this class:</p>
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <ol>
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>to take a persistent snapshot of an Attributes object
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  in a {@link org.xml.sax.ContentHandler#startElement startElement} event; or</li>
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>to construct or modify an Attributes object in a SAX2 driver or filter.</li>
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </ol>
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>This class replaces the now-deprecated SAX1 {@link
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * org.xml.sax.helpers.AttributeListImpl AttributeListImpl}
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * class; in addition to supporting the updated Attributes
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * interface rather than the deprecated {@link org.xml.sax.AttributeList
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * AttributeList} interface, it also includes a much more efficient
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * implementation using a single array rather than a set of Vectors.</p>
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since SAX 2.0
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @author David Megginson
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @version 2.0.1 (sax2r2)
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class AttributesImpl implements Attributes
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ////////////////////////////////////////////////////////////////////
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Constructors.
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     * Construct a new, empty AttributesImpl object.
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public AttributesImpl ()
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    length = 0;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    data = null;
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Copy an existing Attributes object.
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>This constructor is especially useful inside a
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@link org.xml.sax.ContentHandler#startElement startElement} event.</p>
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param atts The existing Attributes object.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public AttributesImpl (Attributes atts)
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    setAttributes(atts);
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ////////////////////////////////////////////////////////////////////
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Implementation of org.xml.sax.Attributes.
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ////////////////////////////////////////////////////////////////////
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the number of attributes in the list.
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The number of attributes in the list.
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getLength
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getLength ()
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return length;
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return an attribute's Namespace URI.
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The attribute's index (zero-based).
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The Namespace URI, the empty string if none is
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         available, or null if the index is out of range.
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getURI
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getURI (int index)
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return data[index*5];
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return an attribute's local name.
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The attribute's index (zero-based).
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The attribute's local name, the empty string if
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         none is available, or null if the index if out of range.
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getLocalName
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getLocalName (int index)
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return data[index*5+1];
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return an attribute's qualified (prefixed) name.
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The attribute's index (zero-based).
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The attribute's qualified name, the empty string if
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         none is available, or null if the index is out of bounds.
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getQName
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getQName (int index)
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return data[index*5+2];
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return an attribute's type by index.
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The attribute's index (zero-based).
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The attribute's type, "CDATA" if the type is unknown, or null
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         if the index is out of bounds.
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getType(int)
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getType (int index)
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return data[index*5+3];
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return an attribute's value by index.
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The attribute's index (zero-based).
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The attribute's value or null if the index is out of bounds.
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getValue(int)
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getValue (int index)
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return data[index*5+4];
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Look up an attribute's index by Namespace name.
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>In many cases, it will be more efficient to look up the name once and
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * use the index query methods rather than using the name query methods
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * repeatedly.</p>
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param uri The attribute's Namespace URI, or the empty
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        string if none is available.
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param localName The attribute's local name.
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The attribute's index, or -1 if none matches.
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getIndex(java.lang.String,java.lang.String)
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getIndex (String uri, String localName)
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int max = length * 5;
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (int i = 0; i < max; i += 5) {
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (data[i].equals(uri) && data[i+1].equals(localName)) {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return i / 5;
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return -1;
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Look up an attribute's index by qualified (prefixed) name.
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param qName The qualified name.
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The attribute's index, or -1 if none matches.
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getIndex(java.lang.String)
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getIndex (String qName)
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int max = length * 5;
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (int i = 0; i < max; i += 5) {
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (data[i+2].equals(qName)) {
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return i / 5;
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return -1;
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Look up an attribute's type by Namespace-qualified name.
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param uri The Namespace URI, or the empty string for a name
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        with no explicit Namespace URI.
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param localName The local name.
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The attribute's type, or null if there is no
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         matching attribute.
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getType(java.lang.String,java.lang.String)
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getType (String uri, String localName)
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int max = length * 5;
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (int i = 0; i < max; i += 5) {
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (data[i].equals(uri) && data[i+1].equals(localName)) {
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return data[i+3];
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return null;
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Look up an attribute's type by qualified (prefixed) name.
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param qName The qualified name.
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The attribute's type, or null if there is no
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         matching attribute.
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getType(java.lang.String)
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getType (String qName)
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int max = length * 5;
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (int i = 0; i < max; i += 5) {
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (data[i+2].equals(qName)) {
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return data[i+3];
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return null;
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Look up an attribute's value by Namespace-qualified name.
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param uri The Namespace URI, or the empty string for a name
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        with no explicit Namespace URI.
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param localName The local name.
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The attribute's value, or null if there is no
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         matching attribute.
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getValue(java.lang.String,java.lang.String)
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getValue (String uri, String localName)
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int max = length * 5;
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (int i = 0; i < max; i += 5) {
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (data[i].equals(uri) && data[i+1].equals(localName)) {
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return data[i+4];
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return null;
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Look up an attribute's value by qualified (prefixed) name.
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param qName The qualified name.
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The attribute's value, or null if there is no
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         matching attribute.
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see org.xml.sax.Attributes#getValue(java.lang.String)
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getValue (String qName)
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int max = length * 5;
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (int i = 0; i < max; i += 5) {
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (data[i+2].equals(qName)) {
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return data[i+4];
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return null;
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ////////////////////////////////////////////////////////////////////
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Manipulators.
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ////////////////////////////////////////////////////////////////////
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Clear the attribute list for reuse.
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>Note that little memory is freed by this call:
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the current array is kept so it can be
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * reused.</p>
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void clear ()
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (data != null) {
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < (length * 5); i++)
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data [i] = null;
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    length = 0;
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Copy an entire Attributes object.
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>It may be more efficient to reuse an existing object
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * rather than constantly allocating new ones.</p>
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param atts The attributes to copy.
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setAttributes (Attributes atts)
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        clear();
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        length = atts.getLength();
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (length > 0) {
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            data = new String[length*5];
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < length; i++) {
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                data[i*5] = atts.getURI(i);
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                data[i*5+1] = atts.getLocalName(i);
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                data[i*5+2] = atts.getQName(i);
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                data[i*5+3] = atts.getType(i);
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                data[i*5+4] = atts.getValue(i);
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Add an attribute to the end of the list.
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>For the sake of speed, this method does no checking
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to see if the attribute is already in the list: that is
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the responsibility of the application.</p>
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param uri The Namespace URI, or the empty string if
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        none is available or Namespace processing is not
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        being performed.
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param localName The local name, or the empty string if
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        Namespace processing is not being performed.
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param qName The qualified (prefixed) name, or the empty string
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        if qualified names are not available.
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type The attribute type as a string.
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value The attribute value.
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addAttribute (String uri, String localName, String qName,
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                  String type, String value)
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ensureCapacity(length+1);
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    data[length*5] = uri;
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    data[length*5+1] = localName;
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    data[length*5+2] = qName;
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    data[length*5+3] = type;
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    data[length*5+4] = value;
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    length++;
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Set an attribute in the list.
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>For the sake of speed, this method does no checking
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for name conflicts or well-formedness: such checks are the
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * responsibility of the application.</p>
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The index of the attribute (zero-based).
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param uri The Namespace URI, or the empty string if
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        none is available or Namespace processing is not
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        being performed.
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param localName The local name, or the empty string if
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        Namespace processing is not being performed.
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param qName The qualified name, or the empty string
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        if qualified names are not available.
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type The attribute type as a string.
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value The attribute value.
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception java.lang.ArrayIndexOutOfBoundsException When the
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            supplied index does not point to an attribute
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            in the list.
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setAttribute (int index, String uri, String localName,
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                  String qName, String type, String value)
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data[index*5] = uri;
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data[index*5+1] = localName;
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data[index*5+2] = qName;
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data[index*5+3] = type;
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data[index*5+4] = value;
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        badIndex(index);
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Remove an attribute from the list.
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The index of the attribute (zero-based).
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception java.lang.ArrayIndexOutOfBoundsException When the
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            supplied index does not point to an attribute
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            in the list.
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void removeAttribute (int index)
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (index < length - 1) {
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.arraycopy(data, (index+1)*5, data, index*5,
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 (length-index-1)*5);
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        index = (length - 1) * 5;
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data [index++] = null;
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data [index++] = null;
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data [index++] = null;
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data [index++] = null;
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data [index] = null;
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        length--;
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        badIndex(index);
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Set the Namespace URI of a specific attribute.
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The index of the attribute (zero-based).
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param uri The attribute's Namespace URI, or the empty
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        string for none.
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception java.lang.ArrayIndexOutOfBoundsException When the
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            supplied index does not point to an attribute
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            in the list.
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setURI (int index, String uri)
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data[index*5] = uri;
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        badIndex(index);
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Set the local name of a specific attribute.
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The index of the attribute (zero-based).
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param localName The attribute's local name, or the empty
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        string for none.
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception java.lang.ArrayIndexOutOfBoundsException When the
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            supplied index does not point to an attribute
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            in the list.
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setLocalName (int index, String localName)
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data[index*5+1] = localName;
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        badIndex(index);
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Set the qualified name of a specific attribute.
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The index of the attribute (zero-based).
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param qName The attribute's qualified name, or the empty
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        string for none.
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception java.lang.ArrayIndexOutOfBoundsException When the
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            supplied index does not point to an attribute
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            in the list.
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setQName (int index, String qName)
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data[index*5+2] = qName;
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        badIndex(index);
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Set the type of a specific attribute.
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The index of the attribute (zero-based).
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type The attribute's type.
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception java.lang.ArrayIndexOutOfBoundsException When the
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            supplied index does not point to an attribute
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            in the list.
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setType (int index, String type)
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data[index*5+3] = type;
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        badIndex(index);
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Set the value of a specific attribute.
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The index of the attribute (zero-based).
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value The attribute's value.
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception java.lang.ArrayIndexOutOfBoundsException When the
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            supplied index does not point to an attribute
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            in the list.
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setValue (int index, String value)
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (index >= 0 && index < length) {
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data[index*5+4] = value;
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        badIndex(index);
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ////////////////////////////////////////////////////////////////////
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Internal methods.
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ////////////////////////////////////////////////////////////////////
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Ensure the internal array's capacity.
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param n The minimum number of attributes that the array must
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        be able to hold.
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void ensureCapacity (int n)    {
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (n <= 0) {
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int max;
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (data == null || data.length == 0) {
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            max = 25;
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (data.length >= n * 5) {
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else {
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            max = data.length;
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (max < n * 5) {
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            max *= 2;
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String newData[] = new String[max];
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (length > 0) {
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.arraycopy(data, 0, newData, 0, length*5);
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        data = newData;
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Report a bad array index in a manipulator.
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index The index to report.
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception java.lang.ArrayIndexOutOfBoundsException Always.
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void badIndex (int index)
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    throws ArrayIndexOutOfBoundsException
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    String msg =
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        "Attempt to modify attribute at illegal index: " + index;
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    throw new ArrayIndexOutOfBoundsException(msg);
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ////////////////////////////////////////////////////////////////////
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Internal state.
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ////////////////////////////////////////////////////////////////////
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int length;
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    String data [];
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// end of AttributesImpl.java
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
619