1 /* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany 2 * 3 * Permission is hereby granted, free of charge, to any person obtaining a copy 4 * of this software and associated documentation files (the "Software"), to deal 5 * in the Software without restriction, including without limitation the rights 6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or 7 * sell copies of the Software, and to permit persons to whom the Software is 8 * furnished to do so, subject to the following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included in 11 * all copies or substantial portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 * IN THE SOFTWARE. */ 20 21 package org.ksoap2.kdom; 22 23 import java.io.*; 24 25 import org.xmlpull.v1.*; 26 27 /** The document consists of some legacy events and a single root 28 element. This class basically adds some consistency checks to 29 Node. */ 30 31 public class Document extends Node { 32 33 protected int rootIndex = -1; 34 String encoding; 35 Boolean standalone; 36 37 /** returns "#document" */ 38 getEncoding()39 public String getEncoding() { 40 return encoding; 41 } 42 setEncoding(String enc)43 public void setEncoding(String enc) { 44 this.encoding = enc; 45 } 46 setStandalone(Boolean standalone)47 public void setStandalone(Boolean standalone) { 48 this.standalone = standalone; 49 } 50 getStandalone()51 public Boolean getStandalone() { 52 return standalone; 53 } 54 getName()55 public String getName() { 56 return "#document"; 57 } 58 59 /** Adds a child at the given index position. Throws 60 an exception when a second root element is added */ 61 addChild(int index, int type, Object child)62 public void addChild(int index, int type, Object child) { 63 if (type == ELEMENT) { 64 // if (rootIndex != -1) 65 // throw new RuntimeException("Only one document root element allowed"); 66 67 rootIndex = index; 68 } 69 else if (rootIndex >= index) 70 rootIndex++; 71 72 super.addChild(index, type, child); 73 } 74 75 /** reads the document and checks if the last event 76 is END_DOCUMENT. If not, an exception is thrown. 77 The end event is consumed. For parsing partial 78 XML structures, consider using Node.parse (). */ 79 parse(XmlPullParser parser)80 public void parse(XmlPullParser parser) 81 throws IOException, XmlPullParserException { 82 83 parser.require(XmlPullParser.START_DOCUMENT, null, null); 84 parser.nextToken(); 85 86 encoding = parser.getInputEncoding(); 87 standalone = (Boolean) parser 88 .getProperty("http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone"); 89 90 super.parse(parser); 91 92 if (parser.getEventType() != XmlPullParser.END_DOCUMENT) 93 throw new RuntimeException("Document end expected!"); 94 95 } 96 removeChild(int index)97 public void removeChild(int index) { 98 if (index == rootIndex) 99 rootIndex = -1; 100 else if (index < rootIndex) 101 rootIndex--; 102 103 super.removeChild(index); 104 } 105 106 /** returns the root element of this document. */ 107 getRootElement()108 public Element getRootElement() { 109 if (rootIndex == -1) 110 throw new RuntimeException("Document has no root element!"); 111 112 return (Element) getChild(rootIndex); 113 } 114 115 /** Writes this node to the given XmlWriter. For node and document, 116 this method is identical to writeChildren, except that the 117 stream is flushed automatically. */ 118 write(XmlSerializer writer)119 public void write(XmlSerializer writer) 120 throws IOException { 121 122 writer.startDocument(encoding, standalone); 123 writeChildren(writer); 124 writer.endDocument(); 125 } 126 127 } 128