/*
* Copyright (c) 2015 OpenSilk Productions LLC
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
*/
package syncthing.api.model;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
/**
* Created by drew on 11/10/15.
*/
public class VersioningTypeConverter implements JsonSerializer<Versioning>, JsonDeserializer<Versioning> {
@Override
public Versioning deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (!json.isJsonObject()) {
throw new JsonParseException("Element was not an object");
}
JsonObject obj = json.getAsJsonObject();
VersioningType type = context.deserialize(obj.get("type"), VersioningType.class);
JsonElement params = obj.get("params");
if (type == null) {
type = VersioningType.NONE;
}
switch (type) {
case EXTERNAL:
return new VersioningExternal(type, context.deserialize(params, VersioningExternal.Params.class));
case SIMPLE:
return new VersioningSimple(type, context.deserialize(params, VersioningSimple.Params.class));
case STAGGERED:
return new VersioningStaggered(type, context.deserialize(params, VersioningStaggered.Params.class));
case TRASHCAN:
return new VersioningTrashCan(type, context.deserialize(params, VersioningTrashCan.Params.class));
case NONE:
default:
return new VersioningNone(type);
}
}
@Override
public JsonElement serialize(Versioning src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject obj = new JsonObject();
JsonElement type = context.serialize(src.type, VersioningType.class);
obj.add("type", type);
JsonElement params;
switch (src.type) {
case EXTERNAL:
params = context.serialize(src.params, VersioningExternal.Params.class);
break;
case SIMPLE:
params = context.serialize(src.params, VersioningSimple.Params.class);
break;
case STAGGERED:
params = context.serialize(src.params, VersioningStaggered.Params.class);
break;
case TRASHCAN:
params = context.serialize(src.params, VersioningTrashCan.Params.class);
break;
case NONE:
default:
params = null;//context.serialize(src.params, VersioningNone.Params.class);
break;
}
obj.add("params", params);
return obj;
}
}