package holeg.serialize; import com.google.gson.*; import com.google.gson.reflect.TypeToken; import holeg.model.*; import holeg.ui.model.IdCounter; import java.lang.reflect.Type; import java.util.HashSet; import java.util.function.Function; import java.util.logging.Logger; import java.util.stream.Collectors; public class ModelDeserializer implements JsonDeserializer{ public static final Gson gson = initGson(); private static final Logger log = Logger.getLogger(ModelDeserializer.class.getName()); private final static Type edgeSetType = TypeToken.getParameterized(HashSet.class, Edge.class).getType(); private final EdgeDeserializer edgeDeserializer = new EdgeDeserializer(); private final Gson edgeGson = new GsonBuilder().registerTypeAdapter(Edge.class, edgeDeserializer).create(); private static Gson initGson() { GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(Edge.class, new EdgeSerializer()); builder.registerTypeAdapter(Model.class, new ModelDeserializer()); builder.registerTypeAdapterFactory(new PostDeserializeEnabler()); builder.serializeNulls(); builder.setPrettyPrinting(); return builder.create(); } @Override public Model deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObj = json.getAsJsonObject(); Model model = new Model(); GroupNode canvas = context.deserialize(jsonObj.getAsJsonObject("canvas"), GroupNode.class); model.setCanvas(canvas); edgeDeserializer.idMap = canvas.getAllObjectsRecursive() .collect(Collectors.toMap(AbstractCanvasObject::getId, Function.identity())); model.setEdgesOnCanvas(edgeGson.fromJson(jsonObj.getAsJsonArray("edgesOnCanvas"), edgeSetType)); updateIdCounter(model.getCanvas()); return model; } private void updateIdCounter(GroupNode canvas){ canvas.getAllObjectsRecursive().mapToInt(AbstractCanvasObject::getId).max() .ifPresent(maxId -> IdCounter.set(maxId + 1)); } }