XmlUtils.java revision ef73ee1dd98acfc4a19561367cfc3e4d8bbe06ea
1087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor/* 2087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Copyright (C) 2006 The Android Open Source Project 3087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 4087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Licensed under the Apache License, Version 2.0 (the "License"); 5087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * you may not use this file except in compliance with the License. 6087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * You may obtain a copy of the License at 7087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 8087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * http://www.apache.org/licenses/LICENSE-2.0 9087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 10087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Unless required by applicable law or agreed to in writing, software 11087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * distributed under the License is distributed on an "AS IS" BASIS, 12087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * See the License for the specific language governing permissions and 14087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * limitations under the License. 15087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 16087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 172269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornpackage com.android.internal.util; 182269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn 19ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeyimport android.util.Xml; 20087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 21087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlPullParser; 22087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlPullParserException; 23087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlSerializer; 24087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 25087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.IOException; 26087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.InputStream; 27087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.OutputStream; 28ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeyimport java.net.ProtocolException; 29087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.ArrayList; 30087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.HashMap; 31212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport java.util.HashSet; 32087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Iterator; 33087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.List; 34087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Map; 35087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Set; 36087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 37087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor/** {@hide} */ 38ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeypublic class XmlUtils { 39087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 40087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static void skipCurrentTag(XmlPullParser parser) 41087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, IOException { 42087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int outerDepth = parser.getDepth(); 43087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int type; 44087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 45087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor && (type != XmlPullParser.END_TAG 46087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor || parser.getDepth() > outerDepth)) { 47087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 48087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 49087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 50087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final int 51087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor convertValueToList(CharSequence value, String[] options, int defaultValue) 52087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 53087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (null != value) { 54087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor for (int i = 0; i < options.length; i++) { 55087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (value.equals(options[i])) 56087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return i; 57087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 58087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 59087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 60087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return defaultValue; 61087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 62087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 63087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final boolean 64087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor convertValueToBoolean(CharSequence value, boolean defaultValue) 65087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 66087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor boolean result = false; 67087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 68087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (null == value) 69087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return defaultValue; 70087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 71087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (value.equals("1") 72087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor || value.equals("true") 73087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor || value.equals("TRUE")) 74087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor result = true; 75087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 76087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return result; 77087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 78087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 79087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final int 80087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor convertValueToInt(CharSequence charSeq, int defaultValue) 81087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 82087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (null == charSeq) 83087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return defaultValue; 84087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 85087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String nm = charSeq.toString(); 86087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 87087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // XXX This code is copied from Integer.decode() so we don't 88087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // have to instantiate an Integer! 89087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 90087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int value; 91087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int sign = 1; 92087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int index = 0; 93087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int len = nm.length(); 94087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int base = 10; 95087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 96087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ('-' == nm.charAt(0)) { 97087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor sign = -1; 98087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index++; 99087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 100087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 101087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ('0' == nm.charAt(index)) { 102087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // Quick check for a zero by itself 103087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (index == (len - 1)) 104087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return 0; 105087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 106087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor char c = nm.charAt(index + 1); 107087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 108087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ('x' == c || 'X' == c) { 109087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index += 2; 110087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 16; 111087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 112087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index++; 113087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 8; 114087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 115087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 116087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor else if ('#' == nm.charAt(index)) 117087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 118087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index++; 119087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 16; 120087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 121087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 122087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return Integer.parseInt(nm.substring(index), base) * sign; 123087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 124087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 125a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy public static int convertValueToUnsignedInt(String value, int defaultValue) { 126a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy if (null == value) { 127087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return defaultValue; 128a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy } 129087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 130087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return parseUnsignedIntAttribute(value); 131087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 132087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 133a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy public static int parseUnsignedIntAttribute(CharSequence charSeq) { 134087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String value = charSeq.toString(); 135087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 136087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor long bits; 137087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int index = 0; 138087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int len = value.length(); 139087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int base = 10; 140087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 141087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ('0' == value.charAt(index)) { 142087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // Quick check for zero by itself 143087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (index == (len - 1)) 144087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return 0; 145087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 146087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor char c = value.charAt(index + 1); 147087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 148087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ('x' == c || 'X' == c) { // check for hex 149087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index += 2; 150087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 16; 151087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { // check for octal 152087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index++; 153087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 8; 154087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 155087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if ('#' == value.charAt(index)) { 156087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index++; 157087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 16; 158087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 159087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 160087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return (int) Long.parseLong(value.substring(index), base); 161087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 162087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 163087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 164087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten a Map into an output stream as XML. The map can later be 165087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * read back with readMapXml(). 166087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 167087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The map to be flattened. 168087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out Where to write the XML data. 169087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 170087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml(Map, String, XmlSerializer) 171087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml 172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readMapXml 174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeMapXml(Map val, OutputStream out) 176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException { 177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlSerializer serializer = new FastXmlSerializer(); 178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.setOutput(out, "utf-8"); 179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.startDocument(null, true); 180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeMapXml(val, null, serializer); 182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.endDocument(); 183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten a List into an output stream as XML. The list can later be 187087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * read back with readListXml(). 188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 189087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The list to be flattened. 190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out Where to write the XML data. 191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml(List, String, XmlSerializer) 193087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml 194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeListXml(List val, OutputStream out) 198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException 199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlSerializer serializer = Xml.newSerializer(); 201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.setOutput(out, "utf-8"); 202087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.startDocument(null, true); 203087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeListXml(val, null, serializer); 205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.endDocument(); 206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 208087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 209087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten a Map into an XmlSerializer. The map can later be read back 210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * with readThisMapXml(). 211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 212087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The map to be flattened. 213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name Name attribute to include with this list's tag, or null for 214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * none. 215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out XmlSerializer to write the map into. 216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml(Map, OutputStream) 218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml 219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readMapXml 221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeMapXml(Map val, String name, XmlSerializer out) 223ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 224ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeMapXml(val, name, out, null); 225ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 226ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 227ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 228ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten a Map into an XmlSerializer. The map can later be read back 229ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * with readThisMapXml(). 230ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 231ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param val The map to be flattened. 232ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name Name attribute to include with this list's tag, or null for 233ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * none. 234ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the map into. 235ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param callback Method to call when an Object type is not recognized. 236ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 237ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml(Map, OutputStream) 238ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeListXml 239ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeValueXml 240ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readMapXml 241ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 242ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 243ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 244ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final void writeMapXml(Map val, String name, XmlSerializer out, 245ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner WriteMapCallback callback) throws XmlPullParserException, java.io.IOException { 246ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 247087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (val == null) { 248087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "null"); 249087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "null"); 250087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 251087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 252087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 253087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "map"); 254087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 255087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 256087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 257087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 258ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeMapXml(val, out, callback); 259ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 260ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "map"); 261ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 262ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 263ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 264ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten a Map into an XmlSerializer. The map can later be read back 265ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * with readThisMapXml(). This method presumes that the start tag and 266ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * name attribute have already been written and does not write an end tag. 267ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 268ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param val The map to be flattened. 269ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the map into. 270ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 271ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml(Map, OutputStream) 272ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeListXml 273ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeValueXml 274ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readMapXml 275ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 276ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 277ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 278ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final void writeMapXml(Map val, XmlSerializer out, 279ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner WriteMapCallback callback) throws XmlPullParserException, java.io.IOException { 280ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (val == null) { 281ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 282ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 283ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 284ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner Set s = val.entrySet(); 285ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner Iterator i = s.iterator(); 286ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 287087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while (i.hasNext()) { 288087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor Map.Entry e = (Map.Entry)i.next(); 289ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeValueXml(e.getValue(), (String)e.getKey(), out, callback); 290087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 291087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 292087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 293087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 294087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten a List into an XmlSerializer. The list can later be read back 295087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * with readThisListXml(). 296087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 297087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The list to be flattened. 298087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name Name attribute to include with this list's tag, or null for 299087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * none. 300087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out XmlSerializer to write the list into. 301087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 302087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml(List, OutputStream) 303087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml 304087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 305087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 306087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 307087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeListXml(List val, String name, XmlSerializer out) 308087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException 309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (val == null) { 311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "null"); 312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "null"); 313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "list"); 317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int N = val.size(); 322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int i=0; 323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while (i < N) { 324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeValueXml(val.get(i), null, out); 325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor i++; 326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "list"); 329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 330212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 331212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public static final void writeSetXml(Set val, String name, XmlSerializer out) 332212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell throws XmlPullParserException, java.io.IOException { 333212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (val == null) { 334212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell out.startTag(null, "null"); 335212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell out.endTag(null, "null"); 336212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return; 337212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 338212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 339212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell out.startTag(null, "set"); 340212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (name != null) { 341212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell out.attribute(null, "name", name); 342212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 343212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 344212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell for (Object v : val) { 345212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell writeValueXml(v, null, out); 346212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 347212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 348212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell out.endTag(null, "set"); 349212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten a byte[] into an XmlSerializer. The list can later be read back 353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * with readThisByteArrayXml(). 354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The byte array to be flattened. 356087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name Name attribute to include with this array's tag, or null for 357087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * none. 358087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out XmlSerializer to write the array into. 359087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 360087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml 361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeByteArrayXml(byte[] val, String name, 364087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlSerializer out) 365087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException { 366087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 367087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (val == null) { 368087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "null"); 369087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "null"); 370087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 371087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 372087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 373087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "byte-array"); 374087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 375087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 376087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 377087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 378087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final int N = val.length; 379087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "num", Integer.toString(N)); 380087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 381087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor StringBuilder sb = new StringBuilder(val.length*2); 382087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor for (int i=0; i<N; i++) { 383087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int b = val[i]; 384087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int h = b>>4; 385087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor sb.append(h >= 10 ? ('a'+h-10) : ('0'+h)); 386087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor h = b&0xff; 387087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor sb.append(h >= 10 ? ('a'+h-10) : ('0'+h)); 388087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 389087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 390087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.text(sb.toString()); 391087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 392087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "byte-array"); 393087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 394087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 395087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 396087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten an int[] into an XmlSerializer. The list can later be read back 397087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * with readThisIntArrayXml(). 398087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 399087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The int array to be flattened. 400087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name Name attribute to include with this array's tag, or null for 401087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * none. 402087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out XmlSerializer to write the array into. 403087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 404087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml 405087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 406087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readThisIntArrayXml 407087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 408087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeIntArrayXml(int[] val, String name, 409087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlSerializer out) 410087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException { 411087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 412087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (val == null) { 413087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "null"); 414087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "null"); 415087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 416087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 417087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 418087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "int-array"); 419087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 420087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 421087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 422087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 423087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final int N = val.length; 424087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "num", Integer.toString(N)); 425087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 426087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor for (int i=0; i<N; i++) { 427087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "item"); 428087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "value", Integer.toString(val[i])); 429087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "item"); 430087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 431087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 432087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "int-array"); 433087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 434087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 435087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 436ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten a long[] into an XmlSerializer. The list can later be read back 437ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * with readThisLongArrayXml(). 438ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 439ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param val The long array to be flattened. 440ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name Name attribute to include with this array's tag, or null for 441ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * none. 442ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the array into. 443ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 444ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml 445ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeValueXml 446ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readThisIntArrayXml 447ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 448ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final void writeLongArrayXml(long[] val, String name, XmlSerializer out) 449ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 450ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 451ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (val == null) { 452ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "null"); 453ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "null"); 454ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 455ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 456ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 457ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "long-array"); 458ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (name != null) { 459ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "name", name); 460ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 461ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 462ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final int N = val.length; 463ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "num", Integer.toString(N)); 464ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 465ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner for (int i=0; i<N; i++) { 466ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "item"); 467ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "value", Long.toString(val[i])); 468ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "item"); 469ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 470ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 471ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "long-array"); 472ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 473ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 474ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 475ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten a double[] into an XmlSerializer. The list can later be read back 476ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * with readThisDoubleArrayXml(). 477ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 478ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param val The double array to be flattened. 479ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name Name attribute to include with this array's tag, or null for 480ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * none. 481ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the array into. 482ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 483ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml 484ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeValueXml 485ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readThisIntArrayXml 486ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 487ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final void writeDoubleArrayXml(double[] val, String name, XmlSerializer out) 488ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 489ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 490ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (val == null) { 491ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "null"); 492ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "null"); 493ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 494ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 495ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 496ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "double-array"); 497ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (name != null) { 498ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "name", name); 499ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 500ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 501ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final int N = val.length; 502ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "num", Integer.toString(N)); 503ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 504ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner for (int i=0; i<N; i++) { 505ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "item"); 506ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "value", Double.toString(val[i])); 507ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "item"); 508ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 509ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 510ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "double-array"); 511ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 512ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 513ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 514ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten a String[] into an XmlSerializer. The list can later be read back 515ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * with readThisStringArrayXml(). 516ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 517ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param val The long array to be flattened. 518ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name Name attribute to include with this array's tag, or null for 519ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * none. 520ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the array into. 521ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 522ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml 523ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeValueXml 524ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readThisIntArrayXml 525ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 526ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final void writeStringArrayXml(String[] val, String name, XmlSerializer out) 527ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 528ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 529ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (val == null) { 530ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "null"); 531ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "null"); 532ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 533ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 534ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 535ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "string-array"); 536ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (name != null) { 537ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "name", name); 538ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 539ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 540ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final int N = val.length; 541ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "num", Integer.toString(N)); 542ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 543ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner for (int i=0; i<N; i++) { 544ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "item"); 545ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "value", val[i]); 546ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "item"); 547ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 548ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 549ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "string-array"); 550ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 551ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 552ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 553087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten an object's value into an XmlSerializer. The value can later 554087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * be read back with readThisValueXml(). 555087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 556087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Currently supported value types are: null, String, Integer, Long, 557087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Float, Double Boolean, Map, List. 558087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 559087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param v The object to be flattened. 560087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name Name attribute to include with this value's tag, or null 561087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * for none. 562087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out XmlSerializer to write the object into. 563087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 564087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml 565087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml 566087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readValueXml 567087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 568087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeValueXml(Object v, String name, XmlSerializer out) 569ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 570ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeValueXml(v, name, out, null); 571ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 572ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 573ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 574ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten an object's value into an XmlSerializer. The value can later 575ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * be read back with readThisValueXml(). 576ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 577ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Currently supported value types are: null, String, Integer, Long, 578ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Float, Double Boolean, Map, List. 579ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 580ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param v The object to be flattened. 581ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name Name attribute to include with this value's tag, or null 582ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * for none. 583ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the object into. 584ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param callback Handler for Object types not recognized. 585ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 586ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml 587ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeListXml 588ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readValueXml 589ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 590ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner private static final void writeValueXml(Object v, String name, XmlSerializer out, 591ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner WriteMapCallback callback) throws XmlPullParserException, java.io.IOException { 592087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String typeStr; 593087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (v == null) { 594087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "null"); 595087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 596087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 597087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 598087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "null"); 599087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 600087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof String) { 601087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "string"); 602087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 603087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 604087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 605087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.text(v.toString()); 606087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "string"); 607087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 608087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Integer) { 609087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor typeStr = "int"; 610087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Long) { 611087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor typeStr = "long"; 612087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Float) { 613087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor typeStr = "float"; 614087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Double) { 615087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor typeStr = "double"; 616087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Boolean) { 617087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor typeStr = "boolean"; 618087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof byte[]) { 619087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeByteArrayXml((byte[])v, name, out); 620087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 621087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof int[]) { 622087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeIntArrayXml((int[])v, name, out); 623087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 624ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (v instanceof long[]) { 625ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeLongArrayXml((long[])v, name, out); 626ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 627ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (v instanceof double[]) { 628ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeDoubleArrayXml((double[])v, name, out); 629ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 630ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (v instanceof String[]) { 631ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeStringArrayXml((String[])v, name, out); 632ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 633087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Map) { 634087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeMapXml((Map)v, name, out); 635087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 636087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof List) { 637ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeListXml((List) v, name, out); 638087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 639212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } else if (v instanceof Set) { 640ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeSetXml((Set) v, name, out); 641212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return; 642087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof CharSequence) { 643087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // XXX This is to allow us to at least write something if 644087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // we encounter styled text... but it means we will drop all 645087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // of the styling information. :( 646087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "string"); 647087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 648087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 649087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 650087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.text(v.toString()); 651087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "string"); 652087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 653ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (callback != null) { 654ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner callback.writeUnknownObject(v, name, out); 655ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 656087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 657087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new RuntimeException("writeValueXml: unable to write value " + v); 658087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 659087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 660087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, typeStr); 661087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 662087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 663087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 664087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "value", v.toString()); 665087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, typeStr); 666087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 667087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 668087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 669087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read a HashMap from an InputStream containing XML. The stream can 670087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been written by writeMapXml(). 671087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 672087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param in The InputStream from which to read. 673087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 674087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @return HashMap The resulting map. 675087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 676087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 677087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readValueXml 678087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readThisMapXml 679087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * #see #writeMapXml 680087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 681f748257eee651b974e15274e03fe9843a8393073Narayan Kamath @SuppressWarnings("unchecked") 682f748257eee651b974e15274e03fe9843a8393073Narayan Kamath public static final HashMap<String, ?> readMapXml(InputStream in) 683087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException 684087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 685087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlPullParser parser = Xml.newPullParser(); 686087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor parser.setInput(in, null); 687f748257eee651b974e15274e03fe9843a8393073Narayan Kamath return (HashMap<String, ?>) readValueXml(parser, new String[1]); 688087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 689087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 690087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 691087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read an ArrayList from an InputStream containing XML. The stream can 692087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been written by writeListXml(). 693087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 694087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param in The InputStream from which to read. 695087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 696212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @return ArrayList The resulting list. 697087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 698087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readMapXml 699087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readValueXml 700087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readThisListXml 701087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml 702087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 703087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final ArrayList readListXml(InputStream in) 704087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException 705087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 706087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlPullParser parser = Xml.newPullParser(); 707087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor parser.setInput(in, null); 708087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return (ArrayList)readValueXml(parser, new String[1]); 709087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 710212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 711212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 712212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 713212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Read a HashSet from an InputStream containing XML. The stream can 714212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * previously have been written by writeSetXml(). 715212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 716212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param in The InputStream from which to read. 717212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 718212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @return HashSet The resulting set. 719212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 720212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @throws XmlPullParserException 721212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @throws java.io.IOException 722212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 723212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #readValueXml 724212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #readThisSetXml 725212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #writeSetXml 726212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 727212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public static final HashSet readSetXml(InputStream in) 728212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell throws XmlPullParserException, java.io.IOException { 729212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell XmlPullParser parser = Xml.newPullParser(); 730212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell parser.setInput(in, null); 731212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return (HashSet) readValueXml(parser, new String[1]); 732212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 733087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 734087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 735087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read a HashMap object from an XmlPullParser. The XML data could 736087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been generated by writeMapXml(). The XmlPullParser 737087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * must be positioned <em>after</em> the tag that begins the map. 738087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 739087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param parser The XmlPullParser from which to read the map data. 740087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param endTag Name of the tag that will end the map, usually "map". 741087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name An array of one string, used to return the name attribute 742087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * of the map's tag. 743087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 744087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @return HashMap The newly generated map. 745087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 746087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readMapXml 747087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 748f748257eee651b974e15274e03fe9843a8393073Narayan Kamath public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag, 749ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name) throws XmlPullParserException, java.io.IOException { 750ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return readThisMapXml(parser, endTag, name, null); 751ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 752ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 753ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 754ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read a HashMap object from an XmlPullParser. The XML data could 755ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * previously have been generated by writeMapXml(). The XmlPullParser 756ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must be positioned <em>after</em> the tag that begins the map. 757ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 758ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the map data. 759ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the map, usually "map". 760ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 761ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the map's tag. 762ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 763ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return HashMap The newly generated map. 764ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 765ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readMapXml 766ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 767ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 768ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag, 769ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name, ReadMapCallback callback) 770ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException 771087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 772f748257eee651b974e15274e03fe9843a8393073Narayan Kamath HashMap<String, Object> map = new HashMap<String, Object>(); 773087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 774087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType = parser.getEventType(); 775087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor do { 776087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.START_TAG) { 777ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner Object val = readThisValueXml(parser, name, callback); 778f748257eee651b974e15274e03fe9843a8393073Narayan Kamath map.put(name[0], val); 779087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.END_TAG) { 780087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals(endTag)) { 781087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return map; 782087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 783087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 784087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Expected " + endTag + " end tag at: " + parser.getName()); 785087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 786087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor eventType = parser.next(); 787087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } while (eventType != parser.END_DOCUMENT); 788087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 789087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 790087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Document ended before " + endTag + " end tag"); 791087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 792087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 793087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 794087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read an ArrayList object from an XmlPullParser. The XML data could 795087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been generated by writeListXml(). The XmlPullParser 796087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * must be positioned <em>after</em> the tag that begins the list. 797087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 798087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param parser The XmlPullParser from which to read the list data. 799087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param endTag Name of the tag that will end the list, usually "list". 800087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name An array of one string, used to return the name attribute 801087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * of the list's tag. 802087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 803087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @return HashMap The newly generated list. 804087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 805087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 806087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 807ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final ArrayList readThisListXml(XmlPullParser parser, String endTag, 808ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name) throws XmlPullParserException, java.io.IOException { 809ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return readThisListXml(parser, endTag, name, null); 810ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 811ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 812ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 813ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read an ArrayList object from an XmlPullParser. The XML data could 814ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * previously have been generated by writeListXml(). The XmlPullParser 815ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must be positioned <em>after</em> the tag that begins the list. 816ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 817ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the list data. 818ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the list, usually "list". 819ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 820ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the list's tag. 821ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 822ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return HashMap The newly generated list. 823ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 824ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readListXml 825ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 826ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner private static final ArrayList readThisListXml(XmlPullParser parser, String endTag, 827ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name, ReadMapCallback callback) 828ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 829087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor ArrayList list = new ArrayList(); 830087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 831087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType = parser.getEventType(); 832087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor do { 833087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.START_TAG) { 834ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner Object val = readThisValueXml(parser, name, callback); 835087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor list.add(val); 836087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Adding to list: " + val); 837087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.END_TAG) { 838087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals(endTag)) { 839087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return list; 840087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 841087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 842087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Expected " + endTag + " end tag at: " + parser.getName()); 843087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 844087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor eventType = parser.next(); 845087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } while (eventType != parser.END_DOCUMENT); 846087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 847087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 848087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Document ended before " + endTag + " end tag"); 849087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 850ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 851ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 852ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read a HashSet object from an XmlPullParser. The XML data could previously 853ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * have been generated by writeSetXml(). The XmlPullParser must be positioned 854ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * <em>after</em> the tag that begins the set. 855ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 856ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the set data. 857ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the set, usually "set". 858ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 859ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the set's tag. 860ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 861ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return HashSet The newly generated set. 862ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 863ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws XmlPullParserException 864ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws java.io.IOException 865ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 866ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readSetXml 867ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 868ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name) 869ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 870ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return readThisSetXml(parser, endTag, name, null); 871ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 872ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 873212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 874212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Read a HashSet object from an XmlPullParser. The XML data could previously 875212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * have been generated by writeSetXml(). The XmlPullParser must be positioned 876212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * <em>after</em> the tag that begins the set. 877212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 878212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param parser The XmlPullParser from which to read the set data. 879212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param endTag Name of the tag that will end the set, usually "set". 880212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param name An array of one string, used to return the name attribute 881212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * of the set's tag. 882212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 883212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @return HashSet The newly generated set. 884212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 885212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @throws XmlPullParserException 886212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @throws java.io.IOException 887212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 888212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #readSetXml 889ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 890212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 891ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner private static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name, 892ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner ReadMapCallback callback) throws XmlPullParserException, java.io.IOException { 893212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell HashSet set = new HashSet(); 894212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 895212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell int eventType = parser.getEventType(); 896212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell do { 897212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (eventType == parser.START_TAG) { 898ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner Object val = readThisValueXml(parser, name, callback); 899212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell set.add(val); 900212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell //System.out.println("Adding to set: " + val); 901212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } else if (eventType == parser.END_TAG) { 902212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (parser.getName().equals(endTag)) { 903212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return set; 904212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 905212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell throw new XmlPullParserException( 906212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell "Expected " + endTag + " end tag at: " + parser.getName()); 907212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 908212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell eventType = parser.next(); 909212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } while (eventType != parser.END_DOCUMENT); 910212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 911212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell throw new XmlPullParserException( 912212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell "Document ended before " + endTag + " end tag"); 913212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 914087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 915087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 916087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read an int[] object from an XmlPullParser. The XML data could 917087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been generated by writeIntArrayXml(). The XmlPullParser 918087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * must be positioned <em>after</em> the tag that begins the list. 919087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 920087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param parser The XmlPullParser from which to read the list data. 921087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param endTag Name of the tag that will end the list, usually "list". 922087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name An array of one string, used to return the name attribute 923087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * of the list's tag. 924087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 925087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @return Returns a newly generated int[]. 926087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 927087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 928087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 929087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final int[] readThisIntArrayXml(XmlPullParser parser, 930087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String endTag, String[] name) 931087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException { 932087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 933087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int num; 934087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor try { 935087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor num = Integer.parseInt(parser.getAttributeValue(null, "num")); 936087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } catch (NullPointerException e) { 937087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 938087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Need num attribute in byte-array"); 939087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } catch (NumberFormatException e) { 940087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 941087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Not a number in num attribute in byte-array"); 942087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 943ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.next(); 944087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 945087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int[] array = new int[num]; 946087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int i = 0; 947087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 948087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType = parser.getEventType(); 949087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor do { 950087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.START_TAG) { 951087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals("item")) { 952087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor try { 953087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor array[i] = Integer.parseInt( 954087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor parser.getAttributeValue(null, "value")); 955087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } catch (NullPointerException e) { 956087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 957087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Need value attribute in item"); 958087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } catch (NumberFormatException e) { 959087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 960087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Not a number in value attribute in item"); 961087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 962087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 963087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 964087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Expected item tag at: " + parser.getName()); 965087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 966087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.END_TAG) { 967087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals(endTag)) { 968087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return array; 969087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (parser.getName().equals("item")) { 970087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor i++; 971087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 972087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 973087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Expected " + endTag + " end tag at: " 974087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor + parser.getName()); 975087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 976087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 977087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor eventType = parser.next(); 978087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } while (eventType != parser.END_DOCUMENT); 979087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 980087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 981087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Document ended before " + endTag + " end tag"); 982087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 983087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 984087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 985ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read a long[] object from an XmlPullParser. The XML data could 986ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * previously have been generated by writeLongArrayXml(). The XmlPullParser 987ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must be positioned <em>after</em> the tag that begins the list. 988ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 989ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the list data. 990ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the list, usually "list". 991ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 992ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the list's tag. 993ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 994ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return Returns a newly generated long[]. 995ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 996ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readListXml 997ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 998ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final long[] readThisLongArrayXml(XmlPullParser parser, 999ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String endTag, String[] name) 1000ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 1001ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1002ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int num; 1003ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1004ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner num = Integer.parseInt(parser.getAttributeValue(null, "num")); 1005ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1006ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need num attribute in long-array"); 1007ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1008ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in num attribute in long-array"); 1009ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1010ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.next(); 1011ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1012ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner long[] array = new long[num]; 1013ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int i = 0; 1014ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1015ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int eventType = parser.getEventType(); 1016ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner do { 1017ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (eventType == parser.START_TAG) { 1018ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals("item")) { 1019ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1020ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner array[i] = Long.parseLong(parser.getAttributeValue(null, "value")); 1021ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1022ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need value attribute in item"); 1023ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1024ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in value attribute in item"); 1025ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1026ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1027ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected item tag at: " + parser.getName()); 1028ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1029ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (eventType == parser.END_TAG) { 1030ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals(endTag)) { 1031ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return array; 1032ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (parser.getName().equals("item")) { 1033ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner i++; 1034ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1035ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected " + endTag + " end tag at: " + 1036ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.getName()); 1037ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1038ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1039ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner eventType = parser.next(); 1040ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } while (eventType != parser.END_DOCUMENT); 1041ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1042ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Document ended before " + endTag + " end tag"); 1043ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1044ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1045ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 1046ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read a double[] object from an XmlPullParser. The XML data could 1047ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * previously have been generated by writeDoubleArrayXml(). The XmlPullParser 1048ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must be positioned <em>after</em> the tag that begins the list. 1049ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1050ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the list data. 1051ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the list, usually "double-array". 1052ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 1053ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the list's tag. 1054ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1055ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return Returns a newly generated double[]. 1056ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1057ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readListXml 1058ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 1059ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final double[] readThisDoubleArrayXml(XmlPullParser parser, String endTag, 1060ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name) throws XmlPullParserException, java.io.IOException { 1061ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1062ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int num; 1063ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1064ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner num = Integer.parseInt(parser.getAttributeValue(null, "num")); 1065ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1066ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need num attribute in double-array"); 1067ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1068ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in num attribute in double-array"); 1069ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1070ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.next(); 1071ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1072ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner double[] array = new double[num]; 1073ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int i = 0; 1074ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1075ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int eventType = parser.getEventType(); 1076ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner do { 1077ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (eventType == parser.START_TAG) { 1078ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals("item")) { 1079ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1080ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner array[i] = Double.parseDouble(parser.getAttributeValue(null, "value")); 1081ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1082ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need value attribute in item"); 1083ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1084ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in value attribute in item"); 1085ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1086ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1087ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected item tag at: " + parser.getName()); 1088ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1089ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (eventType == parser.END_TAG) { 1090ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals(endTag)) { 1091ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return array; 1092ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (parser.getName().equals("item")) { 1093ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner i++; 1094ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1095ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected " + endTag + " end tag at: " + 1096ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.getName()); 1097ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1098ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1099ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner eventType = parser.next(); 1100ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } while (eventType != parser.END_DOCUMENT); 1101ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1102ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Document ended before " + endTag + " end tag"); 1103ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1104ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1105ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 1106ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read a String[] object from an XmlPullParser. The XML data could 1107ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * previously have been generated by writeStringArrayXml(). The XmlPullParser 1108ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must be positioned <em>after</em> the tag that begins the list. 1109ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1110ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the list data. 1111ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the list, usually "string-array". 1112ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 1113ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the list's tag. 1114ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1115ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return Returns a newly generated String[]. 1116ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1117ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readListXml 1118ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 1119ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final String[] readThisStringArrayXml(XmlPullParser parser, String endTag, 1120ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name) throws XmlPullParserException, java.io.IOException { 1121ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1122ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int num; 1123ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1124ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner num = Integer.parseInt(parser.getAttributeValue(null, "num")); 1125ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1126ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need num attribute in string-array"); 1127ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1128ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in num attribute in string-array"); 1129ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1130ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.next(); 1131ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1132ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] array = new String[num]; 1133ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int i = 0; 1134ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1135ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int eventType = parser.getEventType(); 1136ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner do { 1137ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (eventType == parser.START_TAG) { 1138ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals("item")) { 1139ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1140ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner array[i] = parser.getAttributeValue(null, "value"); 1141ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1142ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need value attribute in item"); 1143ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1144ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in value attribute in item"); 1145ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1146ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1147ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected item tag at: " + parser.getName()); 1148ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1149ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (eventType == parser.END_TAG) { 1150ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals(endTag)) { 1151ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return array; 1152ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (parser.getName().equals("item")) { 1153ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner i++; 1154ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1155ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected " + endTag + " end tag at: " + 1156ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.getName()); 1157ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1158ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1159ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner eventType = parser.next(); 1160ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } while (eventType != parser.END_DOCUMENT); 1161ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1162ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Document ended before " + endTag + " end tag"); 1163ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1164ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1165ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 1166087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read a flattened object from an XmlPullParser. The XML data could 1167087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been written with writeMapXml(), writeListXml(), or 1168087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * writeValueXml(). The XmlPullParser must be positioned <em>at</em> the 1169087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * tag that defines the value. 1170087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 1171087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param parser The XmlPullParser from which to read the object. 1172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name An array of one string, used to return the name attribute 1173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * of the value's tag. 1174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 1175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @return Object The newly generated value object. 1176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 1177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readMapXml 1178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 1179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 1180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 1181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final Object readValueXml(XmlPullParser parser, String[] name) 1182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException 1183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 1184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType = parser.getEventType(); 1185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor do { 1186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.START_TAG) { 1187ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return readThisValueXml(parser, name, null); 1188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.END_TAG) { 1189087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end tag at: " + parser.getName()); 1191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.TEXT) { 1192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1193087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected text: " + parser.getText()); 1194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor eventType = parser.next(); 1196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } while (eventType != parser.END_DOCUMENT); 1197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end of document"); 1200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1202ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner private static final Object readThisValueXml(XmlPullParser parser, String[] name, 1203ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner ReadMapCallback callback) throws XmlPullParserException, java.io.IOException { 1204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final String valueName = parser.getAttributeValue(null, "name"); 1205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final String tagName = parser.getName(); 1206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName); 1208087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1209087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor Object res; 1210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (tagName.equals("null")) { 1212087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor res = null; 1213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (tagName.equals("string")) { 1214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String value = ""; 1215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType; 1216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while ((eventType = parser.next()) != parser.END_DOCUMENT) { 1217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.END_TAG) { 1218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals("string")) { 1219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor name[0] = valueName; 1220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Returning value for " + valueName + ": " + value); 1221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return value; 1222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1223087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1224087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end tag in <string>: " + parser.getName()); 1225087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.TEXT) { 1226087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor value += parser.getText(); 1227087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.START_TAG) { 1228087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1229087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected start tag in <string>: " + parser.getName()); 1230087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1231087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1232087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1233087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end of document in <string>"); 12342ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) { 12352ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko // all work already done by readThisPrimitiveValueXml 1236087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (tagName.equals("int-array")) { 1237087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor res = readThisIntArrayXml(parser, "int-array", name); 1238087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor name[0] = valueName; 1239087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Returning value for " + valueName + ": " + res); 1240087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return res; 1241ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (tagName.equals("long-array")) { 1242ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner res = readThisLongArrayXml(parser, "long-array", name); 1243ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner name[0] = valueName; 1244ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner //System.out.println("Returning value for " + valueName + ": " + res); 1245ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return res; 1246ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (tagName.equals("double-array")) { 1247ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner res = readThisDoubleArrayXml(parser, "double-array", name); 1248ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner name[0] = valueName; 1249ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner //System.out.println("Returning value for " + valueName + ": " + res); 1250ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return res; 1251ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (tagName.equals("string-array")) { 1252ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner res = readThisStringArrayXml(parser, "string-array", name); 1253ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner name[0] = valueName; 1254ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner //System.out.println("Returning value for " + valueName + ": " + res); 1255ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return res; 1256087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (tagName.equals("map")) { 1257087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor parser.next(); 1258087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor res = readThisMapXml(parser, "map", name); 1259087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor name[0] = valueName; 1260087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Returning value for " + valueName + ": " + res); 1261087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return res; 1262087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (tagName.equals("list")) { 1263087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor parser.next(); 1264087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor res = readThisListXml(parser, "list", name); 1265087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor name[0] = valueName; 1266087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Returning value for " + valueName + ": " + res); 1267087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return res; 1268212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } else if (tagName.equals("set")) { 1269212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell parser.next(); 1270212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell res = readThisSetXml(parser, "set", name); 1271212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell name[0] = valueName; 1272212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell //System.out.println("Returning value for " + valueName + ": " + res); 1273212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return res; 1274ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (callback != null) { 1275ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner res = callback.readThisUnknownObjectXml(parser, tagName); 1276ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner name[0] = valueName; 1277ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return res; 1278087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 1279ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Unknown tag: " + tagName); 1280087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1281087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1282087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // Skip through to end tag. 1283087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType; 1284087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while ((eventType = parser.next()) != parser.END_DOCUMENT) { 1285087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.END_TAG) { 1286087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals(tagName)) { 1287087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor name[0] = valueName; 1288087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Returning value for " + valueName + ": " + res); 1289087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return res; 1290087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1291087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1292087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end tag in <" + tagName + ">: " + parser.getName()); 1293087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.TEXT) { 1294087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1295087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected text in <" + tagName + ">: " + parser.getName()); 1296087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.START_TAG) { 1297087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1298087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected start tag in <" + tagName + ">: " + parser.getName()); 1299087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1300087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1301087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1302087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end of document in <" + tagName + ">"); 1303087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1304087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 13052ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko private static final Object readThisPrimitiveValueXml(XmlPullParser parser, String tagName) 13062ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko throws XmlPullParserException, java.io.IOException 13072ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko { 13082ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko try { 13092ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko if (tagName.equals("int")) { 13102ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return Integer.parseInt(parser.getAttributeValue(null, "value")); 13112ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else if (tagName.equals("long")) { 13122ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return Long.valueOf(parser.getAttributeValue(null, "value")); 13132ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else if (tagName.equals("float")) { 13142ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return new Float(parser.getAttributeValue(null, "value")); 13152ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else if (tagName.equals("double")) { 13162ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return new Double(parser.getAttributeValue(null, "value")); 13172ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else if (tagName.equals("boolean")) { 13182ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return Boolean.valueOf(parser.getAttributeValue(null, "value")); 13192ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else { 13202ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return null; 13212ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } 13222ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } catch (NullPointerException e) { 13232ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko throw new XmlPullParserException("Need value attribute in <" + tagName + ">"); 13242ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } catch (NumberFormatException e) { 13252ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko throw new XmlPullParserException( 13262ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko "Not a number in value attribute in <" + tagName + ">"); 13272ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } 13282ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } 13292ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko 1330087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException 1331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 1332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int type; 1333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while ((type=parser.next()) != parser.START_TAG 1334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor && type != parser.END_DOCUMENT) { 1335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor ; 1336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (type != parser.START_TAG) { 1339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException("No start tag found"); 1340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1341087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1342087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (!parser.getName().equals(firstElementName)) { 1343087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() + 1344087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor ", expected " + firstElementName); 1345087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1346087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1347087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1348087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException 1349087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 1350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int type; 1351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while ((type=parser.next()) != parser.START_TAG 1352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor && type != parser.END_DOCUMENT) { 1353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor ; 1354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1356a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown 1357a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown public static boolean nextElementWithin(XmlPullParser parser, int outerDepth) 1358a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown throws IOException, XmlPullParserException { 1359a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown for (;;) { 1360a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown int type = parser.next(); 1361a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown if (type == XmlPullParser.END_DOCUMENT 1362a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) { 1363a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown return false; 1364a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown } 1365a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown if (type == XmlPullParser.START_TAG 1366a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown && parser.getDepth() == outerDepth + 1) { 1367a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown return true; 1368a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown } 1369a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown } 1370a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown } 1371ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 1372d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot public static int readIntAttribute(XmlPullParser in, String name, int defaultValue) { 1373d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot final String value = in.getAttributeValue(null, name); 1374d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot try { 1375d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot return Integer.parseInt(value); 1376d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot } catch (NumberFormatException e) { 1377d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot return defaultValue; 1378d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot } 1379d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot } 1380d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot 1381ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static int readIntAttribute(XmlPullParser in, String name) throws IOException { 1382ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey final String value = in.getAttributeValue(null, name); 1383ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey try { 1384ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey return Integer.parseInt(value); 1385ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } catch (NumberFormatException e) { 1386ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey throw new ProtocolException("problem parsing " + name + "=" + value + " as int"); 1387ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1388ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1389ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 1390ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static void writeIntAttribute(XmlSerializer out, String name, int value) 1391ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey throws IOException { 1392ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey out.attribute(null, name, Integer.toString(value)); 1393ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1394ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 1395e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey public static long readLongAttribute(XmlPullParser in, String name, long defaultValue) { 1396e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey final String value = in.getAttributeValue(null, name); 1397e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey try { 1398e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey return Long.parseLong(value); 1399e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey } catch (NumberFormatException e) { 1400e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey return defaultValue; 1401e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey } 1402e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey } 1403e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey 1404ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static long readLongAttribute(XmlPullParser in, String name) throws IOException { 1405ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey final String value = in.getAttributeValue(null, name); 1406ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey try { 1407ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey return Long.parseLong(value); 1408ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } catch (NumberFormatException e) { 1409ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey throw new ProtocolException("problem parsing " + name + "=" + value + " as long"); 1410ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1411ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1412ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 1413ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static void writeLongAttribute(XmlSerializer out, String name, long value) 1414ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey throws IOException { 1415ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey out.attribute(null, name, Long.toString(value)); 1416ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1417ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 1418ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static boolean readBooleanAttribute(XmlPullParser in, String name) { 1419ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey final String value = in.getAttributeValue(null, name); 1420ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey return Boolean.parseBoolean(value); 1421ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1422ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 1423ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static void writeBooleanAttribute(XmlSerializer out, String name, boolean value) 1424ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey throws IOException { 1425ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey out.attribute(null, name, Boolean.toString(value)); 1426ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1427ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1428ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** @hide */ 1429ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public interface WriteMapCallback { 1430ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 1431ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Called from writeMapXml when an Object type is not recognized. The implementer 1432ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must write out the entire element including start and end tags. 1433ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1434ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param v The object to be written out 1435ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name The mapping key for v. Must be written into the "name" attribute of the 1436ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * start tag. 1437ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out The XML output stream. 1438ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws XmlPullParserException on unrecognized Object type. 1439ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws IOException on XmlSerializer serialization errors. 1440ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 1441ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 1442ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public void writeUnknownObject(Object v, String name, XmlSerializer out) 1443ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, IOException; 1444ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1445ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1446ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** @hide */ 1447ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public interface ReadMapCallback { 1448ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 1449ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Called from readThisMapXml when a START_TAG is not recognized. The input stream 1450ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * is positioned within the start tag so that attributes can be read using in.getAttribute. 1451ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1452ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param in the XML input stream 1453ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param tag the START_TAG that was not recognized. 1454ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return the Object parsed from the stream which will be put into the map. 1455ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws XmlPullParserException if the START_TAG is not recognized. 1456ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws IOException on XmlPullParser serialization errors. 1457ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 1458ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 1459ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public Object readThisUnknownObjectXml(XmlPullParser in, String tag) 1460ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, IOException; 1461ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1462087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor} 1463