ModelDeserializer.java 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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.reflect.TypeToken;
  10. import holeg.model.AbstractCanvasObject;
  11. import holeg.model.Edge;
  12. import holeg.model.GroupNode;
  13. import holeg.model.Model;
  14. import holeg.ui.model.IdCounter;
  15. import java.lang.reflect.Type;
  16. import java.util.HashSet;
  17. import java.util.function.Function;
  18. import java.util.logging.Logger;
  19. import java.util.stream.Collectors;
  20. public class ModelDeserializer implements JsonDeserializer<Model> {
  21. public static final Gson gson = initGson();
  22. private static final Logger log = Logger.getLogger(ModelDeserializer.class.getName());
  23. private final static Type edgeSetType = TypeToken.getParameterized(HashSet.class, Edge.class)
  24. .getType();
  25. private final EdgeDeserializer edgeDeserializer = new EdgeDeserializer();
  26. private final Gson edgeGson = new GsonBuilder().registerTypeAdapter(Edge.class, edgeDeserializer)
  27. .create();
  28. private static Gson initGson() {
  29. GsonBuilder builder = new GsonBuilder();
  30. builder.registerTypeAdapter(Edge.class, new EdgeSerializer());
  31. builder.registerTypeAdapter(Model.class, new ModelDeserializer());
  32. builder.registerTypeAdapterFactory(new PostDeserializeEnabler());
  33. builder.serializeNulls();
  34. builder.setPrettyPrinting();
  35. return builder.create();
  36. }
  37. @Override
  38. public Model deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
  39. throws JsonParseException {
  40. JsonObject jsonObj = json.getAsJsonObject();
  41. Model model = new Model();
  42. GroupNode canvas = context.deserialize(jsonObj.getAsJsonObject("canvas"), GroupNode.class);
  43. model.setCanvas(canvas);
  44. edgeDeserializer.idMap = canvas.getAllObjectsRecursive()
  45. .collect(Collectors.toMap(AbstractCanvasObject::getId, Function.identity()));
  46. model.setEdgesOnCanvas(edgeGson.fromJson(jsonObj.getAsJsonArray("edgesOnCanvas"), edgeSetType));
  47. updateIdCounter(model.getCanvas());
  48. return model;
  49. }
  50. private void updateIdCounter(GroupNode canvas) {
  51. canvas.getAllObjectsRecursive().mapToInt(AbstractCanvasObject::getId).max()
  52. .ifPresent(maxId -> IdCounter.set(maxId + 1));
  53. }
  54. }