com.ksk.springstest.web.hateoas.listener.PaginatedResultsRetrievedDiscoverabilityLitener.java Source code

Java tutorial

Introduction

Here is the source code for com.ksk.springstest.web.hateoas.listener.PaginatedResultsRetrievedDiscoverabilityLitener.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ksk.springstest.web.hateoas.listener;

import com.google.common.base.Preconditions;
import com.google.common.net.HttpHeaders;
import com.ksk.springstest.web.hateoas.events.PaginatedResultsRetrievedEvent;
import com.ksk.springstest.web.util.LinkUtil;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriComponentsBuilder;

/**
 *
 * @author sivakrishna.k
 */

@Component
public class PaginatedResultsRetrievedDiscoverabilityLitener
        implements ApplicationListener<PaginatedResultsRetrievedEvent> {

    private final String PAGE = "page";
    private final String SIZE = "size";

    public PaginatedResultsRetrievedDiscoverabilityLitener() {
        super();
    }

    @Override
    public void onApplicationEvent(final PaginatedResultsRetrievedEvent event) {
        Preconditions.checkNotNull(event);

        addLinkHeaderOnPagedResourceReterival(event.getBuilder(), event.getResponse(), event.getPage(),
                event.getTotalPages(), event.getPageSize(), event.getClazz());
    }

    private void addLinkHeaderOnPagedResourceReterival(final UriComponentsBuilder uriBuilder,
            final HttpServletResponse response, final int page, final int totalPages, final int pageSize,
            final Class clazz) {
        plural(uriBuilder, clazz);

        final StringBuilder linkHeader = new StringBuilder();
        if (hasNextPage(page, totalPages)) {
            final String nextPageUri = constructNextPageUri(uriBuilder, page, pageSize);
            linkHeader.append(LinkUtil.createLinkHeader(nextPageUri, LinkUtil.REL_NEXT));
        }

        if (hasPreviousPage(page)) {
            final String previousPageUri = constructPreviousPageUri(uriBuilder, page, pageSize);
            linkHeader.append(LinkUtil.createLinkHeader(previousPageUri, LinkUtil.REL_PREV));
        }

        if (hasFirstPage(page)) {
            final String firstPageUri = constructFirstPageUri(uriBuilder, pageSize);
            linkHeader.append(LinkUtil.createLinkHeader(firstPageUri, LinkUtil.REL_FIRST));
        }

        if (hasLasPage(page, totalPages)) {
            final String lastPageUri = constructLasPageUri(uriBuilder, totalPages, pageSize);
            linkHeader.append(LinkUtil.createLinkHeader(lastPageUri, LinkUtil.REL_LAST));
        }

        if (linkHeader.length() > 0) {
            response.addHeader(HttpHeaders.LINK, linkHeader.toString());
        }

    }

    final String constructNextPageUri(final UriComponentsBuilder uriBuilder, final int page, final int pageSize) {
        return uriBuilder.replaceQueryParam(PAGE, page + 1).replaceQueryParam(SIZE, pageSize).build().encode()
                .toUriString();
    }

    final String constructPreviousPageUri(final UriComponentsBuilder uriBuilder, final int page,
            final int pageSize) {
        return uriBuilder.replaceQueryParam(PAGE, page - 1).replaceQueryParam(SIZE, pageSize).build().encode()
                .toUriString();
    }

    final String constructFirstPageUri(final UriComponentsBuilder uriBuilder, final int pageSize) {
        return uriBuilder.replaceQueryParam(PAGE, 0).replaceQueryParam(SIZE, pageSize).build().encode()
                .toUriString();
    }

    final String constructLasPageUri(final UriComponentsBuilder uriBuilder, final int totalPages,
            final int pageSize) {
        return uriBuilder.replaceQueryParam(PAGE, totalPages).replaceQueryParam(SIZE, pageSize).build().encode()
                .toUriString();
    }

    final boolean hasNextPage(final int page, final int totalPages) {
        return page < totalPages - 1;
    }

    final boolean hasPreviousPage(final int page) {
        return page > 0;
    }

    final boolean hasFirstPage(final int page) {
        return hasPreviousPage(page);
    }

    final boolean hasLasPage(final int page, final int totalPages) {
        return totalPages > 1 && hasNextPage(page, totalPages);
    }

    protected void plural(final UriComponentsBuilder builder, final Class clazz) {
        final String resourceName = clazz.getSimpleName().toLowerCase() + "s";
        builder.path("/" + resourceName);
    }
}