Spring Boot で Pager Helper 作った

View の Pagination の表示ロジック系が色々めんどくさかったので作った。

参考にたやつはこちら

qiita.com

public class Pager<T> {

    private static final int DISPLAY_PAGE_NUM = 5;

    private static final int DEFAULT_PAGE_POSITION = 3;

    private String url;

    private String queryString;

    private Page<T> page;

    private List<PageItem> items;

    public Pager(ServletWebRequest request, Page<T> page) {
        this(request, page, DEFAULT_DISPLAY_NUM, DEFAULT_PAGE_POSITION);
    }

    public Pager(ServletWebRequest request, Page<T> page, int displayPageNum, int pagePosition) {
        url = request.getRequest.getRequestURI();
        this.page = page;

        queryString = request.getParameterMap().entrySet().stream().filter(e -> !e.getKey().equals("page")).map(e -> e.getKey() + "=" + e.getValue()[0]).collect(Collectors.joining("&"));

        int currentPage = page.getNumber() + 1;
        int totalPageNum = page.getTotalPages();
        int start = 0;
        int end = totalPageNum;
        if (page.getTotalPages() <= displayPageNum) {
            start = 1;
        } else {
            start = (currentPage - pagePosition > 1) ? currentPage - pagePosition : 1;
            if (start + (displayPageNum - 1) > totalPageNum) {
                start = totalPageNum - (displayPageNum - 1);
            }
        }
        if (end > displayPageNum)  {
            end = start + (displayPageNum - 1);
        }

        items = IntStream.rangeClosed(start, end)
                         .mapToObj(i -> new PageItem(url, i - 1, (i - 1) == page.getNumber()))
                         .collect(Collectors.toList());
    }

    public boolean isFirst() {
        return page.isFirst();
    }

    public boolean isLast() {
        return page.isLast();
    }

    public List<T> getContent() {
        return page.getContent();
    }

    public List<PageItem> getItems() {
        return items;
    }

    public int getPrevPageNumber() {
        return page.previousPageable().getNumber();
    }

    public int getNextPageNumber() {
        return page.nextPageable().getNumber();
    }

    public String getPrevUrl() {
        return getUrl(getPrevPageNumber());
    }

     public String getNextUrl() {
         return getUrl(getNextPageNumber());
     }

     private String getUrl(int number) {
         String s = url + "?page=" + number;
         if (!Strings.isNullOrEmpty(queryString)) {
             s += "&" + queryString;
         }
         return s;
    }

    public class PageItem {

        private String url;

        private int number;

        private boolean current;

        public PageItem(String url, int number, boolean current) {
            this.url = url;
            this.number = number;
            this.current = current;
        }

        public int getNumber() {
            return number + 1;
        }

        public String getUrl() {
            return url;
        }

        public boolean isCurrent() {
            return current;
        }

    }

}