1997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
2997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
3997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Permission is hereby granted, free of charge, to any person obtaining a copy
4997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * of this software and associated documentation files (the "Software"), to deal
5997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * in the Software without restriction, including without limitation the rights
6997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * to use, copy, modify, merge, publish, distribute, sublicense, and/or
7997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * sell copies of the Software, and to permit persons to whom the Software is
8997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * furnished to do so, subject to the following conditions:
9997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
10997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * The  above copyright notice and this permission notice shall be included in
11997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * all copies or substantial portions of the Software.
12997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
13997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IN THE SOFTWARE. */
20997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
21997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupackage org.ksoap2.kdom;
22997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
23997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.*;
24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.*;
25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.xmlpull.v1.*;
27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/**
29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * In order to create an element, please use the createElement method
30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * instead of invoking the constructor directly. The right place to
31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * add user defined initialization code is the init method. */
32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class Element extends Node {
34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    protected String namespace;
36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    protected String name;
37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    protected Vector attributes;
38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    protected Node parent;
39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    protected Vector prefixes;
40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Element() {
42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * called when all properties are set, but before children
46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * are parsed. Please do not use setParent for initialization
47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * code any longer. */
48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void init() {
50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * removes all children and attributes */
54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void clear() {
56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        attributes = null;
57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        children = null;
58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Forwards creation request to parent if any, otherwise
62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * calls super.createElement. */
63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Element createElement(
65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            String namespace,
66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            String name) {
67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return (this.parent == null)
69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                ? super.createElement(namespace, name)
70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                : this.parent.createElement(namespace, name);
71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Returns the number of attributes of this element. */
75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int getAttributeCount() {
77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return attributes == null ? 0 : attributes.size();
78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getAttributeNamespace(int index) {
81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return ((String[]) attributes.elementAt(index))[0];
82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /*    public String getAttributePrefix (int index) {
85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            return ((String []) attributes.elementAt (index)) [1];
86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }*/
87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getAttributeName(int index) {
89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return ((String[]) attributes.elementAt(index))[1];
90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getAttributeValue(int index) {
93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return ((String[]) attributes.elementAt(index))[2];
94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getAttributeValue(String namespace, String name) {
97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (int i = 0; i < getAttributeCount(); i++) {
98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (name.equals(getAttributeName(i))
99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    && (namespace == null || namespace.equals(getAttributeNamespace(i)))) {
100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                return getAttributeValue(i);
101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return null;
104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Returns the root node, determined by ascending to the
108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * all parents un of the root element. */
109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Node getRoot() {
111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        Element current = this;
113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        while (current.parent != null) {
115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (!(current.parent instanceof Element))
116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                return current.parent;
117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            current = (Element) current.parent;
118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return current;
121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * returns the (local) name of the element */
125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getName() {
127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return name;
128997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
129997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
130997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
131997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * returns the namespace of the element */
132997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
133997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getNamespace() {
134997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return namespace;
135997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
136997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
137997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
138997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * returns the namespace for the given prefix */
139997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
140997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getNamespaceUri(String prefix) {
141997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int cnt = getNamespaceCount();
142997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (int i = 0; i < cnt; i++) {
143997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (prefix == getNamespacePrefix(i) ||
144997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    (prefix != null && prefix.equals(getNamespacePrefix(i))))
145997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                return getNamespaceUri(i);
146997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
147997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return parent instanceof Element ? ((Element) parent).getNamespaceUri(prefix) : null;
148997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
149997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
150997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
151997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * returns the number of declared namespaces, NOT including
152997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * parent elements */
153997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
154997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int getNamespaceCount() {
155997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return (prefixes == null ? 0 : prefixes.size());
156997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
157997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
158997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getNamespacePrefix(int i) {
159997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return ((String[]) prefixes.elementAt(i))[0];
160997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
161997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
162997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getNamespaceUri(int i) {
163997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return ((String[]) prefixes.elementAt(i))[1];
164997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
165997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
166997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
167997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Returns the parent node of this element */
168997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
169997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Node getParent() {
170997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return parent;
171997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
172997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
173997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /*
174997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Returns the parent element if available, null otherwise
175997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
176997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Element getParentElement() {
177997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return (parent instanceof Element)
178997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            ? ((Element) parent)
179997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            : null;
180997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
181997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    */
182997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
183997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
184997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Builds the child elements from the given Parser. By overwriting
185997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * parse, an element can take complete control over parsing its
186997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * subtree. */
187997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
188997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void parse(XmlPullParser parser)
189997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throws IOException, XmlPullParserException {
190997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
191997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (int i = parser.getNamespaceCount(parser.getDepth() - 1); i < parser
192997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                .getNamespaceCount(parser.getDepth()); i++) {
193997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            setPrefix(parser.getNamespacePrefix(i), parser.getNamespaceUri(i));
194997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
195997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
196997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (int i = 0; i < parser.getAttributeCount(); i++)
197997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            setAttribute(parser.getAttributeNamespace(i),
198997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    //                          parser.getAttributePrefix (i),
199997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    parser.getAttributeName(i),
200997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    parser.getAttributeValue(i));
201997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
202997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        //        if (prefixMap == null) throw new RuntimeException ("!!");
203997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
204997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        init();
205997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
206997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (parser.isEmptyElementTag())
207997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            parser.nextToken();
208997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        else {
209997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            parser.nextToken();
210997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            super.parse(parser);
211997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
212997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (getChildCount() == 0)
213997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                addChild(IGNORABLE_WHITESPACE, "");
214997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
215997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
216997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        parser.require(
217997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                XmlPullParser.END_TAG,
218997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                getNamespace(),
219997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                getName());
220997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
221997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        parser.nextToken();
222997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
223997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
224997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
225997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Sets the given attribute; a value of null removes the attribute */
226997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
227997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setAttribute(String namespace, String name, String value) {
228997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (attributes == null)
229997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            attributes = new Vector();
230997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
231997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (namespace == null)
232997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            namespace = "";
233997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
234997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (int i = attributes.size() - 1; i >= 0; i--) {
235997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            String[] attribut = (String[]) attributes.elementAt(i);
236997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (attribut[0].equals(namespace) &&
237997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    attribut[1].equals(name)) {
238997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
239997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                if (value == null) {
240997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    attributes.removeElementAt(i);
241997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                }
242997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                else {
243997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    attribut[2] = value;
244997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                }
245997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                return;
246997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
247997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
248997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
249997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        attributes.addElement
250997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                (new String[] {
251997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                        namespace, name, value
252997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                });
253997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
254997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
255997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
256997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Sets the given prefix; a namespace value of null removess the
257997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * prefix */
258997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
259997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setPrefix(String prefix, String namespace) {
260997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (prefixes == null)
261997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            prefixes = new Vector();
262997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        prefixes.addElement(new String[] {
263997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                prefix, namespace
264997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        });
265997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
266997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
267997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
268997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * sets the name of the element */
269997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
270997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setName(String name) {
271997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.name = name;
272997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
273997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
274997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
275997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * sets the namespace of the element. Please note: For no
276997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * namespace, please use Xml.NO_NAMESPACE, null is not a legal
277997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * value. Currently, null is converted to Xml.NO_NAMESPACE, but
278997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * future versions may throw an exception. */
279997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
280997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setNamespace(String namespace) {
281997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (namespace == null)
282997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throw new NullPointerException("Use \"\" for empty namespace");
283997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.namespace = namespace;
284997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
285997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
286997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
287997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Sets the Parent of this element. Automatically called from the
288997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * add method.  Please use with care, you can simply
289997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * create inconsitencies in the document tree structure using
290997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * this method!  */
291997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
292997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    protected void setParent(Node parent) {
293997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.parent = parent;
294997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
295997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
296997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
297997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Writes this element and all children to the given XmlWriter. */
298997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
299997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void write(XmlSerializer writer)
300997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throws IOException {
301997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
302997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (prefixes != null) {
303997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            for (int i = 0; i < prefixes.size(); i++) {
304997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                writer.setPrefix(getNamespacePrefix(i), getNamespaceUri(i));
305997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
306997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
307997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
308997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        writer.startTag(
309997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                getNamespace(),
310997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                getName());
311997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
312997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int len = getAttributeCount();
313997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
314997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        for (int i = 0; i < len; i++) {
315997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            writer.attribute(
316997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    getAttributeNamespace(i),
317997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    getAttributeName(i),
318997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    getAttributeValue(i));
319997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
320997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
321997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        writeChildren(writer);
322997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
323997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        writer.endTag(getNamespace(), getName());
324997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
325997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu}
326