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 Yu
25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.xmlpull.v1.*;
26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/** The document consists of some legacy events and a single root
28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    element. This class basically adds some consistency checks to
29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    Node. */
30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class Document extends Node {
32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    protected int rootIndex = -1;
34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    String encoding;
35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    Boolean standalone;
36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** returns "#document" */
38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getEncoding() {
40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return encoding;
41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setEncoding(String enc) {
44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.encoding = enc;
45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setStandalone(Boolean standalone) {
48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.standalone = standalone;
49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Boolean getStandalone() {
52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return standalone;
53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getName() {
56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return "#document";
57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Adds a child at the given index position. Throws
60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    an exception when a second root element is added */
61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void addChild(int index, int type, Object child) {
63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (type == ELEMENT) {
64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            //   if (rootIndex != -1)
65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            //     throw new RuntimeException("Only one document root element allowed");
66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            rootIndex = index;
68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        else if (rootIndex >= index)
70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            rootIndex++;
71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super.addChild(index, type, child);
73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** reads the document and checks if the last event
76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    is END_DOCUMENT. If not, an exception is thrown.
77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    The end event is consumed. For parsing partial
78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        XML structures, consider using Node.parse (). */
79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void parse(XmlPullParser parser)
81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throws IOException, XmlPullParserException {
82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        parser.require(XmlPullParser.START_DOCUMENT, null, null);
84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        parser.nextToken();
85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        encoding = parser.getInputEncoding();
87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        standalone = (Boolean) parser
88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                .getProperty("http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone");
89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super.parse(parser);
91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (parser.getEventType() != XmlPullParser.END_DOCUMENT)
93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throw new RuntimeException("Document end expected!");
94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void removeChild(int index) {
98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (index == rootIndex)
99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            rootIndex = -1;
100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        else if (index < rootIndex)
101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            rootIndex--;
102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super.removeChild(index);
104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** returns the root element of this document. */
107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Element getRootElement() {
109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (rootIndex == -1)
110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throw new RuntimeException("Document has no root element!");
111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return (Element) getChild(rootIndex);
113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Writes this node to the given XmlWriter. For node and document,
116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this method is identical to writeChildren, except that the
117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        stream is flushed automatically. */
118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void write(XmlSerializer writer)
120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            throws IOException {
121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        writer.startDocument(encoding, standalone);
123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        writeChildren(writer);
124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        writer.endDocument();
125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu}
128