1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in the Software without restriction, including without limitation the rights 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sell copies of the Software, and to permit persons to whom the Software is 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * furnished to do so, subject to the following conditions: 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The above copyright notice and this permission notice shall be included in 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * all copies or substantial portions of the Software. 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IN THE SOFTWARE. */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.kxml2.kdom; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.*; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.*; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.xmlpull.v1.*; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** A common base class for Document and Element, also used for 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project storing XML fragments. */ 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Node { //implements XmlIO{ 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final int DOCUMENT = 0; 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final int ELEMENT = 2; 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final int TEXT = 4; 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final int CDSECT = 5; 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final int ENTITY_REF = 6; 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final int IGNORABLE_WHITESPACE = 7; 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final int PROCESSING_INSTRUCTION = 8; 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final int COMMENT = 9; 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final int DOCDECL = 10; 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected Vector children; 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected StringBuffer types; 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** inserts the given child object of the given type at the 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project given index. */ 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addChild(int index, int type, Object child) { 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (child == null) 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException(); 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (children == null) { 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project children = new Vector(); 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types = new StringBuffer(); 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (type == ELEMENT) { 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!(child instanceof Element)) 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("Element obj expected)"); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ((Element) child).setParent(this); 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (!(child instanceof String)) 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("String expected"); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project children.insertElementAt(child, index); 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types.insert(index, (char) type); 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** convenience method for addChild (getChildCount (), child) */ 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addChild(int type, Object child) { 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addChild(getChildCount(), type, child); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Builds a default element with the given properties. Elements 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project should always be created using this method instead of the 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project constructor in order to enable construction of specialized 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project subclasses by deriving custom Document classes. Please note: 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project For no namespace, please use Xml.NO_NAMESPACE, null is not a 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project legal value. Currently, null is converted to Xml.NO_NAMESPACE, 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project but future versions may throw an exception. */ 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Element createElement(String namespace, String name) { 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Element e = new Element(); 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project e.namespace = namespace == null ? "" : namespace; 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project e.name = name; 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return e; 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Returns the child object at the given index. For child 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project elements, an Element object is returned. For all other child 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types, a String is returned. */ 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Object getChild(int index) { 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return children.elementAt(index); 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Returns the number of child objects */ 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getChildCount() { 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return children == null ? 0 : children.size(); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** returns the element at the given index. If the node at the 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project given index is a text node, null is returned */ 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Element getElement(int index) { 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object child = getChild(index); 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (child instanceof Element) ? (Element) child : null; 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Returns the element with the given namespace and name. If the 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project element is not found, or more than one matching elements are 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project found, an exception is thrown. */ 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Element getElement(String namespace, String name) { 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int i = indexOf(namespace, name, 0); 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int j = indexOf(namespace, name, i + 1); 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (i == -1 || j != -1) 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException( 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "Element {" 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + namespace 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + "}" 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + name 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + (i == -1 ? " not found in " : " more than once in ") 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + this); 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getElement(i); 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* returns "#document-fragment". For elements, the element name is returned 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getName() { 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "#document-fragment"; 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Returns the namespace of the current element. For Node 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project and Document, Xml.NO_NAMESPACE is returned. 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getNamespace() { 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ""; 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getNamespaceCount () { 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 0; 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** returns the text content if the element has text-only 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project content. Throws an exception for mixed content 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getText() { 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuffer buf = new StringBuffer(); 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = getChildCount(); 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < len; i++) { 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isText(i)) 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buf.append(getText(i)); 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (getType(i) == ELEMENT) 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("not text-only content!"); 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return buf.toString(); 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Returns the text node with the given index or null if the node 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project with the given index is not a text node. */ 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getText(int index) { 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (isText(index)) ? (String) getChild(index) : null; 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Returns the type of the child at the given index. Possible 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types are ELEMENT, TEXT, COMMENT, and PROCESSING_INSTRUCTION */ 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getType(int index) { 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return types.charAt(index); 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Convenience method for indexOf (getNamespace (), name, 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project startIndex). 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int indexOf(String name, int startIndex) { 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return indexOf(getNamespace(), name, startIndex); 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Performs search for an element with the given namespace and 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project name, starting at the given start index. A null namespace 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project matches any namespace, please use Xml.NO_NAMESPACE for no 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project namespace). returns -1 if no matching element was found. */ 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int indexOf(String namespace, String name, int startIndex) { 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = getChildCount(); 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = startIndex; i < len; i++) { 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Element child = getElement(i); 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (child != null 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project && name.equals(child.getName()) 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project && (namespace == null || namespace.equals(child.getNamespace()))) 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return i; 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return -1; 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean isText(int i) { 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int t = getType(i); 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return t == TEXT || t == IGNORABLE_WHITESPACE || t == CDSECT; 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Recursively builds the child elements from the given parser 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project until an end tag or end document is found. 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project The end tag is not consumed. */ 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void parse(XmlPullParser parser) 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws IOException, XmlPullParserException { 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean leave = false; 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int type = parser.getEventType(); 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // System.out.println(parser.getPositionDescription()); 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (type) { 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case XmlPullParser.START_TAG : 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Element child = 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project createElement( 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project parser.getNamespace(), 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project parser.getName()); 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // child.setAttributes (event.getAttributes ()); 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addChild(ELEMENT, child); 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // order is important here since 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // setparent may perform some init code! 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project child.parse(parser); 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case XmlPullParser.END_DOCUMENT : 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case XmlPullParser.END_TAG : 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project leave = true; 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default : 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (parser.getText() != null) 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addChild( 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project type == XmlPullParser.ENTITY_REF ? TEXT : type, 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project parser.getText()); 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if ( 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project type == XmlPullParser.ENTITY_REF 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project && parser.getName() != null) { 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addChild(ENTITY_REF, parser.getName()); 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project parser.nextToken(); 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (!leave); 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Removes the child object at the given index */ 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void removeChild(int idx) { 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project children.removeElementAt(idx); 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /*** Modification by HHS - start ***/ 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // types.deleteCharAt (index); 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /***/ 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int n = types.length() - 1; 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = idx; i < n; i++) 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types.setCharAt(i, types.charAt(i + 1)); 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project types.setLength(n); 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /*** Modification by HHS - end ***/ 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* returns a valid XML representation of this Element including 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project attributes and children. 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toString() { 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ByteArrayOutputStream bos = 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new ByteArrayOutputStream(); 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project XmlWriter xw = 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new XmlWriter(new OutputStreamWriter(bos)); 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write(xw); 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project xw.close(); 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new String(bos.toByteArray()); 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project catch (IOException e) { 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException(e.toString()); 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Writes this node to the given XmlWriter. For node and document, 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this method is identical to writeChildren, except that the 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stream is flushed automatically. */ 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void write(XmlSerializer writer) throws IOException { 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writeChildren(writer); 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writer.flush(); 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Writes the children of this node to the given XmlWriter. */ 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void writeChildren(XmlSerializer writer) throws IOException { 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (children == null) 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = children.size(); 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < len; i++) { 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int type = getType(i); 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object child = children.elementAt(i); 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (type) { 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ELEMENT : 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ((Element) child).write(writer); 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case TEXT : 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writer.text((String) child); 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case IGNORABLE_WHITESPACE : 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writer.ignorableWhitespace((String) child); 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case CDSECT : 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writer.cdsect((String) child); 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case COMMENT : 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writer.comment((String) child); 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ENTITY_REF : 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writer.entityRef((String) child); 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case PROCESSING_INSTRUCTION : 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writer.processingInstruction((String) child); 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case DOCDECL : 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writer.docdecl((String) child); 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default : 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("Illegal type: " + type); 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 367