1 package autotest.common.table; 2 3 import autotest.common.JSONArrayList; 4 import autotest.common.JsonRpcCallback; 5 import autotest.common.JsonRpcProxy; 6 import autotest.common.Utils; 7 8 import com.google.gwt.json.client.JSONArray; 9 import com.google.gwt.json.client.JSONNumber; 10 import com.google.gwt.json.client.JSONObject; 11 import com.google.gwt.json.client.JSONString; 12 import com.google.gwt.json.client.JSONValue; 13 14 import java.util.List; 15 16 /** 17 * Data source that retrieves results via RPC requests to the server. 18 */ 19 public class RpcDataSource implements DataSource { 20 private class RpcQuery extends DefaultQuery { RpcQuery(JSONObject params)21 public RpcQuery(JSONObject params) { 22 super(params); 23 } 24 25 @Override getPage(Integer start, Integer maxCount, SortSpec[] sortOn, final DataCallback callback)26 public void getPage(Integer start, Integer maxCount, SortSpec[] sortOn, 27 final DataCallback callback) { 28 JSONObject pageParams = Utils.copyJSONObject(params); 29 if (start != null) { 30 pageParams.put("query_start", new JSONNumber(start.intValue())); 31 } 32 if (maxCount != null) { 33 pageParams.put("query_limit", new JSONNumber(maxCount.intValue())); 34 } 35 if (sortOn != null) { 36 JSONArray sortList = new JSONArray(); 37 for (SortSpec sortSpec : sortOn) { 38 sortList.set(sortList.size(), new JSONString(sortSpec.toString())); 39 } 40 pageParams.put("sort_by", sortList); 41 } 42 if (dataMethodName == "get_hosts") 43 pageParams.put("include_current_job", new JSONString("true")); 44 JsonRpcProxy.getProxy().rpcCall(dataMethodName, pageParams, 45 new JsonRpcCallback() { 46 @Override 47 public void onSuccess(JSONValue result) { 48 List<JSONObject> resultData = handleJsonResult(result); 49 callback.handlePage(resultData); 50 } 51 52 @Override 53 public void onError(JSONObject errorObject) { 54 super.onError(errorObject); 55 callback.onError(errorObject); 56 } 57 }); 58 } 59 60 @Override getTotalResultCount(final DataCallback callback)61 public void getTotalResultCount(final DataCallback callback) { 62 JsonRpcProxy.getProxy().rpcCall(countMethodName, params, 63 new JsonRpcCallback() { 64 @Override 65 public void onSuccess(JSONValue result) { 66 int count = (int) result.isNumber().doubleValue(); 67 callback.handleTotalResultCount(count); 68 } 69 70 @Override 71 public void onError(JSONObject errorObject) { 72 super.onError(errorObject); 73 callback.onError(errorObject); 74 } 75 }); 76 } 77 } 78 79 private String dataMethodName, countMethodName; 80 RpcDataSource(String dataMethodName, String countMethodName)81 public RpcDataSource(String dataMethodName, String countMethodName) { 82 this.dataMethodName = dataMethodName; 83 this.countMethodName = countMethodName; 84 } 85 86 /** 87 * Process the JSON result returned by the server into an list of result 88 * objects. This default implementation assumes the result itself is an array. 89 * Subclasses may override this to construct a list from the JSON result in a customized way. 90 */ handleJsonResult(JSONValue result)91 protected List<JSONObject> handleJsonResult(JSONValue result) { 92 return new JSONArrayList<JSONObject>(result.isArray()); 93 } 94 95 @Override query(JSONObject params, DataCallback callback)96 public void query(JSONObject params, DataCallback callback) { 97 callback.onQueryReady(new RpcQuery(params)); 98 } 99 getDataMethodName()100 public String getDataMethodName() { 101 return dataMethodName; 102 } 103 } 104