Home | History | Annotate | Download | only in tko
      1 package autotest.tko;
      2 
      3 import autotest.common.JSONArrayList;
      4 import autotest.common.Utils;
      5 import autotest.common.table.RpcDataSource;
      6 
      7 import com.google.gwt.json.client.JSONArray;
      8 import com.google.gwt.json.client.JSONObject;
      9 import com.google.gwt.json.client.JSONString;
     10 import com.google.gwt.json.client.JSONValue;
     11 
     12 import java.util.ArrayList;
     13 import java.util.Arrays;
     14 import java.util.List;
     15 
     16 public class TestGroupDataSource extends RpcDataSource {
     17     private static final String NUM_GROUPS_RPC = "get_num_groups";
     18     private static final String GROUP_COUNTS_RPC = "get_group_counts";
     19     private static final String STATUS_COUNTS_RPC = "get_status_counts";
     20     private static final String LATEST_TESTS_RPC = "get_latest_tests";
     21     public static final String GROUP_COUNT_FIELD = "group_count";
     22     public static final String PASS_COUNT_FIELD = "pass_count";
     23     public static final String COMPLETE_COUNT_FIELD = "complete_count";
     24     public static final String INCOMPLETE_COUNT_FIELD = "incomplete_count";
     25 
     26     private JSONArray groupByFields;
     27     private JSONArray headerGroups;
     28     private JSONArray headerGroupValues;
     29     private JSONObject queryParameters;
     30 
     31     public static TestGroupDataSource getTestGroupDataSource() {
     32         return new TestGroupDataSource(GROUP_COUNTS_RPC);
     33     }
     34 
     35     public static TestGroupDataSource getStatusCountDataSource() {
     36         return new TestGroupDataSource(STATUS_COUNTS_RPC);
     37     }
     38 
     39     public static TestGroupDataSource getLatestTestsDataSource() {
     40         return new TestGroupDataSource(LATEST_TESTS_RPC);
     41     }
     42 
     43     // force construction to go through above factory methods
     44     private TestGroupDataSource(String dataMethodName) {
     45         super(dataMethodName, NUM_GROUPS_RPC);
     46     }
     47 
     48     @Override
     49     public void query(JSONObject params, DataCallback callback) {
     50         super.query(getFullRequestParams(params), callback);
     51     }
     52 
     53     public JSONObject getFullRequestParams(JSONObject conditionParams) {
     54         JSONObject fullParams = Utils.copyJSONObject(conditionParams);
     55         Utils.updateObject(fullParams, queryParameters);
     56         fullParams.put("group_by", groupByFields);
     57         if (headerGroups != null) {
     58             fullParams.put("header_groups", headerGroups);
     59         }
     60         return fullParams;
     61     }
     62 
     63     @Override
     64     /**
     65      * Process the groups, which come simply as lists, into JSONObjects.
     66      */
     67     protected List<JSONObject> handleJsonResult(JSONValue result) {
     68         JSONObject resultObject = result.isObject();
     69         headerGroupValues = resultObject.get("header_values").isArray();
     70         return new JSONArrayList<JSONObject>(resultObject.get("groups").isArray());
     71     }
     72 
     73     public void setGroupColumns(String[] columns) {
     74         groupByFields = new JSONArray();
     75         for (String field : columns) {
     76             groupByFields.set(groupByFields.size(), new JSONString(field));
     77         }
     78         headerGroups = null;
     79     }
     80 
     81     public void setHeaderGroups(List<List<String>> headerFieldGroups) {
     82         groupByFields = new JSONArray();
     83         headerGroups = new JSONArray();
     84         for (List<String> headerGroup : headerFieldGroups) {
     85             headerGroups.set(headerGroups.size(), Utils.stringsToJSON(headerGroup));
     86             for(String field : headerGroup) {
     87                 groupByFields.set(groupByFields.size(), new JSONString(field));
     88             }
     89         }
     90     }
     91 
     92     /**
     93      * Get a list of values for the header group with the given index, as specified to
     94      * setHeaderGroups().
     95      */
     96     public List<List<String>> getHeaderGroupValues(int groupIndex) {
     97         JSONArray headerList = headerGroupValues.get(groupIndex).isArray();
     98         List<List<String>> headerValueList = new ArrayList<List<String>>();
     99         for (JSONArray header : new JSONArrayList<JSONArray>(headerList)) {
    100             headerValueList.add(Arrays.asList(Utils.JSONtoStrings(header)));
    101         }
    102         return headerValueList;
    103     }
    104 
    105     public void setQueryParameters(JSONObject queryParameters) {
    106         this.queryParameters = queryParameters;
    107     }
    108 }
    109