CategoryAdapter.java 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package holeg.serialize;
  2. import com.google.gson.Gson;
  3. import com.google.gson.GsonBuilder;
  4. import com.google.gson.JsonDeserializationContext;
  5. import com.google.gson.JsonDeserializer;
  6. import com.google.gson.JsonElement;
  7. import com.google.gson.JsonObject;
  8. import com.google.gson.JsonParseException;
  9. import com.google.gson.JsonSerializationContext;
  10. import com.google.gson.JsonSerializer;
  11. import com.google.gson.reflect.TypeToken;
  12. import holeg.model.AbstractCanvasObject;
  13. import holeg.model.HolonObject;
  14. import holeg.model.HolonSwitch;
  15. import holeg.ui.view.category.Category;
  16. import java.lang.reflect.Type;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.Set;
  20. import java.util.stream.Collectors;
  21. public class CategoryAdapter implements JsonSerializer<Category>, JsonDeserializer<Category> {
  22. public static final Gson Gson = initGson();
  23. public static final Type CategorySet = new TypeToken<Set<Category>>() {
  24. }.getType();
  25. private static final Type HolonObjectList = new TypeToken<List<HolonObject>>() {
  26. }.getType();
  27. private static final Type HolonSwitchList = new TypeToken<List<HolonSwitch>>() {
  28. }.getType();
  29. private static Gson initGson() {
  30. GsonBuilder gson = new GsonBuilder();
  31. gson.registerTypeAdapter(Category.class, new CategoryAdapter());
  32. gson.registerTypeAdapterFactory(new PostDeserializeEnabler());
  33. gson.serializeNulls();
  34. return gson.create();
  35. }
  36. @Override
  37. public JsonElement serialize(Category src, Type typeOfSrc, JsonSerializationContext context) {
  38. JsonObject object = new JsonObject();
  39. object.addProperty("name", src.getName());
  40. Map<Class<?>, List<AbstractCanvasObject>> map =
  41. src.getObjects().stream()
  42. .collect(Collectors.groupingBy(Object::getClass));
  43. object.add("objects", context.serialize(map.get(HolonObject.class), HolonObjectList));
  44. object.add("switches", context.serialize(map.get(HolonSwitch.class), HolonSwitchList));
  45. return object;
  46. }
  47. @Override
  48. public Category deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
  49. throws JsonParseException {
  50. JsonObject object = json.getAsJsonObject();
  51. Category cat = new Category(object.get("name").getAsString());
  52. if (object.has("objects") && !object.get("objects").isJsonNull()) {
  53. cat.getObjects()
  54. .addAll(context.deserialize(object.getAsJsonArray("objects"), HolonObjectList));
  55. }
  56. if (object.has("switches") && !object.get("switches").isJsonNull()) {
  57. cat.getObjects()
  58. .addAll(context.deserialize(object.getAsJsonArray("switches"), HolonSwitchList));
  59. }
  60. return cat;
  61. }
  62. }