package org.zstack.rest;
import org.zstack.header.exception.CloudRuntimeException;
import org.zstack.header.message.APIEvent;
import org.zstack.header.message.JsonSchemaBuilder;
import org.zstack.utils.BeanUtils;
import org.zstack.utils.gson.JSONObjectUtil;
import java.util.*;
/**
* Created by xing5 on 2017/1/2.
*/
public class ApiEventResult {
private Object apiEvent;
private Map<String, String> schema;
private String apiEventClassName;
static APIEvent fromJson(String jsonStr) {
try {
ApiEventResult res = JSONObjectUtil.toObject(jsonStr, ApiEventResult.class);
Class<? extends APIEvent> clz = (Class<? extends APIEvent>) Class.forName(res.apiEventClassName);
APIEvent evt = JSONObjectUtil.rehashObject(res.apiEvent, clz);
List<String> paths = new ArrayList();
paths.addAll(res.schema.keySet());
Collections.sort(paths);
for (String path : paths) {
String clzName = res.schema.get(path);
Object bean = org.zstack.utils.BeanUtils.getProperty(evt, path);
if (bean.getClass().getName().equals(clzName)) {
// not an inherent object
continue;
}
Class fclz = Class.forName(clzName);
Object val = JSONObjectUtil.rehashObject(BeanUtils.getProperty(res.apiEvent, path), fclz);
BeanUtils.setProperty(evt, path, val);
}
return evt;
} catch (Exception e) {
throw new CloudRuntimeException(e);
}
}
static String toJson(APIEvent evt) {
ApiEventResult res = new ApiEventResult();
res.apiEvent = evt;
res.apiEventClassName = evt.getClass().getName();
res.schema = new JsonSchemaBuilder(evt).build();
return JSONObjectUtil.toJsonString(res);
}
}