ModelDeserializer.java 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  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. private static final Logger log = Logger.getLogger(ModelDeserializer.class.getName());
  13. private final static Type edgeSetType = TypeToken.getParameterized(HashSet.class, Edge.class).getType();
  14. private final EdgeDeserializer edgeDeserializer = new EdgeDeserializer();
  15. private final Gson edgeGson = new GsonBuilder().registerTypeAdapter(Edge.class, edgeDeserializer).create();
  16. @Override
  17. public Model deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
  18. log.info("ModelDeserializer");
  19. JsonObject jsonObj = json.getAsJsonObject();
  20. Model model = new Model();
  21. GroupNode canvas = context.deserialize(jsonObj.getAsJsonObject("canvas"), GroupNode.class);
  22. model.setCanvas(canvas);
  23. edgeDeserializer.idMap = canvas.getAllObjectsRecursive()
  24. .collect(Collectors.toMap(AbstractCanvasObject::getId, Function.identity()));
  25. model.setEdgesOnCanvas(edgeGson.fromJson(jsonObj.getAsJsonArray("edgesOnCanvas"), edgeSetType));
  26. updateIdCounter(model.getCanvas());
  27. return model;
  28. }
  29. private void updateIdCounter(GroupNode canvas){
  30. canvas.getAllObjectsRecursive().mapToInt(AbstractCanvasObject::getId).max()
  31. .ifPresent(maxId -> IdCounter.set(maxId + 1));
  32. }
  33. }