Advertisement
Guest User

pagination - spring -web -flux

a guest
Jun 25th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.46 KB | None | 0 0
  1. package com.synerise.manager.definitions;
  2.  
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.data.domain.PageRequest;
  5. import org.springframework.data.domain.Pageable;
  6. import org.springframework.data.domain.Sort;
  7. import org.springframework.util.StringUtils;
  8. import org.springframework.web.reactive.function.server.ServerRequest;
  9. import reactor.core.publisher.Mono;
  10.  
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.Optional;
  14. import java.util.function.Function;
  15. import java.util.stream.Collectors;
  16.  
  17. import static org.springframework.data.domain.Sort.*;
  18.  
  19. @Slf4j
  20. public class PaginationHandler {
  21.  
  22.     private static final String SORT_DELIMITER = ",";
  23.     private static final String PAGE_QUERY_PARAM_KEY = "page";
  24.     private static final String SIZE_QUERY_PARAM_KEY = "size";
  25.     private static final String SORT_QUERY_PARAM_KEY = "sort";
  26.  
  27.     public static Mono<Pageable> handle(ServerRequest serverRequest) {
  28.         return handle().apply(serverRequest);
  29.     }
  30.  
  31.     public static Function<ServerRequest, Mono<Pageable>> handle() {
  32.         return serverRequest -> {
  33.             Mono<Integer> page = getQueryParamByGivenKey(serverRequest, PAGE_QUERY_PARAM_KEY);
  34.             Mono<Integer> size = getQueryParamByGivenKey(serverRequest, SIZE_QUERY_PARAM_KEY);
  35.             Mono<List<String>> sort = Mono.defer(() -> Mono.just(serverRequest.queryParams().get(SORT_QUERY_PARAM_KEY)));
  36.             return Mono.zip(page, size, sort)
  37.                     .map(pagination -> {
  38.                         Integer pageNumber = pagination.getT1();
  39.                         Integer sizeNumber = pagination.getT2();
  40.                         List<Order> orders = getOrders(pagination.getT3());
  41.                         return (Pageable) PageRequest.of(pageNumber, sizeNumber, orders.isEmpty() ? unsorted()
  42.                                 : by(orders));
  43.                     })
  44.                     .doOnSuccess(pageable -> log.info("Applying pagination {}", pageable))
  45.                     .doOnError(throwable -> log.error("Could not apply pagination falling back to unpaged", throwable))
  46.                     .onErrorReturn(Pageable.unpaged());
  47.         };
  48.     }
  49.  
  50.     private static Mono<Integer> getQueryParamByGivenKey(ServerRequest serverRequest, String queryParamKey) {
  51.         return Mono.defer(() -> Mono.justOrEmpty(serverRequest.queryParam(queryParamKey)
  52.                 .map(Integer::valueOf)));
  53.     }
  54.  
  55.     private static List<Order> getOrders(List<String> sort) {
  56.         return sort.stream().flatMap(value -> {
  57.             final List<Order> allOrders = new ArrayList<>();
  58.             final String[] elements = value.split(SORT_DELIMITER);
  59.             final Optional<Sort.Direction> direction = elements.length == 0 ? Optional.empty()
  60.                     : Direction.fromOptionalString(elements[elements.length - 1]);
  61.  
  62.             int lastIndex = direction.map(it -> elements.length - 1).orElseGet(() -> elements.length);
  63.  
  64.             for (int i = 0; i < lastIndex; i++) {
  65.                 toOrder(elements[i], direction).ifPresent(allOrders::add);
  66.             }
  67.             return allOrders.stream();
  68.         }).collect(Collectors.toList());
  69.     }
  70.  
  71.     private static Optional<Order> toOrder(String property, Optional<Direction> direction) {
  72.  
  73.         if (!StringUtils.hasText(property)) {
  74.             return Optional.empty();
  75.         }
  76.  
  77.         return Optional.of(direction.map(it -> new Order(it, property)).orElseGet(() -> Order.by(property)));
  78.     }
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement