001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.atom;
016    
017    import com.liferay.portal.kernel.atom.AtomRequestContext;
018    import com.liferay.portal.kernel.dao.search.SearchContainer;
019    
020    import org.apache.abdera.ext.history.FeedPagingHelper;
021    import org.apache.abdera.model.Feed;
022    
023    /**
024     * @author Igor Spasic
025     */
026    public class AtomPager {
027    
028            public AtomPager(AtomRequestContext atomRequestContext, int totalElements) {
029                    this(
030                            atomRequestContext.getIntParameter("page"),
031                            atomRequestContext.getIntParameter(
032                                    "max", SearchContainer.DEFAULT_DELTA),
033                            totalElements);
034            }
035    
036            public AtomPager(int page, int totalElements) {
037                    this(page, SearchContainer.DEFAULT_DELTA, totalElements);
038            }
039    
040            public AtomPager(int page, int elementsPerPage, int totalElements) {
041                    _firstPage = 1;
042    
043                    int lastPage = totalElements / elementsPerPage;
044    
045                    if ((totalElements % elementsPerPage) > 0) {
046                            lastPage++;
047                    }
048    
049                    if (lastPage == 0) {
050                            lastPage = 1;
051                    }
052    
053                    _lastPage = lastPage;
054    
055                    if (page < _firstPage) {
056                            _page = _firstPage;
057                    }
058                    else if (page > _lastPage) {
059                            _page = _lastPage;
060                    }
061                    else {
062                            _page = page;
063                    }
064    
065                    _totalElements = totalElements;
066                    _elementsPerPage = elementsPerPage;
067    
068                    _start = (_page - 1) * _elementsPerPage;
069    
070                    int end = _start + _elementsPerPage;
071    
072                    if (end > totalElements) {
073                            end = totalElements;
074                    }
075                    _end = end - 1;
076    
077                    _previousPage = _page - 1;
078    
079                    int nextPage = _page + 1;
080    
081                    if (nextPage > _lastPage) {
082                            nextPage = 0;
083                    }
084    
085                    _nextPage = nextPage;
086            }
087    
088            public int getElementsPerPage() {
089                    return _elementsPerPage;
090            }
091    
092            public int getEnd() {
093                    return _end;
094            }
095    
096            public int getFirstPage() {
097                    return _firstPage;
098            }
099    
100            public int getLastPage() {
101                    return _lastPage;
102            }
103    
104            public int getNextPage() {
105                    return _nextPage;
106            }
107    
108            public int getPage() {
109                    return _page;
110            }
111    
112            public int getPreviousPage() {
113                    return _previousPage;
114            }
115    
116            public int getStart() {
117                    return _start;
118            }
119    
120            public int getTotalElements() {
121                    return _totalElements;
122            }
123    
124            public void setFeedPagingLinks(Feed feed, String url) {
125                    FeedPagingHelper.setFirst(feed, AtomUtil.setPageInUrl(url, 1));
126                    FeedPagingHelper.setLast(feed, AtomUtil.setPageInUrl(url, _lastPage));
127    
128                    if (_previousPage != 0) {
129                            FeedPagingHelper.setPrevious(
130                                    feed, AtomUtil.setPageInUrl(url, _previousPage));
131                    }
132    
133                    if (_nextPage != 0) {
134                            FeedPagingHelper.setNext(
135                                    feed, AtomUtil.setPageInUrl(url, _nextPage));
136                    }
137            }
138    
139            private int _elementsPerPage;
140            private int _end;
141            private int _firstPage;
142            private int _lastPage;
143            private int _nextPage;
144            private int _page;
145            private int _previousPage;
146            private int _start;
147            private int _totalElements;
148    
149    }