package com.thoughtworks.go.plugin.access.configrepo.codec;
import com.google.gson.*;
import com.thoughtworks.go.plugin.access.configrepo.contract.material.*;
import java.lang.reflect.Type;
public class MaterialTypeAdapter implements JsonDeserializer<CRMaterial>, JsonSerializer<CRMaterial> {
private static final String TYPE = "type";
@Override
public CRMaterial deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
JsonPrimitive prim = (JsonPrimitive) jsonObject.get(TYPE);
String typeName = prim.getAsString();
Class<?> klass = classForName(typeName);
return context.deserialize(jsonObject, klass);
}
private String getTypeName(CRMaterial src) {
return src.typeName();
}
private Class<?> classForName(String typeName) {
if(typeName.equals(CRDependencyMaterial.TYPE_NAME))
return CRDependencyMaterial.class;
if(typeName.equals(CRPackageMaterial.TYPE_NAME))
return CRPackageMaterial.class;
if(typeName.equals(CRPluggableScmMaterial.TYPE_NAME))
return CRPluggableScmMaterial.class;
if(typeName.equals(CRGitMaterial.TYPE_NAME))
return CRGitMaterial.class;
if(typeName.equals(CRHgMaterial.TYPE_NAME))
return CRHgMaterial.class;
if(typeName.equals(CRSvnMaterial.TYPE_NAME))
return CRSvnMaterial.class;
if(typeName.equals(CRP4Material.TYPE_NAME))
return CRP4Material.class;
if(typeName.equals(CRTfsMaterial.TYPE_NAME))
return CRTfsMaterial.class;
if(typeName.equals(CRConfigMaterial.TYPE_NAME))
return CRConfigMaterial.class;
else
throw new JsonParseException(
String.format("Invalid or unknown material type '%s'",typeName));
}
@Override
public JsonElement serialize(CRMaterial material, Type type, JsonSerializationContext context) {
return context.serialize(material);
}
}