View Javadoc
1   /*
2    * Copyright 2019-2026 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    *      http://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  
17  package org.bremersee.comparator.spring.web;
18  
19  import static java.util.Objects.isNull;
20  
21  import java.util.List;
22  import org.bremersee.comparator.model.SortOrder;
23  import org.springframework.core.MethodParameter;
24  import org.springframework.lang.NonNull;
25  import org.springframework.lang.Nullable;
26  import org.springframework.util.StringUtils;
27  import org.springframework.web.reactive.BindingContext;
28  import org.springframework.web.reactive.result.method.SyncHandlerMethodArgumentResolver;
29  import org.springframework.web.server.ServerWebExchange;
30  
31  /**
32   * The reactive sort order handler method argument resolver.
33   *
34   * @author Christian Bremer
35   */
36  public class ReactiveSortOrderHandlerMethodArgumentResolver
37      extends SortOrderHandlerMethodArgumentResolverSupport
38      implements SyncHandlerMethodArgumentResolver {
39  
40    /**
41     * Instantiates a new reactive sort order handler method argument resolver.
42     */
43    public ReactiveSortOrderHandlerMethodArgumentResolver() {
44      super();
45    }
46  
47    @Override
48    public boolean supportsParameter(@NonNull MethodParameter parameter) {
49      return SortOrder.class.equals(parameter.getParameterType());
50    }
51  
52    @Nullable
53    @Override
54    public SortOrder resolveArgumentValue(
55        @NonNull MethodParameter parameter,
56        @NonNull BindingContext bindingContext,
57        @NonNull ServerWebExchange exchange) {
58  
59      List<String> parameterValues = exchange.getRequest()
60          .getQueryParams()
61          .get(getParameterName(parameter));
62  
63      // No parameter
64      if (isNull(parameterValues) || parameterValues.isEmpty()) {
65        return getDefaultFromAnnotationOrFallback(parameter);
66      }
67  
68      // Single empty parameter, e.g "sort="
69      if (parameterValues.size() == 1 && !StringUtils.hasText(parameterValues.get(0))) {
70        return getDefaultFromAnnotationOrFallback(parameter);
71      }
72  
73      return parseParameterValues(parameterValues);
74    }
75  
76  }