package fr.openwide.core.wicket.more.model.optimization; import java.io.Serializable; import java.util.Iterator; import java.util.List; import fr.openwide.core.jpa.business.generic.model.GenericEntity; import fr.openwide.core.wicket.more.markup.repeater.data.LoadableDetachableDataProvider; public abstract class LoadableDetachableGenericEntityDataProvider<K extends Serializable & Comparable<K>, E extends GenericEntity<K, ?>> extends LoadableDetachableDataProvider<E> implements IGenericEntityDataProvider<K, E>{ private static final long serialVersionUID = 996035545779191799L; private Long lastIdFirst; private Long lastIdCount; private List<K> lastIdList; protected abstract List<K> loadIdList(long first, long count); @Override public void detach() { super.detach(); lastIdFirst = null; lastIdCount = null; lastIdList = null; } @Override public final Iterator<? extends K> idIterator(long first, long count) { long realCount = Math.min(count, size() - first); if (lastIdList != null && Long.valueOf(first).equals(lastIdFirst) && Long.valueOf(realCount).equals(lastIdCount)) { return lastIdList.iterator(); } else { lastIdFirst = first; lastIdCount = realCount; lastIdList = loadIdList(first, count); return lastIdList.iterator(); } } }