package er.extensions.appserver;
import java.util.List;
import com.webobjects.appserver.WODisplayGroup;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSMutableArray;
import er.extensions.batching.ERXBatchingDisplayGroup;
import er.extensions.batching.IBatchingList;
/**
* A WODisplayGroup that takes Lists instead of NSArrays and supports the
* IBatchingList interface. This should behave just like a WODisplayGroup except
* that you call setObjectList instead of setObjectArray. The backing NSArray of
* this object is a fake array just like ERXBatchingDisplayGroup uses.
*
* @author mschrag
* @param <T>
*/
public class ERXListDisplayGroup<T> extends WODisplayGroup {
/**
* Do I need to update serialVersionUID?
* See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the
* <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a>
*/
private static final long serialVersionUID = 1L;
private List<T> _objectList;
private NSArray<T> _displayedObjects;
public ERXListDisplayGroup() {
}
public List<T> getObjectList() {
return _objectList;
}
protected int size() {
int size;
if (_objectList instanceof NSArray) {
size = ((NSArray<T>) _objectList).count();
}
else {
size = _objectList.size();
}
return size;
}
public void setObjectList(List<T> objectList) {
_objectList = objectList;
if (objectList instanceof IBatchingList) {
((IBatchingList) objectList).setSortOrderings(sortOrderings());
((IBatchingList) objectList).setPageIndex(currentBatchIndex());
((IBatchingList) objectList).setPageSize(numberOfObjectsPerBatch());
}
ERXBatchingDisplayGroup.FakeArray fa = new ERXBatchingDisplayGroup.FakeArray(size());
setObjectArray(fa);
}
@Override
public int batchCount() {
if (numberOfObjectsPerBatch() == 0) {
return 0;
}
int size = size();
if (size == 0) {
return 1;
}
return (size - 1) / numberOfObjectsPerBatch() + 1;
}
@Override
public void setCurrentBatchIndex(int index) {
if (currentBatchIndex() != index) {
_displayedObjects = null;
}
super.setCurrentBatchIndex(index);
if (_objectList instanceof IBatchingList) {
((IBatchingList) _objectList).setPageIndex(currentBatchIndex());
}
}
@Override
public void setNumberOfObjectsPerBatch(int count) {
if (numberOfObjectsPerBatch() != count) {
_displayedObjects = null;
}
super.setNumberOfObjectsPerBatch(count);
if (_objectList instanceof IBatchingList) {
((IBatchingList) _objectList).setPageSize(numberOfObjectsPerBatch());
}
}
@Override
public NSArray<T> displayedObjects() {
NSMutableArray<T> displayedObjects = new NSMutableArray<>(numberOfObjectsPerBatch());
if (_displayedObjects == null) {
int numberOfObjectsPerBatch = numberOfObjectsPerBatch();
int startIndex = (currentBatchIndex() - 1) * numberOfObjectsPerBatch;
int size = (_objectList == null) ? 0 : size();
int endIndex = Math.min(startIndex + numberOfObjectsPerBatch, size);
for (int i = startIndex; i < endIndex; i++) {
displayedObjects.addObject(_objectList.get(i));
}
}
return displayedObjects;
}
@Override
@SuppressWarnings("unchecked")
public void setSortOrderings(NSArray sortOrderings) {
if (_objectList instanceof IBatchingList) {
((IBatchingList) _objectList).setSortOrderings(sortOrderings());
}
super.setSortOrderings(sortOrderings);
}
}