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