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.

JsonDecoder.java 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.server;
  5. import java.io.Serializable;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import com.vaadin.external.json.JSONArray;
  11. import com.vaadin.external.json.JSONException;
  12. import com.vaadin.external.json.JSONObject;
  13. import com.vaadin.terminal.Paintable;
  14. import com.vaadin.terminal.gwt.client.communication.JsonEncoder;
  15. /**
  16. * Decoder for converting RPC parameters and other values from JSON in transfer
  17. * between the client and the server.
  18. *
  19. * TODO support bi-directional codec functionality
  20. *
  21. * @since 7.0
  22. */
  23. public class JsonDecoder implements Serializable {
  24. /**
  25. * Convert a JSON array with two elements (type and value) into a
  26. * server-side type, recursively if necessary.
  27. *
  28. * @param value
  29. * JSON array with two elements
  30. * @param idMapper
  31. * mapper from paintable ID to {@link Paintable} objects
  32. * @return converted value (does not contain JSON types)
  33. * @throws JSONException
  34. * if the conversion fails
  35. */
  36. public static Object convertVariableValue(JSONArray value,
  37. PaintableIdMapper idMapper) throws JSONException {
  38. return convertVariableValue(value.getString(0).charAt(0), value.get(1),
  39. idMapper);
  40. }
  41. private static Object convertVariableValue(char variableType, Object value,
  42. PaintableIdMapper idMapper) throws JSONException {
  43. Object val = null;
  44. // TODO type checks etc.
  45. switch (variableType) {
  46. case JsonEncoder.VTYPE_ARRAY:
  47. val = convertArray((JSONArray) value, idMapper);
  48. break;
  49. case JsonEncoder.VTYPE_MAP:
  50. val = convertMap((JSONObject) value, idMapper);
  51. break;
  52. case JsonEncoder.VTYPE_STRINGARRAY:
  53. val = convertStringArray((JSONArray) value);
  54. break;
  55. case JsonEncoder.VTYPE_STRING:
  56. val = value;
  57. break;
  58. case JsonEncoder.VTYPE_INTEGER:
  59. // TODO handle properly
  60. val = Integer.valueOf(String.valueOf(value));
  61. break;
  62. case JsonEncoder.VTYPE_LONG:
  63. // TODO handle properly
  64. val = Long.valueOf(String.valueOf(value));
  65. break;
  66. case JsonEncoder.VTYPE_FLOAT:
  67. // TODO handle properly
  68. val = Float.valueOf(String.valueOf(value));
  69. break;
  70. case JsonEncoder.VTYPE_DOUBLE:
  71. // TODO handle properly
  72. val = Double.valueOf(String.valueOf(value));
  73. break;
  74. case JsonEncoder.VTYPE_BOOLEAN:
  75. // TODO handle properly
  76. val = Boolean.valueOf(String.valueOf(value));
  77. break;
  78. case JsonEncoder.VTYPE_PAINTABLE:
  79. // TODO handle properly
  80. val = idMapper.getPaintable(String.valueOf(value));
  81. break;
  82. }
  83. return val;
  84. }
  85. private static Object convertMap(JSONObject jsonMap,
  86. PaintableIdMapper idMapper) throws JSONException {
  87. HashMap<String, Object> map = new HashMap<String, Object>();
  88. Iterator<String> it = jsonMap.keys();
  89. while (it.hasNext()) {
  90. String key = it.next();
  91. map.put(key,
  92. convertVariableValue(jsonMap.getJSONArray(key), idMapper));
  93. }
  94. return map;
  95. }
  96. private static String[] convertStringArray(JSONArray jsonArray)
  97. throws JSONException {
  98. List<String> tokens = new ArrayList<String>();
  99. for (int i = 0; i < jsonArray.length(); ++i) {
  100. tokens.add(jsonArray.getString(i));
  101. }
  102. return tokens.toArray(new String[tokens.size()]);
  103. }
  104. private static Object convertArray(JSONArray jsonArray,
  105. PaintableIdMapper idMapper) throws JSONException {
  106. List<Object> tokens = new ArrayList<Object>();
  107. for (int i = 0; i < jsonArray.length(); ++i) {
  108. // each entry always has two elements: type and value
  109. JSONArray entryArray = jsonArray.getJSONArray(i);
  110. tokens.add(convertVariableValue(entryArray, idMapper));
  111. }
  112. return tokens.toArray(new Object[tokens.size()]);
  113. }
  114. }