Author: tchemit Date: 2014-04-03 10:27:31 +0200 (Thu, 03 Apr 2014) New Revision: 1810 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1810 Log: refs #4490 improve pagination api Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/PaginationBean.java Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsList.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerBoatsServiceTest.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsAction.java trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boats.jsp Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsList.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsList.java 2014-04-03 07:10:17 UTC (rev 1809) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsList.java 2014-04-03 08:27:31 UTC (rev 1810) @@ -1,7 +1,6 @@ package fr.ifremer.wao.services.service; import fr.ifremer.wao.entity.Boat; -import org.nuiton.topia.persistence.pager.TopiaPagerBean; import java.io.Serializable; import java.util.List; @@ -16,18 +15,18 @@ private static final long serialVersionUID = 1L; - protected TopiaPagerBean pager; + protected PaginationBean pagination; protected List<Boat> boats; protected BoatsFilterValues filterValues; - public TopiaPagerBean getPager() { - return pager; + public PaginationBean getPagination() { + return pagination; } - public void setPager(TopiaPagerBean pager) { - this.pager = pager; + public void setPagination(PaginationBean pagination) { + this.pagination = pagination; } public List<Boat> getBoats() { Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java 2014-04-03 07:10:17 UTC (rev 1809) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java 2014-04-03 08:27:31 UTC (rev 1810) @@ -48,30 +48,38 @@ } public ObsMerBoatsList getBoatsList(BoatsFilter filter, - int pageSize, - int pageIndex, - String sortProperty, - boolean sortAscendant) { + TopiaPagerBean queryPager) { BoatTopiaDao dao = getBoatDao(); TopiaPagerBean pager = dao.newPager(filter, - pageSize, - pageIndex, - sortProperty, - sortAscendant); + queryPager.getPageSize(), + queryPager.getPageIndex(), + queryPager.getSortColumn(), + queryPager.isSortAscendant()); List<Boat> boats = dao.find(filter, pager); + PaginationBean paginationBean = new PaginationBean(pager, 10); + BoatsFilterValues boatsFilterValues = getBoatsFilterValues(filter); ObsMerBoatsList obsMerBoatsList = new ObsMerBoatsList(); obsMerBoatsList.setBoats(boats); - obsMerBoatsList.setPager(pager); + obsMerBoatsList.setPagination(paginationBean); obsMerBoatsList.setFilterValues(boatsFilterValues); return obsMerBoatsList; } + public TopiaPagerBean newBoatsPager(int pageSize) { + TopiaPagerBean queryPager = new TopiaPagerBean(); + queryPager.setPageSize(pageSize); + queryPager.setPageIndex(1); + queryPager.setSortColumn(Boat.PROPERTY_NAME); + queryPager.setSortAscendant(true); + return queryPager; + } + public BoatsFilter newBoatsFilter(AuthenticatedWaoUser authenticatedWaoUser) { SampleRowsFilter sampleRowsFilter = new SampleRowsFilter(); Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/PaginationBean.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/PaginationBean.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/PaginationBean.java 2014-04-03 08:27:31 UTC (rev 1810) @@ -0,0 +1,82 @@ +package fr.ifremer.wao.services.service; + +import org.nuiton.topia.persistence.pager.TopiaPagerBean; + +import java.io.Serializable; + +/** + * Created on 4/3/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 4.0 + */ +public class PaginationBean implements Serializable { + + private static final long serialVersionUID = 1L; + + protected TopiaPagerBean pagerBean; + + protected long firstPage; + + protected long lastPage; + + public PaginationBean(TopiaPagerBean pagerBean, int rangeSize) { + this.pagerBean = pagerBean; + this.firstPage = getPaginationFirstPage(rangeSize); + this.lastPage = getPaginationLastPage(rangeSize, firstPage); + } + + public long getFirstPage() { + return firstPage; + } + + public long getLastPage() { + return lastPage; + } + + public int getCurrentPage() { + return pagerBean.getPageIndex(); + } + + public long getNbPages() { + return pagerBean.getPagesNumber(); + } + + public long getNbRecords() { + return pagerBean.getRecords(); + } + + protected long getPaginationFirstPage(int rangeSize) { + int pageIndex = pagerBean.getPageIndex(); + long result = pageIndex; + long pagesNumber = pagerBean.getPagesNumber(); + if (pagesNumber <= rangeSize || pageIndex < rangeSize) { + // stick to begin + return 1; + } + if (pagesNumber - pageIndex < rangeSize) { + + // just center + result = pagesNumber - rangeSize; + if (result < 1) { + result = 1; + } + return result; + } + + if (pageIndex >= rangeSize) { + + // center + result = pageIndex - (rangeSize / 2); + } + return result; + } + + protected long getPaginationLastPage(int rangeSize, long firstPagination) { + long result = firstPagination + rangeSize; + if (result > pagerBean.getPagesNumber()) { + result = pagerBean.getPagesNumber(); + } + return result; + } +} Property changes on: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/PaginationBean.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerBoatsServiceTest.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerBoatsServiceTest.java 2014-04-03 07:10:17 UTC (rev 1809) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerBoatsServiceTest.java 2014-04-03 08:27:31 UTC (rev 1810) @@ -5,6 +5,7 @@ import fr.ifremer.wao.services.ObsMerFixtures; import org.junit.Before; import org.junit.Test; +import org.nuiton.topia.persistence.pager.TopiaPagerBean; /** * Created on 4/1/14. @@ -42,8 +43,10 @@ BoatsFilter filter = service.newBoatsFilter(fixtures.admin()); - ObsMerBoatsList boatsList = service.getBoatsList(filter, 50, 0, null, false); + TopiaPagerBean pager = service.newBoatsPager(50); + ObsMerBoatsList boatsList = service.getBoatsList(filter, pager); + } } \ No newline at end of file Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsAction.java 2014-04-03 07:10:17 UTC (rev 1809) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsAction.java 2014-04-03 08:27:31 UTC (rev 1810) @@ -6,6 +6,7 @@ import fr.ifremer.wao.services.service.BoatsFilterValues; import fr.ifremer.wao.services.service.ObsMerBoatsList; import fr.ifremer.wao.services.service.ObsMerBoatsService; +import fr.ifremer.wao.services.service.PaginationBean; import fr.ifremer.wao.web.WaoJspActionSupport; import org.nuiton.topia.persistence.pager.TopiaPagerBean; @@ -23,38 +24,32 @@ protected transient ObsMerBoatsService service; + /** + * Input pager. + */ + protected TopiaPagerBean pager; + + /** + * Boats filter. + */ protected BoatsFilter filter; - protected int pageIndex = 1; - - protected int pageSize = 50; - - protected String sortProperty = "name"; - - protected boolean sortAscendant = true; - + /** + * List of boats according to the input pager and filter. + */ protected ObsMerBoatsList boatList; - public void setPageIndex(int pageIndex) { - this.pageIndex = pageIndex; - } - - public void setPageSize(int pageSize) { - this.pageSize = pageSize; - } - - public void setSortProperty(String sortProperty) { - this.sortProperty = sortProperty; - } - - public void setSortAscendant(boolean sortAscendant) { - this.sortAscendant = sortAscendant; - } - public void setService(ObsMerBoatsService service) { this.service = service; } + public TopiaPagerBean getPager() { + if (pager == null) { + pager = service.newBoatsPager(50); + } + return pager; + } + public BoatsFilter getFilter() { if (filter == null) { prepare(); @@ -66,14 +61,14 @@ return boatList.getBoats(); } - public TopiaPagerBean getPager() { - return boatList.getPager(); - } - public BoatsFilterValues getFilterValues() { return boatList.getFilterValues(); } + public PaginationBean getPagination() { + return boatList.getPagination(); + } + @Override public void prepare() { @@ -83,52 +78,14 @@ @Override public String execute() { - boatList = service.getBoatsList(filter, - pageSize, - pageIndex, - sortProperty, - sortAscendant); + boatList = service.getBoatsList(filter, getPager()); return SUCCESS; } - public long getFirstPageIndex() { - int pageIndex = getPager().getPageIndex(); - long result = pageIndex; - long pagesNumber = getPager().getPagesNumber(); - if (pagesNumber <= 10 || pageIndex < 10) { - // stick to begin - return 1; - } - if (pagesNumber - pageIndex < 10) { - - // just center - result = pagesNumber - 10; - if (result < 1) { - result = 1; - } - return result; - } - - if (pageIndex >= 10) { - - // center - result = pageIndex - 5; - } - return result; - } - - public long getLastPageIndex() { - long result = getFirstPageIndex() + 10; - if (result > getPager().getPagesNumber()) { - result = getPager().getPagesNumber(); - } - return result; - } - public String getPaginationUrl(String fullUrl) { - // remove pageIndex params - String paginationUrl = fullUrl.replaceAll("pageIndex=\\d+", ""); + // remove pageIndex parameter + String paginationUrl = fullUrl.replaceAll("pager\\.pageIndex=([^&])+[&]", ""); // clean & paginationUrl = paginationUrl.replaceAll("&&", "&"); // add [?|&]pageIndex= @@ -137,9 +94,7 @@ } else if (!paginationUrl.endsWith("?")) { paginationUrl += "&"; } - paginationUrl += "pageIndex="; + paginationUrl += "pager.pageIndex="; return paginationUrl; } - - } Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boats.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boats.jsp 2014-04-03 07:10:17 UTC (rev 1809) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boats.jsp 2014-04-03 08:27:31 UTC (rev 1810) @@ -134,7 +134,7 @@ <h3> <s:text name="wao.ui.boats.title"> - <s:param value="%{pager.records}"/> + <s:param value="%{pagination.nbRecords}"/> </s:text> </h3> @@ -143,7 +143,7 @@ <ul> <s:url var="fullUrl" includeParams="get"/> <s:set var="paginationUrl" value="%{getPaginationUrl(#fullUrl)}"/> - <s:if test="firstPageIndex > 2"> + <s:if test="pagination.firstPageIndex > 2"> <li> <a href="${paginationUrl}1">1</a> </li> @@ -155,26 +155,26 @@ </li> </s:if> - <s:iterator var="currentPageIndex" begin="firstPageIndex" end="lastPageIndex"> - <li class="<s:if test="#currentPageIndex == pager.pageIndex">active</s:if>"> + <s:iterator var="currentPageIndex" begin="pagination.firstPage" end="pagination.lastPage"> + <li class="<s:if test="#currentPageIndex == pagination.currentPage">active</s:if>"> <a href="${paginationUrl}${currentPageIndex}"> <s:property/> </a> </li> </s:iterator> - <s:if test="lastPageIndex < pager.pagesNumber - 1"> + <s:if test="pagination.lastPage < pagination.nbPages - 1"> <li> <span>...</span> </li> <li> - <a href="${paginationUrl}${pager.pagesNumber - 1}"> - <s:property value="pager.pagesNumber - 1"/> + <a href="${paginationUrl}${pagination.nbPages - 1}"> + <s:property value="pagination.nbPages - 1"/> </a> </li> <li> - <a href="${paginationUrl}${pager.pagesNumber}"> - <s:property value="pager.pagesNumber"/> + <a href="${paginationUrl}${pagination.nbPages}"> + <s:property value="pagination.nbPages"/> </a> </li> </s:if>