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