package org.extremecomponents.table.callback;
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.comparators.NullComparator;
import org.apache.commons.collections.comparators.ReverseComparator;
import org.apache.commons.lang.StringUtils;
import org.extremecomponents.table.core.TableConstants;
import org.extremecomponents.table.core.TableModel;
import org.extremecomponents.table.limit.Filter;
import org.extremecomponents.table.limit.Sort;
import org.extremecomponents.util.FilterPredicate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* Created by jeff
*/
public class MemoryRowsCallback implements RetrieveRowsCallback {
@Override
public Collection retrieveRows(TableModel model, Collection rows) throws Exception {
List result = new ArrayList();
result.addAll(rows);
result = applyFilter(result, model.getLimit().getFilterSet().getFilters());
result = applySort(result,model.getLimit().getSort());
int startIndex = model.getLimit().getRowStart();
int endIndex = model.getLimit().getRowEnd();
if (startIndex>=0 && endIndex<= result.size()) {
result = result.subList(startIndex,endIndex);
} else {
result = Collections.emptyList();
}
return result;
}
private List applySort(List filterData, Sort sort) {
if (StringUtils.isEmpty(sort.getSortOrder()) || StringUtils.isEmpty(sort.getProperty())) return filterData;
if (sort.getSortOrder().equals(TableConstants.SORT_ASC)) {
BeanComparator comparator = new BeanComparator(sort.getProperty(), new NullComparator());
Collections.sort(filterData, comparator);
} else if (sort.getSortOrder().equals(TableConstants.SORT_DESC)) {
BeanComparator reversedNaturalOrderBeanComparator = new BeanComparator(sort.getProperty(), new ReverseComparator(new NullComparator()));
Collections.sort(filterData, reversedNaturalOrderBeanComparator);
}
return filterData;
}
private List applyFilter(List filterData, Filter filters[]) {
if (filters == null || filters.length > 0) {
FilterPredicate predicate = new FilterPredicate(filters);
List resultData = new ArrayList();
CollectionUtils.select(filterData, predicate, resultData);
return resultData;
} else {
return filterData;
}
}
}