package org.activityinfo.server.endpoint.jsonrpc;
import org.activityinfo.legacy.shared.command.Command;
import org.activityinfo.legacy.shared.command.GetSchema;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.deser.std.StdDeserializer;
import org.codehaus.jackson.node.ObjectNode;
import java.io.IOException;
public class CommandDeserializer extends StdDeserializer<Command> {
public CommandDeserializer() {
super(Command.class);
}
@Override
public Command deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = (ObjectNode) mapper.readTree(jp);
String typeName = root.path("type").asText();
Class commandClass = lookupCommandClass(typeName);
return (Command) mapper.readValue(root.path("command"), commandClass);
}
protected Class<?> lookupCommandClass(String type) {
try {
return Class.forName(GetSchema.class.getPackage().getName() + "." + type);
} catch (ClassNotFoundException e) {
throw new RuntimeException("Couldn't resolve command type " + type);
}
}
}