package autotest.common.table; import autotest.common.Utils; import com.google.gwt.json.client.JSONObject; import java.util.List; public interface DataSource { public static enum SortDirection {ASCENDING, DESCENDING} public static class SortSpec { private String field; private SortDirection direction; public SortSpec(String field, SortDirection direction) { this.field = field; this.direction = direction; } public SortSpec(String field) { this(field, SortDirection.ASCENDING); } public int getDirectionMultiplier() { return direction == SortDirection.ASCENDING ? 1 : -1; } public String getField() { return field; } public SortDirection getDirection() { return direction; } @Override public String toString() { String prefix = ""; if (direction == SortDirection.DESCENDING) { prefix = "-"; } return prefix + field; } public static SortSpec fromString(String sortString) { if (sortString.charAt(0) == '-') { return new SortSpec(sortString.substring(1), SortDirection.DESCENDING); } else { return new SortSpec(sortString, SortDirection.ASCENDING); } } } public interface Query { public JSONObject getParams(); /** * Get the total number of results matching this query. After completion, * callback.handleTotalResultCount() will be called with the count. */ public void getTotalResultCount(final DataCallback callback); /** * Get a page of data. After completion, callback.handlePage() will be * called with the data. * @param start row to start with (for pagination) * @param maxCount maximum rows to be returned * @param sortOn list of columns + directions to sort on; results will be sorted by the * first field, then the second, etc. */ public void getPage(Integer start, Integer maxCount, SortSpec[] sortOn, final DataCallback callback); } abstract class DefaultQuery implements Query { protected JSONObject params; public DefaultQuery(JSONObject params) { if (params == null) { this.params = new JSONObject(); } else { this.params = Utils.copyJSONObject(params); } } @Override public JSONObject getParams() { return Utils.copyJSONObject(params); } @Override public abstract void getPage(Integer start, Integer maxCount, SortSpec[] sortOn, DataCallback callback); @Override public abstract void getTotalResultCount(DataCallback callback); } public interface DataCallback { public void onQueryReady(Query query); public void handlePage(List data); public void handleTotalResultCount(int totalCount); public void onError(JSONObject errorObject); } public static class DefaultDataCallback implements DataCallback { public void handlePage(List data) {} public void handleTotalResultCount(int totalCount) {} public void onQueryReady(Query query) {} public void onError(JSONObject errorObject) {} } public void query(JSONObject params, final DataCallback callback); }