You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UIDL.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. /*
  2. @ITMillApache2LicenseForJavaFiles@
  3. */
  4. package com.itmill.toolkit.terminal.gwt.client;
  5. import java.util.HashSet;
  6. import java.util.Iterator;
  7. import java.util.Set;
  8. import com.google.gwt.json.client.JSONArray;
  9. import com.google.gwt.json.client.JSONBoolean;
  10. import com.google.gwt.json.client.JSONNumber;
  11. import com.google.gwt.json.client.JSONObject;
  12. import com.google.gwt.json.client.JSONString;
  13. import com.google.gwt.json.client.JSONValue;
  14. import com.google.gwt.user.client.DOM;
  15. import com.google.gwt.user.client.ui.Tree;
  16. import com.google.gwt.user.client.ui.TreeItem;
  17. import com.google.gwt.user.client.ui.TreeListener;
  18. public class UIDL {
  19. JSONArray json;
  20. public UIDL(JSONArray json) {
  21. this.json = json;
  22. }
  23. public String getId() {
  24. final JSONValue val = ((JSONObject) json.get(1)).get("id");
  25. if (val == null) {
  26. return null;
  27. }
  28. return ((JSONString) val).stringValue();
  29. }
  30. public String getTag() {
  31. return ((JSONString) json.get(0)).stringValue();
  32. }
  33. public String getStringAttribute(String name) {
  34. final JSONValue val = ((JSONObject) json.get(1)).get(name);
  35. if (val == null) {
  36. return null;
  37. }
  38. return ((JSONString) val).stringValue();
  39. }
  40. public Set getAttributeNames() {
  41. final HashSet attrs = new HashSet(((JSONObject) json.get(1)).keySet());
  42. attrs.remove("v");
  43. return attrs;
  44. }
  45. public int getIntAttribute(String name) {
  46. final JSONValue val = ((JSONObject) json.get(1)).get(name);
  47. if (val == null) {
  48. return 0;
  49. }
  50. final double num = ((JSONNumber) val).getValue();
  51. return (int) num;
  52. }
  53. public long getLongAttribute(String name) {
  54. final JSONValue val = ((JSONObject) json.get(1)).get(name);
  55. if (val == null) {
  56. return 0;
  57. }
  58. final double num = ((JSONNumber) val).getValue();
  59. return (long) num;
  60. }
  61. public float getFloatAttribute(String name) {
  62. final JSONValue val = ((JSONObject) json.get(1)).get(name);
  63. if (val == null) {
  64. return 0;
  65. }
  66. final double num = ((JSONNumber) val).getValue();
  67. return (float) num;
  68. }
  69. public double getDoubleAttribute(String name) {
  70. final JSONValue val = ((JSONObject) json.get(1)).get(name);
  71. if (val == null) {
  72. return 0;
  73. }
  74. final double num = ((JSONNumber) val).getValue();
  75. return num;
  76. }
  77. public boolean getBooleanAttribute(String name) {
  78. final JSONValue val = ((JSONObject) json.get(1)).get(name);
  79. if (val == null) {
  80. return false;
  81. }
  82. return ((JSONBoolean) val).booleanValue();
  83. }
  84. public String[] getStringArrayAttribute(String name) {
  85. final JSONArray a = (JSONArray) ((JSONObject) json.get(1)).get(name);
  86. final String[] s = new String[a.size()];
  87. for (int i = 0; i < a.size(); i++) {
  88. s[i] = ((JSONString) a.get(i)).stringValue();
  89. }
  90. return s;
  91. }
  92. public int[] getIntArrayAttribute(String name) {
  93. final JSONArray a = (JSONArray) ((JSONObject) json.get(1)).get(name);
  94. final int[] s = new int[a.size()];
  95. for (int i = 0; i < a.size(); i++) {
  96. s[i] = Integer.parseInt(((JSONString) a.get(i)).stringValue());
  97. }
  98. return s;
  99. }
  100. public HashSet getStringArrayAttributeAsSet(String string) {
  101. final JSONArray a = getArrayVariable(string);
  102. final HashSet s = new HashSet();
  103. for (int i = 0; i < a.size(); i++) {
  104. s.add(((JSONString) a.get(i)).stringValue());
  105. }
  106. return s;
  107. }
  108. /**
  109. * Get attributes value as string whateever the type is
  110. *
  111. * @param name
  112. * @return string presentation of attribute
  113. */
  114. private String getAttribute(String name) {
  115. return json.get(1).isObject().get(name).toString();
  116. }
  117. public boolean hasAttribute(String name) {
  118. return ((JSONObject) json.get(1)).get(name) != null;
  119. }
  120. public UIDL getChildUIDL(int i) {
  121. final JSONValue c = json.get(i + 2);
  122. if (c == null) {
  123. return null;
  124. }
  125. if (c.isArray() != null) {
  126. return new UIDL(c.isArray());
  127. }
  128. throw new IllegalStateException("Child node " + i
  129. + " is not of type UIDL");
  130. }
  131. public String getChildString(int i) {
  132. final JSONValue c = json.get(i + 2);
  133. if (c.isString() != null) {
  134. return ((JSONString) c).stringValue();
  135. }
  136. throw new IllegalStateException("Child node " + i
  137. + " is not of type String");
  138. }
  139. public Iterator getChildIterator() {
  140. return new Iterator() {
  141. int index = 2;
  142. public void remove() {
  143. throw new UnsupportedOperationException();
  144. }
  145. public Object next() {
  146. if (json.size() > index) {
  147. final JSONValue c = json.get(index++);
  148. if (c.isString() != null) {
  149. return c.isString().stringValue();
  150. } else if (c.isArray() != null) {
  151. return new UIDL(c.isArray());
  152. } else if (c.isObject() != null) {
  153. return new XML(c.isObject());
  154. } else {
  155. throw new IllegalStateException("Illegal child " + c
  156. + " in tag " + getTag() + " at index " + index);
  157. }
  158. }
  159. return null;
  160. }
  161. public boolean hasNext() {
  162. return json.size() > index;
  163. }
  164. };
  165. }
  166. public int getNumberOfChildren() {
  167. return json.size() - 2;
  168. }
  169. public String toString() {
  170. String s = "<" + getTag();
  171. for (final Iterator i = getAttributeNames().iterator(); i.hasNext();) {
  172. final String name = i.next().toString();
  173. s += " " + name + "=";
  174. final JSONValue v = ((JSONObject) json.get(1)).get(name);
  175. if (v.isString() != null) {
  176. s += v;
  177. } else {
  178. s += "\"" + v + "\"";
  179. }
  180. }
  181. s += ">\n";
  182. final Iterator i = getChildIterator();
  183. while (i.hasNext()) {
  184. final Object c = i.next();
  185. s += c.toString();
  186. }
  187. s += "</" + getTag() + ">\n";
  188. return s;
  189. }
  190. public String getChildrenAsXML() {
  191. String s = "";
  192. final Iterator i = getChildIterator();
  193. while (i.hasNext()) {
  194. final Object c = i.next();
  195. s += c.toString();
  196. }
  197. return s;
  198. }
  199. public UIDLBrowser print_r() {
  200. return new UIDLBrowser();
  201. }
  202. private class UIDLBrowser extends Tree {
  203. public UIDLBrowser() {
  204. DOM.setStyleAttribute(getElement(), "position", "");
  205. final TreeItem root = new TreeItem(getTag());
  206. addItem(root);
  207. root.addItem("");
  208. addTreeListener(new TreeListener() {
  209. public void onTreeItemStateChanged(TreeItem item) {
  210. if (item == root) {
  211. removeItem(root);
  212. UIDLBrowser.this.removeTreeListener(this);
  213. addItem(dir());
  214. final Iterator it = treeItemIterator();
  215. while (it.hasNext()) {
  216. ((TreeItem) it.next()).setState(true);
  217. }
  218. }
  219. }
  220. public void onTreeItemSelected(TreeItem item) {
  221. }
  222. });
  223. }
  224. protected boolean isKeyboardNavigationEnabled(TreeItem currentItem) {
  225. return false;
  226. }
  227. }
  228. public TreeItem dir() {
  229. String nodeName = getTag();
  230. for (final Iterator i = getAttributeNames().iterator(); i.hasNext();) {
  231. final String name = i.next().toString();
  232. final String value = getAttribute(name);
  233. nodeName += " " + name + "=" + value;
  234. }
  235. final TreeItem item = new TreeItem(nodeName);
  236. try {
  237. TreeItem tmp = null;
  238. for (final Iterator i = getVariableHash().keySet().iterator(); i
  239. .hasNext();) {
  240. final String name = i.next().toString();
  241. String value = "";
  242. try {
  243. value = getStringVariable(name);
  244. } catch (final Exception e) {
  245. try {
  246. final JSONArray a = getArrayVariable(name);
  247. value = a.toString();
  248. } catch (final Exception e2) {
  249. try {
  250. final int intVal = getIntVariable(name);
  251. value = String.valueOf(intVal);
  252. } catch (final Exception e3) {
  253. value = "unknown";
  254. }
  255. }
  256. }
  257. if (tmp == null) {
  258. tmp = new TreeItem("variables");
  259. }
  260. tmp.addItem(name + "=" + value);
  261. }
  262. if (tmp != null) {
  263. item.addItem(tmp);
  264. }
  265. } catch (final Exception e) {
  266. // Ingonered, no variables
  267. }
  268. final Iterator i = getChildIterator();
  269. while (i.hasNext()) {
  270. final Object child = i.next();
  271. try {
  272. final UIDL c = (UIDL) child;
  273. item.addItem(c.dir());
  274. } catch (final Exception e) {
  275. item.addItem(child.toString());
  276. }
  277. }
  278. return item;
  279. }
  280. private JSONObject getVariableHash() {
  281. final JSONObject v = (JSONObject) ((JSONObject) json.get(1)).get("v");
  282. if (v == null) {
  283. throw new IllegalArgumentException("No variables defined in tag.");
  284. }
  285. return v;
  286. }
  287. public boolean hasVariable(String name) {
  288. Object v = null;
  289. try {
  290. v = getVariableHash().get(name);
  291. } catch (final IllegalArgumentException e) {
  292. }
  293. return v != null;
  294. }
  295. public String getStringVariable(String name) {
  296. final JSONString t = (JSONString) getVariableHash().get(name);
  297. if (t == null) {
  298. throw new IllegalArgumentException("No such variable: " + name);
  299. }
  300. return t.stringValue();
  301. }
  302. public int getIntVariable(String name) {
  303. final JSONNumber t = (JSONNumber) getVariableHash().get(name);
  304. if (t == null) {
  305. throw new IllegalArgumentException("No such variable: " + name);
  306. }
  307. return (int) t.getValue();
  308. }
  309. public long getLongVariable(String name) {
  310. final JSONNumber t = (JSONNumber) getVariableHash().get(name);
  311. if (t == null) {
  312. throw new IllegalArgumentException("No such variable: " + name);
  313. }
  314. return (long) t.getValue();
  315. }
  316. public float getFloatVariable(String name) {
  317. final JSONNumber t = (JSONNumber) getVariableHash().get(name);
  318. if (t == null) {
  319. throw new IllegalArgumentException("No such variable: " + name);
  320. }
  321. return (float) t.getValue();
  322. }
  323. public double getDoubleVariable(String name) {
  324. final JSONNumber t = (JSONNumber) getVariableHash().get(name);
  325. if (t == null) {
  326. throw new IllegalArgumentException("No such variable: " + name);
  327. }
  328. return t.getValue();
  329. }
  330. public boolean getBooleanVariable(String name) {
  331. final JSONBoolean t = (JSONBoolean) getVariableHash().get(name);
  332. if (t == null) {
  333. throw new IllegalArgumentException("No such variable: " + name);
  334. }
  335. return t.booleanValue();
  336. }
  337. private JSONArray getArrayVariable(String name) {
  338. final JSONArray t = (JSONArray) getVariableHash().get(name);
  339. if (t == null) {
  340. throw new IllegalArgumentException("No such variable: " + name);
  341. }
  342. return t;
  343. }
  344. public String[] getStringArrayVariable(String name) {
  345. final JSONArray a = getArrayVariable(name);
  346. final String[] s = new String[a.size()];
  347. for (int i = 0; i < a.size(); i++) {
  348. s[i] = ((JSONString) a.get(i)).stringValue();
  349. }
  350. return s;
  351. }
  352. public Set getStringArrayVariableAsSet(String name) {
  353. final JSONArray a = getArrayVariable(name);
  354. final HashSet s = new HashSet();
  355. for (int i = 0; i < a.size(); i++) {
  356. s.add(((JSONString) a.get(i)).stringValue());
  357. }
  358. return s;
  359. }
  360. public int[] getIntArrayVariable(String name) {
  361. final JSONArray a = getArrayVariable(name);
  362. final int[] s = new int[a.size()];
  363. for (int i = 0; i < a.size(); i++) {
  364. final JSONValue v = a.get(i);
  365. s[i] = v.isNumber() != null ? (int) ((JSONNumber) v).getValue()
  366. : Integer.parseInt(v.toString());
  367. }
  368. return s;
  369. }
  370. public class XML {
  371. JSONObject x;
  372. private XML(JSONObject x) {
  373. this.x = x;
  374. }
  375. public String getXMLAsString() {
  376. final StringBuffer sb = new StringBuffer();
  377. for (final Iterator it = x.keySet().iterator(); it.hasNext();) {
  378. final String tag = (String) it.next();
  379. sb.append("<");
  380. sb.append(tag);
  381. sb.append(">");
  382. sb.append(x.get(tag).isString().stringValue());
  383. sb.append("</");
  384. sb.append(tag);
  385. sb.append(">");
  386. }
  387. return sb.toString();
  388. }
  389. }
  390. public int getChildCount() {
  391. return json.size() - 2;
  392. }
  393. public UIDL getErrors() {
  394. final JSONArray a = (JSONArray) ((JSONObject) json.get(1)).get("error");
  395. return new UIDL(a);
  396. }
  397. }