Skip to content

Commit

Permalink
feat(service): Allows responses to be paged to a limit. (Completes IN…
Browse files Browse the repository at this point in the history
…TCMN-416)
  • Loading branch information
JakeMathews committed Oct 21, 2019
1 parent 1e5d30c commit 76f8375
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ public <T extends BlackDuckResponse> BlackDuckPageResponse<T> getAllResponses(Pa
}

public <T extends BlackDuckResponse> BlackDuckPageResponse<T> getResponses(PagedRequest pagedRequest, Class<T> clazz, boolean getAll) throws IntegrationException {
int maxPageCount = getAll ? Integer.MAX_VALUE : 1;
return getResponses(pagedRequest, clazz, maxPageCount);
}

public <T extends BlackDuckResponse> BlackDuckPageResponse<T> getResponses(PagedRequest pagedRequest, Class<T> clazz, int maxPageCount) throws IntegrationException {
List<T> allResponses = new LinkedList<>();
int totalCount = 0;
int currentOffset = pagedRequest.getOffset();
Expand All @@ -59,12 +64,14 @@ public <T extends BlackDuckResponse> BlackDuckPageResponse<T> getResponses(Paged
allResponses.addAll(blackDuckPageResponse.getItems());

totalCount = blackDuckPageResponse.getTotalCount();
if (!getAll) {
if (maxPageCount <= 1) {
return new BlackDuckPageResponse<>(totalCount, allResponses);
}

while (allResponses.size() < totalCount && currentOffset < totalCount) {
int currentPageCount = 1;
while (allResponses.size() < totalCount && currentOffset < totalCount && currentPageCount < maxPageCount) {
currentOffset += pagedRequest.getLimit();
currentPageCount += 1;
PagedRequest offsetPagedRequest = new PagedRequest(pagedRequest.getRequestBuilder(), currentOffset, pagedRequest.getLimit());
request = offsetPagedRequest.createRequest();
try (Response response = blackDuckHttpClient.execute(request)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,13 +128,19 @@ public <T extends BlackDuckResponse> BlackDuckPageResponse<T> getPageResponses(B
return blackDuckResponsesTransformer.getResponses(new PagedRequest(requestBuilder), blackDuckPathMultipleResponses.getResponseClass(), getAll);
}

public <T extends BlackDuckResponse> BlackDuckPageResponse<T> getPageResponses(BlackDuckPathMultipleResponses<T> blackDuckPathMultipleResponses, int maxPageCount) throws IntegrationException {
String uri = pieceTogetherUri(blackDuckBaseUrl, blackDuckPathMultipleResponses.getBlackDuckPath().getPath());
Request.Builder requestBuilder = RequestFactory.createCommonGetRequestBuilder(uri);
return blackDuckResponsesTransformer.getResponses(new PagedRequest(requestBuilder), blackDuckPathMultipleResponses.getResponseClass(), maxPageCount);
}

public <T extends BlackDuckResponse> List<T> getResponses(BlackDuckPathMultipleResponses<T> blackDuckPathMultipleResponses, Request.Builder requestBuilder, boolean getAll)
throws IntegrationException {
throws IntegrationException {
return getPageResponses(blackDuckPathMultipleResponses, requestBuilder, getAll).getItems();
}

public <T extends BlackDuckResponse> BlackDuckPageResponse<T> getPageResponses(BlackDuckPathMultipleResponses<T> blackDuckPathMultipleResponses, Request.Builder requestBuilder, boolean getAll)
throws IntegrationException {
throws IntegrationException {
String uri = pieceTogetherUri(blackDuckBaseUrl, blackDuckPathMultipleResponses.getBlackDuckPath().getPath());
requestBuilder.uri(uri);
return blackDuckResponsesTransformer.getResponses(new PagedRequest(requestBuilder), blackDuckPathMultipleResponses.getResponseClass(), getAll);
Expand All @@ -159,17 +165,37 @@ public <T extends BlackDuckResponse> List<T> getAllResponses(BlackDuckView black
return getResponses(blackDuckView, linkMultipleResponses, true);
}

public <T extends BlackDuckResponse> List<T> getAllResponses(BlackDuckView blackDuckView, LinkMultipleResponses<T> linkMultipleResponses, int maxPageCount) throws IntegrationException {
return getResponses(blackDuckView, linkMultipleResponses, maxPageCount);
}

public <T extends BlackDuckResponse> List<T> getAllResponses(BlackDuckView blackDuckView, LinkMultipleResponses<T> linkMultipleResponses, Request.Builder requestBuilder) throws IntegrationException {
return getResponses(blackDuckView, linkMultipleResponses, requestBuilder, true);
}

public <T extends BlackDuckResponse> List<T> getResponses(BlackDuckView blackDuckView, LinkMultipleResponses<T> linkMultipleResponses, boolean getAll) throws IntegrationException {
final PagedRequest pagedRequest = createResponsesPagedRequest(blackDuckView, linkMultipleResponses);
if (pagedRequest == null) {
return Collections.emptyList();
}
return blackDuckResponsesTransformer.getResponses(pagedRequest, linkMultipleResponses.getResponseClass(), getAll).getItems();
}

public <T extends BlackDuckResponse> List<T> getResponses(BlackDuckView blackDuckView, LinkMultipleResponses<T> linkMultipleResponses, int maxPageCount) throws IntegrationException {
final PagedRequest pagedRequest = createResponsesPagedRequest(blackDuckView, linkMultipleResponses);
if (pagedRequest == null) {
return Collections.emptyList();
}
return blackDuckResponsesTransformer.getResponses(pagedRequest, linkMultipleResponses.getResponseClass(), maxPageCount).getItems();
}

private <T extends BlackDuckResponse> PagedRequest createResponsesPagedRequest(BlackDuckView blackDuckView, LinkMultipleResponses<T> linkMultipleResponses) {
Optional<String> uri = blackDuckView.getFirstLink(linkMultipleResponses.getLink());
if (!uri.isPresent() || StringUtils.isBlank(uri.get())) {
return Collections.emptyList();
return null;
}
Request.Builder requestBuilder = RequestFactory.createCommonGetRequestBuilder(uri.get());
return blackDuckResponsesTransformer.getResponses(new PagedRequest(requestBuilder), linkMultipleResponses.getResponseClass(), getAll).getItems();
return new PagedRequest(requestBuilder);
}

public <T extends BlackDuckResponse> List<T> getResponses(BlackDuckView blackDuckView, LinkMultipleResponses<T> linkMultipleResponses, Request.Builder requestBuilder, boolean getAll) throws IntegrationException {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package com.synopsys.integration.blackduck.service;

import java.net.MalformedURLException;
import java.net.URL;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import com.synopsys.integration.blackduck.TimingExtension;
import com.synopsys.integration.blackduck.api.generated.discovery.ApiDiscovery;
import com.synopsys.integration.blackduck.api.generated.view.ProjectView;
import com.synopsys.integration.blackduck.exception.BlackDuckIntegrationException;
import com.synopsys.integration.blackduck.rest.IntHttpClientTestHelper;
import com.synopsys.integration.blackduck.service.model.PagedRequest;
import com.synopsys.integration.blackduck.service.model.RequestFactory;
import com.synopsys.integration.exception.IntegrationException;
import com.synopsys.integration.rest.request.Request;

@Tag("integration")
@ExtendWith(TimingExtension.class)
class BlackDuckResponsesTransformerTest {

private final IntHttpClientTestHelper intHttpClientTestHelper = new IntHttpClientTestHelper();
private final BlackDuckServicesFactory blackDuckServicesFactory = intHttpClientTestHelper.createBlackDuckServicesFactory();

BlackDuckResponsesTransformerTest() throws IntegrationException {}

@Test
void getAllResponses() throws IntegrationException {
final BlackDuckResponsesTransformer blackDuckResponsesTransformer = createBlackDuckResponsesTransformer();
final Request.Builder requestBuilder = createRequestBuilder();

final PagedRequest defaultPagedRequest = new PagedRequest(requestBuilder);
final BlackDuckPageResponse<ProjectView> responses = blackDuckResponsesTransformer.getAllResponses(defaultPagedRequest, ApiDiscovery.PROJECTS_LINK_RESPONSE.getResponseClass());
Assertions.assertEquals(responses.getTotalCount(), responses.getItems().size());
}

@Test
void getResponsesWithAll() throws IntegrationException {
final BlackDuckResponsesTransformer blackDuckResponsesTransformer = createBlackDuckResponsesTransformer();
final Request.Builder requestBuilder = createRequestBuilder();

final PagedRequest defaultPagedRequest = new PagedRequest(requestBuilder);
final BlackDuckPageResponse<ProjectView> responses = blackDuckResponsesTransformer.getResponses(defaultPagedRequest, ApiDiscovery.PROJECTS_LINK_RESPONSE.getResponseClass(), true);
Assertions.assertEquals(responses.getTotalCount(), responses.getItems().size());

final PagedRequest limitedPagedRequest = new PagedRequest(requestBuilder, 0, 2);
final BlackDuckPageResponse<ProjectView> limitedResponses = blackDuckResponsesTransformer.getResponses(limitedPagedRequest, ApiDiscovery.PROJECTS_LINK_RESPONSE.getResponseClass(), false);
Assertions.assertNotEquals(limitedResponses.getTotalCount(), limitedResponses.getItems().size(), "Too many projects were returned. Note: Black Duck must have more than 2 projects for this test to pass.");
}

@Test
void testGetResponsesWithMaxPageCount() throws IntegrationException {
final BlackDuckResponsesTransformer blackDuckResponsesTransformer = createBlackDuckResponsesTransformer();
final Request.Builder requestBuilder = createRequestBuilder();

final PagedRequest limitedPagedRequest = new PagedRequest(requestBuilder, 0, 2);
final BlackDuckPageResponse<ProjectView> limitedResponses = blackDuckResponsesTransformer.getResponses(limitedPagedRequest, ApiDiscovery.PROJECTS_LINK_RESPONSE.getResponseClass(), 2);
Assertions.assertEquals(4, limitedResponses.getItems().size(), "Too many projects were returned. Note: Black Duck must have more than 4 projects for this test to pass.");
}

private Request.Builder createRequestBuilder() throws BlackDuckIntegrationException {
final String blackDuckBaseUrl = blackDuckServicesFactory.createBlackDuckService().getBlackDuckBaseUrl();
final String uri = pieceTogetherUri(blackDuckBaseUrl, ApiDiscovery.PROJECTS_LINK_RESPONSE.getBlackDuckPath().getPath());
return RequestFactory.createCommonGetRequestBuilder(uri);
}

private BlackDuckResponsesTransformer createBlackDuckResponsesTransformer() throws IntegrationException {
final BlackDuckJsonTransformer blackDuckJsonTransformer = new BlackDuckJsonTransformer(blackDuckServicesFactory.getGson(), blackDuckServicesFactory.getObjectMapper(), blackDuckServicesFactory.getLogger());
return new BlackDuckResponsesTransformer(blackDuckServicesFactory.getBlackDuckHttpClient(), blackDuckJsonTransformer);
}

private String pieceTogetherUri(String baseUrl, String spec) throws BlackDuckIntegrationException {
URL url;
try {
URL baseURL = new URL(baseUrl);
url = new URL(baseURL, spec);
} catch (MalformedURLException e) {
throw new BlackDuckIntegrationException(String.format("Could not construct the URL from %s and %s", baseUrl, spec), e);
}
return url.toString();
}
}

0 comments on commit 76f8375

Please sign in to comment.