ModelDeserializer.java 2.1 KB

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