package org.extremecomponents.table.core.internal;
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.util.FilterPredicate;
import org.extremecomponents.table.core.TableConstants;
import org.extremecomponents.table.limit.Filter;
import org.extremecomponents.table.limit.Sort;
import org.extremecomponents.util.Assert;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* Created by jeff
*/
public class CollectionTableDataSource<T> {
private List<T> data;
private List<T> filterData;
public CollectionTableDataSource(List<T> data) {
Assert.notNull(data, "CollectionTableDataSource can not be null");
this.data = data;
}
public int getAvailableRows(List<Filter> filter, Sort sort) {
filterData = new ArrayList<T>(data);
if (filter!=null && filter.size()>0) {
applyFilter(filter);
}
int availableRows = filterData.size();
if (sort!=null) {
applySort(sort);
}
return availableRows;
}
private void applySort(Sort sort) {
if (StringUtils.isEmpty(sort.getSortOrder()) || StringUtils.isEmpty(sort.getProperty())) return;
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);
}
}
private void applyFilter(List<Filter> filters) {
FilterPredicate predicate = new FilterPredicate(filters);
filterData = new ArrayList<T>();
CollectionUtils.select(data, predicate, filterData);
}
public Collection getData(int startIndex, int endIndex) {
int availabelRows = filterData.size();
if (startIndex >= 0 && endIndex <= availabelRows) {
filterData = filterData.subList(startIndex, endIndex);
} else {
filterData = Collections.emptyList();
}
return filterData;
}
}