blob: 351948f6409d35525331205862011186725ba345 [file] [log] [blame]
package autotest.common.table;
import autotest.common.UnmodifiableSublistView;
import com.google.gwt.json.client.JSONObject;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
/**
* Data source that operates from a local array. Does not support any
* filtering.
*/
public class ArrayDataSource<T extends JSONObject> implements DataSource {
private class ArrayQuery extends DefaultQuery {
public ArrayQuery() {
super(null);
}
@Override
public void getPage(Integer start, Integer maxCount, SortSpec[] sortOn,
DataCallback callback) {
List<JSONObject> sortedData = new ArrayList<JSONObject>(data);
if (sortOn != null) {
Collections.sort(sortedData, new JSONObjectComparator(sortOn));
}
int startInt = start != null ? start.intValue() : 0;
int maxCountInt = maxCount != null ? maxCount.intValue() : data.size();
int size = Math.min(maxCountInt, data.size() - startInt);
List<JSONObject> subList =
new UnmodifiableSublistView<JSONObject>(sortedData, startInt, size);
callback.handlePage(subList);
}
@Override
public void getTotalResultCount(DataCallback callback) {
callback.handleTotalResultCount(data.size());
}
}
private SortedSet<T> data;
private Query theQuery = new ArrayQuery(); // only need one for each instance
/**
* @param sortKeys keys that will be used to keep items sorted internally. We
* do this to ensure we can find and remove items quickly.
*/
public ArrayDataSource(String[] sortKeys) {
SortSpec[] sortSpecs = new SortSpec[sortKeys.length];
for (int i = 0; i < sortKeys.length; i++) {
sortSpecs[i] = new SortSpec(sortKeys[i]);
}
data = new TreeSet<T>(new JSONObjectComparator(sortSpecs));
}
public void addItem(T item) {
data.add(item);
}
public void removeItem(T item) {
boolean wasPresent = data.remove(item);
assert wasPresent;
}
public void clear() {
data.clear();
}
public Collection<T> getItems() {
return Collections.unmodifiableCollection(data);
}
@Override
public void query(JSONObject params, DataCallback callback) {
// ignore params since we don't support filtering
callback.onQueryReady(theQuery);
}
}