1 /*
2  * Copyright 2013-2020 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      https://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.springframework.data.web;
17
18 import org.springframework.core.MethodParameter;
19 import org.springframework.data.domain.PageRequest;
20 import org.springframework.data.domain.Pageable;
21 import org.springframework.data.domain.Sort;
22 import org.springframework.lang.Nullable;
23 import org.springframework.web.bind.support.WebDataBinderFactory;
24 import org.springframework.web.context.request.NativeWebRequest;
25 import org.springframework.web.method.support.ModelAndViewContainer;
26
27 /**
28  * Extracts paging information from web requests and thus allows injecting {@link Pageable} instances into controller
29  * methods. Request properties to be parsed can be configured. Default configuration uses request parameters beginning
30  * with {@link #DEFAULT_PAGE_PARAMETER}{@link #DEFAULT_QUALIFIER_DELIMITER}.
31  *
32  * @since 1.6
33  * @author Oliver Gierke
34  * @author Nick Williams
35  * @author Mark Paluch
36  * @author Christoph Strobl
37  */

38 public class PageableHandlerMethodArgumentResolver extends PageableHandlerMethodArgumentResolverSupport
39         implements PageableArgumentResolver {
40
41     private static final SortHandlerMethodArgumentResolver DEFAULT_SORT_RESOLVER = new SortHandlerMethodArgumentResolver();
42     private SortArgumentResolver sortResolver;
43
44     /**
45      * Constructs an instance of this resolved with a default {@link SortHandlerMethodArgumentResolver}.
46      */

47     public PageableHandlerMethodArgumentResolver() {
48         this((SortArgumentResolver) null);
49     }
50
51     /**
52      * Constructs an instance of this resolver with the specified {@link SortHandlerMethodArgumentResolver}.
53      *
54      * @param sortResolver the sort resolver to use
55      */

56     public PageableHandlerMethodArgumentResolver(SortHandlerMethodArgumentResolver sortResolver) {
57         this((SortArgumentResolver) sortResolver);
58     }
59
60     /**
61      * Constructs an instance of this resolver with the specified {@link SortArgumentResolver}.
62      *
63      * @param sortResolver the sort resolver to use
64      * @since 1.13
65      */

66     public PageableHandlerMethodArgumentResolver(@Nullable SortArgumentResolver sortResolver) {
67         this.sortResolver = sortResolver == null ? DEFAULT_SORT_RESOLVER : sortResolver;
68     }
69
70     /*
71      * (non-Javadoc)
72      * @see org.springframework.web.method.support.HandlerMethodArgumentResolver#supportsParameter(org.springframework.core.MethodParameter)
73      */

74     @Override
75     public boolean supportsParameter(MethodParameter parameter) {
76         return Pageable.class.equals(parameter.getParameterType());
77     }
78
79     /*
80      * (non-Javadoc)
81      * @see org.springframework.web.method.support.HandlerMethodArgumentResolver#resolveArgument(org.springframework.core.MethodParameter, org.springframework.web.method.support.ModelAndViewContainer, org.springframework.web.context.request.NativeWebRequest, org.springframework.web.bind.support.WebDataBinderFactory)
82      */

83     @Override
84     public Pageable resolveArgument(MethodParameter methodParameter, @Nullable ModelAndViewContainer mavContainer,
85             NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) {
86
87         String page = webRequest.getParameter(getParameterNameToUse(getPageParameterName(), methodParameter));
88         String pageSize = webRequest.getParameter(getParameterNameToUse(getSizeParameterName(), methodParameter));
89
90         Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
91         Pageable pageable = getPageable(methodParameter, page, pageSize);
92
93         if (sort.isSorted()) {
94             return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
95         }
96
97         return pageable;
98     }
99 }
100