| package autotest.common.table; |
| |
| import autotest.common.JSONArrayList; |
| import autotest.common.JsonRpcCallback; |
| import autotest.common.JsonRpcProxy; |
| import autotest.common.Utils; |
| |
| import com.google.gwt.json.client.JSONArray; |
| import com.google.gwt.json.client.JSONNumber; |
| import com.google.gwt.json.client.JSONObject; |
| import com.google.gwt.json.client.JSONString; |
| import com.google.gwt.json.client.JSONValue; |
| |
| import java.util.List; |
| |
| /** |
| * Data source that retrieves results via RPC requests to the server. |
| */ |
| public class RpcDataSource implements DataSource { |
| private class RpcQuery extends DefaultQuery { |
| public RpcQuery(JSONObject params) { |
| super(params); |
| } |
| |
| @Override |
| public void getPage(Integer start, Integer maxCount, SortSpec[] sortOn, |
| final DataCallback callback) { |
| JSONObject pageParams = Utils.copyJSONObject(params); |
| if (start != null) { |
| pageParams.put("query_start", new JSONNumber(start.intValue())); |
| } |
| if (maxCount != null) { |
| pageParams.put("query_limit", new JSONNumber(maxCount.intValue())); |
| } |
| if (sortOn != null) { |
| JSONArray sortList = new JSONArray(); |
| for (SortSpec sortSpec : sortOn) { |
| sortList.set(sortList.size(), new JSONString(sortSpec.toString())); |
| } |
| pageParams.put("sort_by", sortList); |
| } |
| |
| JsonRpcProxy.getProxy().rpcCall(dataMethodName, pageParams, |
| new JsonRpcCallback() { |
| @Override |
| public void onSuccess(JSONValue result) { |
| List<JSONObject> resultData = handleJsonResult(result); |
| callback.handlePage(resultData); |
| } |
| |
| @Override |
| public void onError(JSONObject errorObject) { |
| super.onError(errorObject); |
| callback.onError(errorObject); |
| } |
| }); |
| } |
| |
| @Override |
| public void getTotalResultCount(final DataCallback callback) { |
| JsonRpcProxy.getProxy().rpcCall(countMethodName, params, |
| new JsonRpcCallback() { |
| @Override |
| public void onSuccess(JSONValue result) { |
| int count = (int) result.isNumber().doubleValue(); |
| callback.handleTotalResultCount(count); |
| } |
| |
| @Override |
| public void onError(JSONObject errorObject) { |
| super.onError(errorObject); |
| callback.onError(errorObject); |
| } |
| }); |
| } |
| } |
| |
| private String dataMethodName, countMethodName; |
| |
| public RpcDataSource(String dataMethodName, String countMethodName) { |
| this.dataMethodName = dataMethodName; |
| this.countMethodName = countMethodName; |
| } |
| |
| /** |
| * Process the JSON result returned by the server into an list of result |
| * objects. This default implementation assumes the result itself is an array. |
| * Subclasses may override this to construct a list from the JSON result in a customized way. |
| */ |
| protected List<JSONObject> handleJsonResult(JSONValue result) { |
| return new JSONArrayList<JSONObject>(result.isArray()); |
| } |
| |
| @Override |
| public void query(JSONObject params, DataCallback callback) { |
| callback.onQueryReady(new RpcQuery(params)); |
| } |
| |
| public String getDataMethodName() { |
| return dataMethodName; |
| } |
| } |