package com.jdroid.android.usecase; import com.jdroid.android.search.SortingType; import com.jdroid.java.search.PagedResult; import com.jdroid.java.utils.LoggerUtils; import org.slf4j.Logger; import java.util.List; /** * * @param <T> */ public abstract class PaginatedUseCase<T> extends AbstractUseCase { private static final long serialVersionUID = 4321782756459414981L; public enum PaginatedUseCaseMode { INITIAL_LOAD, PAGINATION, SORTING; } private final static Logger LOGGER = LoggerUtils.getLogger(PaginatedUseCase.class); private PaginatedUseCaseMode paginatedUseCaseMode = PaginatedUseCaseMode.INITIAL_LOAD; private int page = 1; private int pageSize = 50; private SortingType sortingType; private PagedResult<T> pagedResult; /** * @see com.jdroid.android.usecase.AbstractUseCase#doExecute() */ @Override protected final void doExecute() { if (paginatedUseCaseMode.equals(PaginatedUseCaseMode.PAGINATION)) { page++; } else { page = 1; } try { pagedResult = doPopulate(page, pageSize, sortingType); LOGGER.debug("Results: " + pagedResult.getResults().size() + " / Page: " + page + " / Sorting: " + sortingType); } catch (RuntimeException e) { if (paginatedUseCaseMode.equals(PaginatedUseCaseMode.PAGINATION)) { page--; } throw e; } } protected abstract PagedResult<T> doPopulate(int page, int pageSize, SortingType sortingType); public void markAsPaginating() { paginatedUseCaseMode = PaginatedUseCaseMode.PAGINATION; } public void reset() { paginatedUseCaseMode = PaginatedUseCaseMode.INITIAL_LOAD; } public Boolean isInitialLoad() { return paginatedUseCaseMode.equals(PaginatedUseCaseMode.INITIAL_LOAD); } public Boolean isPaginating() { return paginatedUseCaseMode.equals(PaginatedUseCaseMode.PAGINATION); } /** * @return Whether this list is on the last page or not */ public boolean isLastPage() { return pagedResult.isLastPage(); } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } /** * @return the results */ public List<T> getResults() { return pagedResult.getResults(); } /** * @param sortingType the sortingType to set */ public void setSortingType(SortingType sortingType) { this.sortingType = sortingType; } }