• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

hazendaz / displaytag / 1753

12 Feb 2026 03:17AM UTC coverage: 77.321% (-0.01%) from 77.334%
1753

push

github

web-flow
Merge pull request #1102 from hazendaz/renovate/javax-support-logback-monorepo

Update dependency ch.qos.logback:logback-classic to v1.5.29 (javax-support)

1438 of 2003 branches covered (71.79%)

Branch coverage included in aggregate %.

4034 of 5074 relevant lines covered (79.5%)

0.8 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.15
/displaytag/src/main/java/org/displaytag/pagination/Pagination.java
1
/*
2
 * SPDX-License-Identifier: MIT
3
 * See LICENSE file for details.
4
 *
5
 * Copyright 2002-2026 Fabrizio Giustina, the Displaytag team
6
 */
7
package org.displaytag.pagination;
8

9
import java.text.MessageFormat;
10
import java.util.ArrayList;
11
import java.util.Iterator;
12
import java.util.List;
13

14
import org.apache.commons.lang3.builder.ToStringBuilder;
15
import org.apache.commons.lang3.builder.ToStringStyle;
16
import org.displaytag.properties.TableProperties;
17
import org.displaytag.util.Href;
18
import org.slf4j.Logger;
19
import org.slf4j.LoggerFactory;
20

21
/**
22
 * Helper class for generation of paging banners.
23
 */
24
public class Pagination {
25

26
    /**
27
     * logger.
28
     */
29
    private static Logger log = LoggerFactory.getLogger(Pagination.class);
1✔
30

31
    /**
32
     * Base href for urls.
33
     */
34
    private final Href href;
35

36
    /**
37
     * page parameter name.
38
     */
39
    private final String pageParam;
40

41
    /**
42
     * first page.
43
     */
44
    private Integer firstPage;
45

46
    /**
47
     * last page.
48
     */
49
    private Integer lastPage;
50

51
    /**
52
     * previous page.
53
     */
54
    private Integer previousPage;
55

56
    /**
57
     * next page.
58
     */
59
    private Integer nextPage;
60

61
    /**
62
     * current page.
63
     */
64
    private Integer currentPage;
65

66
    /**
67
     * List containg NumberedPage objects.
68
     *
69
     * @see org.displaytag.pagination.NumberedPage
70
     */
71
    private final List<NumberedPage> pages = new ArrayList<>();
1✔
72

73
    /**
74
     * Table properties, needed fot locale.
75
     */
76
    private final TableProperties properties;
77

78
    /**
79
     * Constructor for Pagination.
80
     *
81
     * @param baseHref
82
     *            Href used for links
83
     * @param pageParameter
84
     *            name for the page parameter
85
     * @param properties
86
     *            the properties
87
     */
88
    public Pagination(final Href baseHref, final String pageParameter, final TableProperties properties) {
1✔
89
        this.href = baseHref;
1✔
90
        this.pageParam = pageParameter;
1✔
91
        this.properties = properties;
1✔
92
    }
1✔
93

94
    /**
95
     * Adds a page.
96
     *
97
     * @param number
98
     *            int page number
99
     * @param isSelected
100
     *            is the page selected?
101
     */
102
    public void addPage(final int number, final boolean isSelected) {
103
        if (Pagination.log.isDebugEnabled()) {
1!
104
            Pagination.log.debug("adding page {}", number);
×
105
        }
106
        this.pages.add(new NumberedPage(number, isSelected));
1✔
107
    }
1✔
108

109
    /**
110
     * first page selected?.
111
     *
112
     * @return boolean
113
     */
114
    public boolean isFirst() {
115
        return this.firstPage == null;
1✔
116
    }
117

118
    /**
119
     * last page selected?.
120
     *
121
     * @return boolean
122
     */
123
    public boolean isLast() {
124
        return this.lastPage == null;
1✔
125
    }
126

127
    /**
128
     * only one page?.
129
     *
130
     * @return boolean
131
     */
132
    public boolean isOnePage() {
133
        return this.pages == null || this.pages.size() <= 1;
1!
134
    }
135

136
    /**
137
     * Gets the number of the first page.
138
     *
139
     * @return Integer number of the first page
140
     */
141
    public Integer getFirst() {
142
        return this.firstPage;
1✔
143
    }
144

145
    /**
146
     * Sets the number of the first page.
147
     *
148
     * @param first
149
     *            Integer number of the first page
150
     */
151
    public void setFirst(final Integer first) {
152
        this.firstPage = first;
1✔
153
    }
1✔
154

155
    /**
156
     * Gets the number of the last page.
157
     *
158
     * @return Integer number of the last page
159
     */
160
    public Integer getLast() {
161
        return this.lastPage;
1✔
162
    }
163

164
    /**
165
     * Sets the number of the last page.
166
     *
167
     * @param last
168
     *            Integer number of the last page
169
     */
170
    public void setLast(final Integer last) {
171
        this.lastPage = last;
1✔
172
    }
1✔
173

174
    /**
175
     * Gets the number of the previous page.
176
     *
177
     * @return Integer number of the previous page
178
     */
179
    public Integer getPrevious() {
180
        return this.previousPage;
1✔
181
    }
182

183
    /**
184
     * Sets the number of the previous page.
185
     *
186
     * @param previous
187
     *            Integer number of the previous page
188
     */
189
    public void setPrevious(final Integer previous) {
190
        this.previousPage = previous;
1✔
191
    }
1✔
192

193
    /**
194
     * Gets the number of the next page.
195
     *
196
     * @return Integer number of the next page
197
     */
198
    public Integer getNext() {
199
        return this.nextPage;
1✔
200
    }
201

202
    /**
203
     * Sets the number of the next page.
204
     *
205
     * @param next
206
     *            Integer number of the next page
207
     */
208
    public void setNext(final Integer next) {
209
        this.nextPage = next;
1✔
210
    }
1✔
211

212
    /**
213
     * Sets the number of the current page.
214
     *
215
     * @param current
216
     *            number of the current page
217
     */
218
    public void setCurrent(final Integer current) {
219
        this.currentPage = current;
1✔
220
    }
1✔
221

222
    /**
223
     * Returns the appropriate banner for the pagination.
224
     *
225
     * @param numberedPageFormat
226
     *            String to be used for a not selected page
227
     * @param numberedPageSelectedFormat
228
     *            String to be used for a selected page
229
     * @param numberedPageSeparator
230
     *            separator beetween pages
231
     * @param fullBanner
232
     *            String basic banner
233
     *
234
     * @return String formatted banner whith pages
235
     */
236
    public String getFormattedBanner(final String numberedPageFormat, final String numberedPageSelectedFormat,
237
            final String numberedPageSeparator, final String fullBanner) {
238
        final StringBuilder buffer = new StringBuilder(100);
1✔
239

240
        // numbered page list
241
        final Iterator<NumberedPage> pageIterator = this.pages.iterator();
1✔
242

243
        while (pageIterator.hasNext()) {
1✔
244

245
            // get NumberedPage from iterator
246
            final NumberedPage page = pageIterator.next();
1✔
247

248
            final Integer pageNumber = Integer.valueOf(page.getNumber());
1✔
249

250
            final String urlString = ((Href) this.href.clone()).addParameter(this.pageParam, pageNumber).toString();
1✔
251

252
            // needed for MessageFormat : page number/url
253
            final Object[] pageObjects = { pageNumber, urlString };
1✔
254

255
            // selected page need a different formatter
256
            if (page.getSelected()) {
1✔
257
                buffer.append(
1✔
258
                        new MessageFormat(numberedPageSelectedFormat, this.properties.getLocale()).format(pageObjects));
1✔
259
            } else {
260
                buffer.append(new MessageFormat(numberedPageFormat, this.properties.getLocale()).format(pageObjects));
1✔
261
            }
262

263
            // next? add page separator
264
            if (pageIterator.hasNext()) {
1✔
265
                buffer.append(numberedPageSeparator);
1✔
266
            }
267
        }
1✔
268

269
        // String for numbered pages
270
        final String numberedPageString = buffer.toString();
1✔
271
        // Object array
272
        // {0} full String for numbered pages
273
        // {1} first page url
274
        // {2} previous page url
275
        // {3} next page url
276
        // {4} last page url
277
        // {5} current page
278
        // {6} total pages
279
        final Object[] pageObjects = { numberedPageString,
1✔
280
                ((Href) this.href.clone()).addParameter(this.pageParam, this.getFirst()),
1✔
281
                ((Href) this.href.clone()).addParameter(this.pageParam, this.getPrevious()),
1✔
282
                ((Href) this.href.clone()).addParameter(this.pageParam, this.getNext()),
1✔
283
                ((Href) this.href.clone()).addParameter(this.pageParam, this.getLast()), this.currentPage,
1✔
284
                this.isLast() ? this.currentPage : this.lastPage }; // this.lastPage is null if the last page is
1✔
285
                                                                    // displayed
286

287
        // return the full banner
288
        return new MessageFormat(fullBanner, this.properties.getLocale()).format(pageObjects);
1✔
289
    }
290

291
    /**
292
     * To string.
293
     *
294
     * @return the string
295
     *
296
     * @see java.lang.Object#toString()
297
     */
298
    @Override
299
    public String toString() {
300
        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) //
1✔
301
                .append("firstPage", this.firstPage) //$NON-NLS-1$
1✔
302
                .append("lastPage", this.lastPage) //$NON-NLS-1$
1✔
303
                .append("currentPage", this.currentPage) //$NON-NLS-1$
1✔
304
                .append("nextPage", this.nextPage) //$NON-NLS-1$
1✔
305
                .append("previousPage", this.previousPage) //$NON-NLS-1$
1✔
306
                .append("pages", this.pages) //$NON-NLS-1$
1✔
307
                .append("href", this.href) //$NON-NLS-1$
1✔
308
                .append("pageParam", this.pageParam) //$NON-NLS-1$
1✔
309
                .toString();
1✔
310
    }
311
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc