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

org.sourcelab.github.client.GithubClientUtils Maven / Gradle / Ivy

The newest version!
package org.sourcelab.github.client;

import org.sourcelab.github.client.exception.GithubException;
import org.sourcelab.github.client.request.Filters;
import org.sourcelab.github.client.request.PageOptions;
import org.sourcelab.github.client.request.PageableRequest;
import org.sourcelab.github.client.request.Request;
import org.sourcelab.github.client.request.UserReposFilterCriteria;
import org.sourcelab.github.client.request.UserReposRequest;
import org.sourcelab.github.client.response.PageableResponse;
import org.sourcelab.github.client.response.UserReposResponse;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class GithubClientUtils {
    /**
     * Helper method to retrieve all entries given a filter criteria.
     * The results will be ordered from OLDEST to NEWEST.
     *
     * NOTE: This may result in executing a LARGE number of requests depending
     * on how many entries exist.
     *
     * @param  The request class.
     * @param  The object within the Response to return.
     * @param filters Search criteria.
     * @param requestClass The request class.
     * @param objectClass The object within the Response to return.
     * @param client The BuildkiteClient to execute the requests against.
     * @return List of Builds sorted from NEWEST to OLDEST.
     * @throws GithubException on errors.
     */
    public static  List retrieveAll(
        final Filters filters,
        final Class requestClass,
        final Class objectClass,
        final GithubClient client,
        final int pageLimit
    ) {
        final PageableRequest request;
        if (filters instanceof UserReposFilterCriteria) {
            request = (PageableRequest) new UserReposRequest((UserReposFilterCriteria) filters);
        } else {
            throw new RuntimeException("Unknown type.");
        }

        final List entries = new ArrayList<>();
        boolean hasMore = true;
        int page = 0;
        while (hasMore && page <= pageLimit) {
            page++;

            // Create request
            request.updatePageOptions(new PageOptions(page, 100));

            // Retrieve first entry only, to determine how many total entries there are.
            final PageableResponse lookupResponse = client.executeRequest((Request>) request);

            if (filters instanceof UserReposFilterCriteria) {
                entries.addAll((Collection) ((UserReposResponse) lookupResponse).getRepositories());
            } else {
                throw new RuntimeException("Unknown type.");
            }

            hasMore = lookupResponse.getPagingLinks().hasNextUrl();
        }

        // But the results are still sorted in newest to oldest, presumably, we want oldest to newest, so reverse the order
        // before returning.
        final List reversed = new ArrayList<>(entries);
        return reversed;
    }
}