package holeg.serialize; import com.google.gson.*; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import holeg.model.AbstractCanvasObject; import holeg.model.Edge; import holeg.model.HolonObject; import holeg.model.HolonSwitch; import holeg.ui.view.category.Category; import java.io.IOException; import java.lang.reflect.Type; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Logger; import java.util.stream.Collectors; public class CategoryAdapter implements JsonSerializer, JsonDeserializer { public static final Gson Gson = initGson(); public static final Type CategorySet = new TypeToken>(){}.getType(); private static final Type HolonObjectList = new TypeToken>(){}.getType(); private static final Type HolonSwitchList = new TypeToken>(){}.getType(); private static Gson initGson() { GsonBuilder gson = new GsonBuilder(); gson.registerTypeAdapter(Category.class, new CategoryAdapter()); gson.registerTypeAdapterFactory(new PostDeserializeEnabler()); gson.serializeNulls(); return gson.create(); } @Override public JsonElement serialize(Category src, Type typeOfSrc, JsonSerializationContext context) { JsonObject object = new JsonObject(); object.addProperty("name", src.getName()); Map, List> map = src.getObjects().stream() .collect(Collectors.groupingBy(Object::getClass)); object.add("objects", context.serialize(map.get(HolonObject.class), HolonObjectList)); object.add("switches", context.serialize(map.get(HolonSwitch.class), HolonSwitchList)); return object; } @Override public Category deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject object = json.getAsJsonObject(); Category cat = new Category(object.get("name").getAsString()); if(object.has("objects") && !object.get("objects").isJsonNull()){ cat.getObjects().addAll(context.deserialize(object.getAsJsonArray("objects"), HolonObjectList)); } if(object.has("switches") && !object.get("switches").isJsonNull()){ cat.getObjects().addAll(context.deserialize(object.getAsJsonArray("switches"), HolonSwitchList)); } return cat; } }