package fr.openwide.core.wicket.more.markup.repeater.data; import java.util.Iterator; import java.util.List; import org.apache.wicket.markup.repeater.data.IDataProvider; import fr.openwide.core.wicket.more.model.IBindableDataProvider; public abstract class LoadableDetachableDataProvider<T> implements IDataProvider<T>, IBindableDataProvider { private static final long serialVersionUID = -1126491236540289799L; private Long lastFirst; private Long lastCount; private Long lastSize; private List<T> lastList; protected abstract List<T> loadList(long first, long count); protected abstract long loadSize(); @Override public void detach() { lastFirst = null; lastCount = null; lastSize = null; lastList = null; } @Override public final long size() { if (lastSize == null) { lastSize = loadSize(); } return lastSize; } @Override public final Iterator<? extends T> iterator(long first, long count) { long realCount = Math.min(count, size() - first); if (lastList != null && Long.valueOf(first).equals(lastFirst) && Long.valueOf(realCount).equals(lastCount)) { return lastList.iterator(); } else { lastFirst = first; lastCount = realCount; lastList = loadList(first, count); return lastList.iterator(); } } }