package cy.agorise.graphenej.models; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import java.io.Serializable; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import cy.agorise.graphenej.interfaces.JsonSerializable; /** * Class used to build a Graphene websocket API call. * @see Websocket Calls & Notifications */ public class ApiCall implements JsonSerializable { public static final String KEY_SEQUENCE_ID = "id"; public static final String KEY_METHOD = "method"; public static final String KEY_PARAMS = "params"; public static final String KEY_JSON_RPC = "jsonrpc"; public String method; public String methodToCall; public String jsonrpc; public List params; public int apiId; public long sequenceId; public ApiCall(int apiId, String methodToCall, List params, String jsonrpc, long sequenceId){ this.apiId = apiId; this.method = "call"; this.methodToCall = methodToCall; this.jsonrpc = jsonrpc; this.params = params; this.sequenceId = sequenceId; } public ApiCall(int apiId, String method, String methodToCall, List params, String jsonrpc, long sequenceId){ this.apiId = apiId; this.method = method; this.methodToCall = methodToCall; this.jsonrpc = jsonrpc; this.params = params; this.sequenceId = sequenceId; } @Override public String toJsonString() { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(ApiCall.class, new ApiCallSerializer()); return gsonBuilder.create().toJson(this); } @Override public JsonElement toJsonObject() { JsonObject obj = new JsonObject(); obj.addProperty(KEY_SEQUENCE_ID, this.sequenceId); obj.addProperty(KEY_METHOD, this.method); JsonArray paramsArray = new JsonArray(); paramsArray.add(this.apiId); paramsArray.add(this.methodToCall); JsonArray methodParams = new JsonArray(); if(this.params != null){ for(int i = 0; i < this.params.size(); i++){ if(this.params.get(i) instanceof JsonSerializable) { // Sometimes the parameters are objects methodParams.add(((JsonSerializable) this.params.get(i)).toJsonObject()); }else if (Number.class.isInstance(this.params.get(i))){ // Other times they are numbers methodParams.add( (Number) this.params.get(i)); }else if(this.params.get(i) instanceof String || this.params.get(i) == null){ // Other times they are plain strings methodParams.add((String) this.params.get(i)); }else if(this.params.get(i) instanceof ArrayList) { // Other times it might be an array JsonArray array = new JsonArray(); ArrayList listArgument = (ArrayList) this.params.get(i); for (int l = 0; l < listArgument.size(); l++) { Serializable element = listArgument.get(l); if (element instanceof JsonSerializable) array.add(((JsonSerializable) element).toJsonObject()); else if (element instanceof String) { array.add((String) element); }else if (element instanceof Long){ array.add((Long) element); }else if(element instanceof Integer){ array.add((Integer) element); } } methodParams.add(array); }else if(this.params.get(i) instanceof Boolean){ methodParams.add((boolean) this.params.get(i)); }else{ System.out.println("Skipping parameter of type: "+this.params.get(i).getClass()); } } } paramsArray.add(methodParams); obj.add(KEY_PARAMS, paramsArray); obj.addProperty(KEY_JSON_RPC, this.jsonrpc); return obj; } class ApiCallSerializer implements JsonSerializer { @Override public JsonElement serialize(ApiCall apiCall, Type type, JsonSerializationContext jsonSerializationContext) { return toJsonObject(); } } }