All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mercateo.common.rest.schemagen.PaginationLinkBuilder Maven / Gradle / Ivy

There is a newer version: 0.20.0
Show newest version
package com.mercateo.common.rest.schemagen;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import javax.ws.rs.core.Link;

import com.mercateo.common.rest.schemagen.link.relation.Rel;
import com.mercateo.common.rest.schemagen.link.relation.RelationContainer;

public class PaginationLinkBuilder {

    private int total;

    private int offset;

    private int limit;

    private PaginationLinkBuilder(int total, int offset, int limit) {
        this.total = total;
        this.offset = offset;
        this.limit = limit;
    }

    public static PaginationLinkBuilder of(int total, int offset, int limit) {
        offset = offset < 0 ? 0 : offset;
        limit = limit < 0 ? 0 : limit;
        total = total < 0 ? 0 : total;
        return new PaginationLinkBuilder(total, offset, limit);
    }

    public interface PaginationLinkCreator {
        Optional of(RelationContainer rel, int offset, int limit);
    }

    public List> generateLinks(PaginationLinkCreator linkCreator) {
        List> result = new ArrayList<>();
        if (limit == 0) {
            return result;
        }
        result.add(createSelfLink(linkCreator));
        result.add(createNextLink(linkCreator));
        result.add(createPrevLink(linkCreator));
        result.add(createFirstLink(linkCreator));
        result.add(createLastLink(linkCreator));
        return result;
    }

    private Optional createSelfLink(PaginationLinkCreator linkCreator) {
        return linkCreator.of(Rel.SELF, offset, limit);
    }

    private Optional createNextLink(PaginationLinkCreator linkCreator) {
        if (total > offset + limit) {
            return linkCreator.of(Rel.NEXT, offset + limit, limit);
        }
        return Optional.empty();
    }

    private Optional createPrevLink(PaginationLinkCreator linkCreator) {
        if (offset < 1) {
            return Optional.empty();
        }
        final int newOffset = offset - limit < 0 ? 0 : offset - limit;
        return linkCreator.of(Rel.PREV, newOffset, limit);
    }

    private Optional createFirstLink(PaginationLinkCreator linkCreator) {
        if (offset < 1) {
            return Optional.empty();
        }
        return linkCreator.of(Rel.FIRST, 0, limit);
    }

    private Optional createLastLink(PaginationLinkCreator linkCreator) {
        int numberOfPages = total / limit;

        if (numberOfPages > 0) {
            final int offsetForLast;

            if ((total % limit) == 0) {
                offsetForLast = (numberOfPages - 1) * limit;
            } else {
                offsetForLast = numberOfPages * limit;
            }

            return linkCreator.of(Rel.LAST, offsetForLast, limit);
        }
        return Optional.empty();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy