/_libs/HoloEverywhere/src/org/holoeverywhere/util/XmlUtils.java

https://bitbucket.org/tiwiz/sharetovoid · Java · 658 lines · 567 code · 85 blank · 6 comment · 220 complexity · 26f97cce003f4d4e5e5991a03bd12ff2 MD5 · raw file

  1. package org.holoeverywhere.util;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.HashSet;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Set;
  12. import org.xmlpull.v1.XmlPullParser;
  13. import org.xmlpull.v1.XmlPullParserException;
  14. import org.xmlpull.v1.XmlSerializer;
  15. import android.util.Xml;
  16. @SuppressWarnings({
  17. "rawtypes", "unchecked"
  18. })
  19. public class XmlUtils {
  20. public static final void beginDocument(XmlPullParser parser,
  21. String firstElementName) throws XmlPullParserException, IOException {
  22. int type;
  23. while ((type = parser.next()) != XmlPullParser.START_TAG
  24. && type != XmlPullParser.END_DOCUMENT) {
  25. ;
  26. }
  27. if (type != XmlPullParser.START_TAG) {
  28. throw new XmlPullParserException("No start tag found");
  29. }
  30. if (!parser.getName().equals(firstElementName)) {
  31. throw new XmlPullParserException("Unexpected start tag: found "
  32. + parser.getName() + ", expected " + firstElementName);
  33. }
  34. }
  35. public static final boolean convertValueToBoolean(CharSequence value,
  36. boolean defaultValue) {
  37. boolean result = false;
  38. if (null == value) {
  39. return defaultValue;
  40. }
  41. if (value.equals("1") || value.equals("true") || value.equals("TRUE")) {
  42. result = true;
  43. }
  44. return result;
  45. }
  46. public static final int convertValueToInt(CharSequence charSeq,
  47. int defaultValue) {
  48. if (null == charSeq) {
  49. return defaultValue;
  50. }
  51. String nm = charSeq.toString();
  52. int sign = 1;
  53. int index = 0;
  54. int len = nm.length();
  55. int base = 10;
  56. if ('-' == nm.charAt(0)) {
  57. sign = -1;
  58. index++;
  59. }
  60. if ('0' == nm.charAt(index)) {
  61. // Quick check for a zero by itself
  62. if (index == len - 1) {
  63. return 0;
  64. }
  65. char c = nm.charAt(index + 1);
  66. if ('x' == c || 'X' == c) {
  67. index += 2;
  68. base = 16;
  69. } else {
  70. index++;
  71. base = 8;
  72. }
  73. } else if ('#' == nm.charAt(index)) {
  74. index++;
  75. base = 16;
  76. }
  77. return Integer.parseInt(nm.substring(index), base) * sign;
  78. }
  79. public static final int convertValueToList(CharSequence value,
  80. String[] options, int defaultValue) {
  81. if (null != value) {
  82. for (int i = 0; i < options.length; i++) {
  83. if (value.equals(options[i])) {
  84. return i;
  85. }
  86. }
  87. }
  88. return defaultValue;
  89. }
  90. public static final int convertValueToUnsignedInt(String value,
  91. int defaultValue) {
  92. if (null == value) {
  93. return defaultValue;
  94. }
  95. return XmlUtils.parseUnsignedIntAttribute(value);
  96. }
  97. public static final void nextElement(XmlPullParser parser)
  98. throws XmlPullParserException, IOException {
  99. int type;
  100. while ((type = parser.next()) != XmlPullParser.START_TAG
  101. && type != XmlPullParser.END_DOCUMENT) {
  102. ;
  103. }
  104. }
  105. public static boolean nextElementWithin(XmlPullParser parser, int outerDepth)
  106. throws IOException, XmlPullParserException {
  107. for (;;) {
  108. int type = parser.next();
  109. if (type == XmlPullParser.END_DOCUMENT
  110. || type == XmlPullParser.END_TAG
  111. && parser.getDepth() == outerDepth) {
  112. return false;
  113. }
  114. if (type == XmlPullParser.START_TAG
  115. && parser.getDepth() == outerDepth + 1) {
  116. return true;
  117. }
  118. }
  119. }
  120. public static final int parseUnsignedIntAttribute(CharSequence charSeq) {
  121. String value = charSeq.toString();
  122. int index = 0;
  123. int len = value.length();
  124. int base = 10;
  125. if ('0' == value.charAt(index)) {
  126. // Quick check for zero by itself
  127. if (index == len - 1) {
  128. return 0;
  129. }
  130. char c = value.charAt(index + 1);
  131. if ('x' == c || 'X' == c) { // check for hex
  132. index += 2;
  133. base = 16;
  134. } else { // check for octal
  135. index++;
  136. base = 8;
  137. }
  138. } else if ('#' == value.charAt(index)) {
  139. index++;
  140. base = 16;
  141. }
  142. return (int) Long.parseLong(value.substring(index), base);
  143. }
  144. public static final ArrayList readListXml(InputStream in)
  145. throws XmlPullParserException, java.io.IOException {
  146. XmlPullParser parser = Xml.newPullParser();
  147. parser.setInput(in, null);
  148. return (ArrayList) XmlUtils.readValueXml(parser, new String[1]);
  149. }
  150. public static final HashMap readMapXml(InputStream in)
  151. throws XmlPullParserException, java.io.IOException {
  152. XmlPullParser parser = Xml.newPullParser();
  153. parser.setInput(in, null);
  154. return (HashMap) XmlUtils.readValueXml(parser, new String[1]);
  155. }
  156. public static final HashSet readSetXml(InputStream in)
  157. throws XmlPullParserException, java.io.IOException {
  158. XmlPullParser parser = Xml.newPullParser();
  159. parser.setInput(in, null);
  160. return (HashSet) XmlUtils.readValueXml(parser, new String[1]);
  161. }
  162. public static final int[] readThisIntArrayXml(XmlPullParser parser,
  163. String endTag, String[] name) throws XmlPullParserException,
  164. java.io.IOException {
  165. int num;
  166. try {
  167. num = Integer.parseInt(parser.getAttributeValue(null, "num"));
  168. } catch (NullPointerException e) {
  169. throw new XmlPullParserException("Need num attribute in byte-array");
  170. } catch (NumberFormatException e) {
  171. throw new XmlPullParserException(
  172. "Not a number in num attribute in byte-array");
  173. }
  174. int[] array = new int[num];
  175. int i = 0;
  176. int eventType = parser.getEventType();
  177. do {
  178. if (eventType == XmlPullParser.START_TAG) {
  179. if (parser.getName().equals("item")) {
  180. try {
  181. array[i] = Integer.parseInt(parser.getAttributeValue(
  182. null, "value"));
  183. } catch (NullPointerException e) {
  184. throw new XmlPullParserException(
  185. "Need value attribute in item");
  186. } catch (NumberFormatException e) {
  187. throw new XmlPullParserException(
  188. "Not a number in value attribute in item");
  189. }
  190. } else {
  191. throw new XmlPullParserException("Expected item tag at: "
  192. + parser.getName());
  193. }
  194. } else if (eventType == XmlPullParser.END_TAG) {
  195. if (parser.getName().equals(endTag)) {
  196. return array;
  197. } else if (parser.getName().equals("item")) {
  198. i++;
  199. } else {
  200. throw new XmlPullParserException("Expected " + endTag
  201. + " end tag at: " + parser.getName());
  202. }
  203. }
  204. eventType = parser.next();
  205. } while (eventType != XmlPullParser.END_DOCUMENT);
  206. throw new XmlPullParserException("Document ended before " + endTag
  207. + " end tag");
  208. }
  209. public static final ArrayList readThisListXml(XmlPullParser parser,
  210. String endTag, String[] name) throws XmlPullParserException,
  211. java.io.IOException {
  212. ArrayList list = new ArrayList();
  213. int eventType = parser.getEventType();
  214. do {
  215. if (eventType == XmlPullParser.START_TAG) {
  216. Object val = XmlUtils.readThisValueXml(parser, name);
  217. list.add(val);
  218. // System.out.println("Adding to list: " + val);
  219. } else if (eventType == XmlPullParser.END_TAG) {
  220. if (parser.getName().equals(endTag)) {
  221. return list;
  222. }
  223. throw new XmlPullParserException("Expected " + endTag
  224. + " end tag at: " + parser.getName());
  225. }
  226. eventType = parser.next();
  227. } while (eventType != XmlPullParser.END_DOCUMENT);
  228. throw new XmlPullParserException("Document ended before " + endTag
  229. + " end tag");
  230. }
  231. public static final HashMap readThisMapXml(XmlPullParser parser,
  232. String endTag, String[] name) throws XmlPullParserException,
  233. java.io.IOException {
  234. HashMap map = new HashMap();
  235. int eventType = parser.getEventType();
  236. do {
  237. if (eventType == XmlPullParser.START_TAG) {
  238. Object val = XmlUtils.readThisValueXml(parser, name);
  239. if (name[0] != null) {
  240. map.put(name[0], val);
  241. } else {
  242. throw new XmlPullParserException(
  243. "Map value without name attribute: "
  244. + parser.getName());
  245. }
  246. } else if (eventType == XmlPullParser.END_TAG) {
  247. if (parser.getName().equals(endTag)) {
  248. return map;
  249. }
  250. throw new XmlPullParserException("Expected " + endTag
  251. + " end tag at: " + parser.getName());
  252. }
  253. eventType = parser.next();
  254. } while (eventType != XmlPullParser.END_DOCUMENT);
  255. throw new XmlPullParserException("Document ended before " + endTag
  256. + " end tag");
  257. }
  258. public static final HashSet readThisSetXml(XmlPullParser parser,
  259. String endTag, String[] name) throws XmlPullParserException,
  260. java.io.IOException {
  261. HashSet set = new HashSet();
  262. int eventType = parser.getEventType();
  263. do {
  264. if (eventType == XmlPullParser.START_TAG) {
  265. Object val = XmlUtils.readThisValueXml(parser, name);
  266. set.add(val);
  267. // System.out.println("Adding to set: " + val);
  268. } else if (eventType == XmlPullParser.END_TAG) {
  269. if (parser.getName().equals(endTag)) {
  270. return set;
  271. }
  272. throw new XmlPullParserException("Expected " + endTag
  273. + " end tag at: " + parser.getName());
  274. }
  275. eventType = parser.next();
  276. } while (eventType != XmlPullParser.END_DOCUMENT);
  277. throw new XmlPullParserException("Document ended before " + endTag
  278. + " end tag");
  279. }
  280. private static final Object readThisValueXml(XmlPullParser parser,
  281. String[] name) throws XmlPullParserException, java.io.IOException {
  282. final String valueName = parser.getAttributeValue(null, "name");
  283. final String tagName = parser.getName();
  284. Object res;
  285. if (tagName.equals("null")) {
  286. res = null;
  287. } else if (tagName.equals("string")) {
  288. String value = "";
  289. int eventType;
  290. while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) {
  291. if (eventType == XmlPullParser.END_TAG) {
  292. if (parser.getName().equals("string")) {
  293. name[0] = valueName;
  294. // System.out.println("Returning value for " + valueName
  295. // + ": " + value);
  296. return value;
  297. }
  298. throw new XmlPullParserException(
  299. "Unexpected end tag in <string>: "
  300. + parser.getName());
  301. } else if (eventType == XmlPullParser.TEXT) {
  302. value += parser.getText();
  303. } else if (eventType == XmlPullParser.START_TAG) {
  304. throw new XmlPullParserException(
  305. "Unexpected start tag in <string>: "
  306. + parser.getName());
  307. }
  308. }
  309. throw new XmlPullParserException(
  310. "Unexpected end of document in <string>");
  311. } else if (tagName.equals("int")) {
  312. res = Integer.parseInt(parser.getAttributeValue(null, "value"));
  313. } else if (tagName.equals("long")) {
  314. res = Long.valueOf(parser.getAttributeValue(null, "value"));
  315. } else if (tagName.equals("float")) {
  316. res = Float.valueOf(parser.getAttributeValue(null, "value"));
  317. } else if (tagName.equals("double")) {
  318. res = Double.valueOf(parser.getAttributeValue(null, "value"));
  319. } else if (tagName.equals("boolean")) {
  320. res = Boolean.valueOf(parser.getAttributeValue(null, "value"));
  321. } else if (tagName.equals("int-array")) {
  322. parser.next();
  323. res = XmlUtils.readThisIntArrayXml(parser, "int-array", name);
  324. name[0] = valueName;
  325. return res;
  326. } else if (tagName.equals("map")) {
  327. parser.next();
  328. res = XmlUtils.readThisMapXml(parser, "map", name);
  329. name[0] = valueName;
  330. return res;
  331. } else if (tagName.equals("list")) {
  332. parser.next();
  333. res = XmlUtils.readThisListXml(parser, "list", name);
  334. name[0] = valueName;
  335. return res;
  336. } else if (tagName.equals("set")) {
  337. parser.next();
  338. res = XmlUtils.readThisSetXml(parser, "set", name);
  339. name[0] = valueName;
  340. return res;
  341. } else {
  342. throw new XmlPullParserException("Unknown tag: " + tagName);
  343. }
  344. int eventType;
  345. while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) {
  346. if (eventType == XmlPullParser.END_TAG) {
  347. if (parser.getName().equals(tagName)) {
  348. name[0] = valueName;
  349. return res;
  350. }
  351. throw new XmlPullParserException("Unexpected end tag in <"
  352. + tagName + ">: " + parser.getName());
  353. } else if (eventType == XmlPullParser.TEXT) {
  354. throw new XmlPullParserException("Unexpected text in <"
  355. + tagName + ">: " + parser.getName());
  356. } else if (eventType == XmlPullParser.START_TAG) {
  357. throw new XmlPullParserException("Unexpected start tag in <"
  358. + tagName + ">: " + parser.getName());
  359. }
  360. }
  361. throw new XmlPullParserException("Unexpected end of document in <"
  362. + tagName + ">");
  363. }
  364. public static final Object readValueXml(XmlPullParser parser, String[] name)
  365. throws XmlPullParserException, java.io.IOException {
  366. int eventType = parser.getEventType();
  367. do {
  368. if (eventType == XmlPullParser.START_TAG) {
  369. return XmlUtils.readThisValueXml(parser, name);
  370. } else if (eventType == XmlPullParser.END_TAG) {
  371. throw new XmlPullParserException("Unexpected end tag at: "
  372. + parser.getName());
  373. } else if (eventType == XmlPullParser.TEXT) {
  374. throw new XmlPullParserException("Unexpected text: "
  375. + parser.getText());
  376. }
  377. eventType = parser.next();
  378. } while (eventType != XmlPullParser.END_DOCUMENT);
  379. throw new XmlPullParserException("Unexpected end of document");
  380. }
  381. public static void skipCurrentTag(XmlPullParser parser)
  382. throws XmlPullParserException, IOException {
  383. int outerDepth = parser.getDepth();
  384. int type;
  385. while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
  386. && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
  387. }
  388. }
  389. public static final void writeByteArrayXml(byte[] val, String name,
  390. XmlSerializer out) throws XmlPullParserException,
  391. java.io.IOException {
  392. if (val == null) {
  393. out.startTag(null, "null");
  394. out.endTag(null, "null");
  395. return;
  396. }
  397. out.startTag(null, "byte-array");
  398. if (name != null) {
  399. out.attribute(null, "name", name);
  400. }
  401. final int N = val.length;
  402. out.attribute(null, "num", Integer.toString(N));
  403. StringBuilder sb = new StringBuilder(val.length * 2);
  404. for (int i = 0; i < N; i++) {
  405. int b = val[i];
  406. int h = b >> 4;
  407. sb.append(h >= 10 ? 'a' + h - 10 : '0' + h);
  408. h = b & 0xff;
  409. sb.append(h >= 10 ? 'a' + h - 10 : '0' + h);
  410. }
  411. out.text(sb.toString());
  412. out.endTag(null, "byte-array");
  413. }
  414. public static final void writeIntArrayXml(int[] val, String name,
  415. XmlSerializer out) throws XmlPullParserException,
  416. java.io.IOException {
  417. if (val == null) {
  418. out.startTag(null, "null");
  419. out.endTag(null, "null");
  420. return;
  421. }
  422. out.startTag(null, "int-array");
  423. if (name != null) {
  424. out.attribute(null, "name", name);
  425. }
  426. final int N = val.length;
  427. out.attribute(null, "num", Integer.toString(N));
  428. for (int i = 0; i < N; i++) {
  429. out.startTag(null, "item");
  430. out.attribute(null, "value", Integer.toString(val[i]));
  431. out.endTag(null, "item");
  432. }
  433. out.endTag(null, "int-array");
  434. }
  435. public static final void writeListXml(List val, OutputStream out)
  436. throws XmlPullParserException, java.io.IOException {
  437. XmlSerializer serializer = Xml.newSerializer();
  438. serializer.setOutput(out, "utf-8");
  439. serializer.startDocument(null, true);
  440. serializer.setFeature(
  441. "http://xmlpull.org/v1/doc/features.html#indent-output", true);
  442. XmlUtils.writeListXml(val, null, serializer);
  443. serializer.endDocument();
  444. }
  445. public static final void writeListXml(List val, String name,
  446. XmlSerializer out) throws XmlPullParserException,
  447. java.io.IOException {
  448. if (val == null) {
  449. out.startTag(null, "null");
  450. out.endTag(null, "null");
  451. return;
  452. }
  453. out.startTag(null, "list");
  454. if (name != null) {
  455. out.attribute(null, "name", name);
  456. }
  457. int N = val.size();
  458. int i = 0;
  459. while (i < N) {
  460. XmlUtils.writeValueXml(val.get(i), null, out);
  461. i++;
  462. }
  463. out.endTag(null, "list");
  464. }
  465. public static final void writeMapXml(Map val, OutputStream out)
  466. throws XmlPullParserException, java.io.IOException {
  467. XmlSerializer serializer = new FastXmlSerializer();
  468. serializer.setOutput(out, "utf-8");
  469. serializer.startDocument(null, true);
  470. serializer.setFeature(
  471. "http://xmlpull.org/v1/doc/features.html#indent-output", true);
  472. XmlUtils.writeMapXml(val, null, serializer);
  473. serializer.endDocument();
  474. }
  475. public static final void writeMapXml(Map val, String name, XmlSerializer out)
  476. throws XmlPullParserException, java.io.IOException {
  477. if (val == null) {
  478. out.startTag(null, "null");
  479. out.endTag(null, "null");
  480. return;
  481. }
  482. Set s = val.entrySet();
  483. Iterator i = s.iterator();
  484. out.startTag(null, "map");
  485. if (name != null) {
  486. out.attribute(null, "name", name);
  487. }
  488. while (i.hasNext()) {
  489. Map.Entry e = (Map.Entry) i.next();
  490. XmlUtils.writeValueXml(e.getValue(), (String) e.getKey(), out);
  491. }
  492. out.endTag(null, "map");
  493. }
  494. public static final void writeSetXml(Set val, String name, XmlSerializer out)
  495. throws XmlPullParserException, java.io.IOException {
  496. if (val == null) {
  497. out.startTag(null, "null");
  498. out.endTag(null, "null");
  499. return;
  500. }
  501. out.startTag(null, "set");
  502. if (name != null) {
  503. out.attribute(null, "name", name);
  504. }
  505. for (Object v : val) {
  506. XmlUtils.writeValueXml(v, null, out);
  507. }
  508. out.endTag(null, "set");
  509. }
  510. public static final void writeValueXml(Object v, String name,
  511. XmlSerializer out) throws XmlPullParserException,
  512. java.io.IOException {
  513. String typeStr;
  514. if (v == null) {
  515. out.startTag(null, "null");
  516. if (name != null) {
  517. out.attribute(null, "name", name);
  518. }
  519. out.endTag(null, "null");
  520. return;
  521. } else if (v instanceof String) {
  522. out.startTag(null, "string");
  523. if (name != null) {
  524. out.attribute(null, "name", name);
  525. }
  526. out.text(v.toString());
  527. out.endTag(null, "string");
  528. return;
  529. } else if (v instanceof Integer) {
  530. typeStr = "int";
  531. } else if (v instanceof Long) {
  532. typeStr = "long";
  533. } else if (v instanceof Float) {
  534. typeStr = "float";
  535. } else if (v instanceof Double) {
  536. typeStr = "double";
  537. } else if (v instanceof Boolean) {
  538. typeStr = "boolean";
  539. } else if (v instanceof byte[]) {
  540. XmlUtils.writeByteArrayXml((byte[]) v, name, out);
  541. return;
  542. } else if (v instanceof int[]) {
  543. XmlUtils.writeIntArrayXml((int[]) v, name, out);
  544. return;
  545. } else if (v instanceof Map) {
  546. XmlUtils.writeMapXml((Map) v, name, out);
  547. return;
  548. } else if (v instanceof List) {
  549. XmlUtils.writeListXml((List) v, name, out);
  550. return;
  551. } else if (v instanceof Set) {
  552. XmlUtils.writeSetXml((Set) v, name, out);
  553. return;
  554. } else if (v instanceof CharSequence) {
  555. out.startTag(null, "string");
  556. if (name != null) {
  557. out.attribute(null, "name", name);
  558. }
  559. out.text(v.toString());
  560. out.endTag(null, "string");
  561. return;
  562. } else {
  563. throw new RuntimeException("writeValueXml: unable to write value "
  564. + v);
  565. }
  566. out.startTag(null, typeStr);
  567. if (name != null) {
  568. out.attribute(null, "name", name);
  569. }
  570. out.attribute(null, "value", v.toString());
  571. out.endTag(null, typeStr);
  572. }
  573. }