package gov.nysenate.openleg.dao.base; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.jdbc.core.RowMapper; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /** * Provides a common handler implementation to return a PaginatedList which contains a total * count of the available row as well as a subset of results. This allows for the services that * utilize this result set to paginate through results instead of getting all the rows at once. * @param <T> */ public class PaginatedRowHandler<T> implements RowCallbackHandler { private LimitOffset limOff; private String totalRowsColumn; private RowMapper<T> rowMapper; private List<T> results = new ArrayList<>(); private int totalCount = 0; private int rowNum = 0; public PaginatedRowHandler(LimitOffset limOff, String totalRowsColumn, RowMapper<T> rowMapper) { this.limOff = limOff; this.totalRowsColumn = totalRowsColumn; this.rowMapper = rowMapper; } @Override public void processRow(ResultSet rs) throws SQLException { if (totalCount == 0) { totalCount = rs.getInt(totalRowsColumn); } results.add(rowMapper.mapRow(rs, ++rowNum)); } public PaginatedList<T> getList() { return new PaginatedList<>(totalCount, limOff, results); } }