TSK-217: pagination support for WorkbasketController and first page to be number 1.

This commit is contained in:
Holger Hagen 2018-03-19 14:19:10 +01:00 committed by Martin Rojas Miguel Angel
parent 15dee0c269
commit 4765fc242a
9 changed files with 98 additions and 77 deletions

View File

@ -48,17 +48,17 @@ public interface BaseQuery<T> {
/**
* This method will return all results for page X with a size of Y of the current query.<br>
* Negative pageNumber/size will be changed to 0 and the last page got maybe less elements. In case of a TaskQuery,
* this method can throw a NotAuthorizedToQueryWorkbasketException.
* Negative pageNumber/size will be changed to 1 or 0 and the last page might contains less elements. In case of a
* TaskQuery, this method can throw a NotAuthorizedToQueryWorkbasketException.
*
* @param pageNumber
* current pagination page starting at 0.
* current pagination page starting at 1.
* @param pageSize
* amount of elements for this page.
* @return resulList for the current query starting at X and returning max Y elements.
*/
default List<T> listPage(int pageNumber, int pageSize) {
int offset = (pageNumber < 0) ? 0 : (pageNumber * pageSize);
int offset = (pageNumber < 1) ? 0 : ((pageNumber - 1) * pageSize);
int limit = (pageSize < 0) ? 0 : pageSize;
return list(offset, limit);
}

View File

@ -88,7 +88,7 @@ public class QueryClassificationWithPaginationAccTest extends AbstractAccTest {
assertThat(results.size(), equalTo(4));
// Getting last results on 1 big page
pageNumber = 0;
pageNumber = 1;
pageSize = 100;
results = classificationService.createClassificationQuery()
.domainIn("DOMAIN_A")
@ -96,7 +96,7 @@ public class QueryClassificationWithPaginationAccTest extends AbstractAccTest {
assertThat(results.size(), equalTo(16));
// Getting last results on multiple pages
pageNumber = 1;
pageNumber = 2;
pageSize = 10;
results = classificationService.createClassificationQuery()
.domainIn("DOMAIN_A")

View File

@ -71,25 +71,25 @@ public class QueryObjectreferencesWithPaginationAccTest extends AbstractAccTest
@Test
public void testPaginationWithPages() throws NotAuthorizedException {
// Getting full page
int pageNumber = 0;
int pageNumber = 1;
int pageSize = 10;
List<ObjectReference> results = objRefQuery.listPage(pageNumber, pageSize);
assertThat(results.size(), equalTo(3));
// Getting full page
pageNumber = 1;
pageNumber = 2;
pageSize = 2;
results = objRefQuery.listPage(pageNumber, pageSize);
assertThat(results.size(), equalTo(1));
// Getting last results on 1 big page
pageNumber = 0;
pageNumber = 1;
pageSize = 100;
results = objRefQuery.listPage(pageNumber, pageSize);
assertThat(results.size(), equalTo(3));
// Getting last results on multiple pages
pageNumber = 1;
pageNumber = 2;
pageSize = 2;
results = objRefQuery.listPage(pageNumber, pageSize);
assertThat(results.size(), equalTo(1));
@ -98,13 +98,13 @@ public class QueryObjectreferencesWithPaginationAccTest extends AbstractAccTest
@Test
public void testPaginationNullAndNegativeLimitsIgnoring() throws NotAuthorizedException {
// 0 limit/size = 0 results
int pageNumber = 1;
int pageNumber = 2;
int pageSize = 0;
List<ObjectReference> results = objRefQuery.listPage(pageNumber, pageSize);
assertThat(results.size(), equalTo(0));
// Negative will be 0 = all results
pageNumber = 1;
pageNumber = 2;
pageSize = -1;
results = objRefQuery.listPage(pageNumber, pageSize);
assertThat(results.size(), equalTo(0));
@ -126,7 +126,7 @@ public class QueryObjectreferencesWithPaginationAccTest extends AbstractAccTest
@Test(expected = TaskanaRuntimeException.class)
public void testPaginationThrowingExceptionWhenPageOutOfBounds() throws NotAuthorizedException {
// entrypoint set outside result amount
int pageNumber = 5;
int pageNumber = 6;
int pageSize = 10;
objRefQuery.listPage(pageNumber, pageSize);
}

View File

@ -92,7 +92,7 @@ public class QueryTasksWithPaginationAccTest extends AbstractAccTest {
TaskService taskService = taskanaEngine.getTaskService();
// Getting full page
int pageNumber = 1;
int pageNumber = 2;
int pageSize = 4;
List<TaskSummary> results = taskService.createTaskQuery()
.workbasketKeyDomainIn(new KeyDomain("GPK_KSC", "DOMAIN_A"))
@ -100,7 +100,7 @@ public class QueryTasksWithPaginationAccTest extends AbstractAccTest {
assertThat(results.size(), equalTo(4));
// Getting full page
pageNumber = 3;
pageNumber = 4;
pageSize = 1;
results = taskService.createTaskQuery()
.workbasketKeyDomainIn(new KeyDomain("GPK_KSC", "DOMAIN_A"))
@ -108,7 +108,7 @@ public class QueryTasksWithPaginationAccTest extends AbstractAccTest {
assertThat(results.size(), equalTo(1));
// Getting last results on 1 big page
pageNumber = 0;
pageNumber = 1;
pageSize = 100;
results = taskService.createTaskQuery()
.workbasketKeyDomainIn(new KeyDomain("GPK_KSC", "DOMAIN_A"))
@ -116,7 +116,7 @@ public class QueryTasksWithPaginationAccTest extends AbstractAccTest {
assertThat(results.size(), equalTo(22));
// Getting last results on multiple pages
pageNumber = 2;
pageNumber = 3;
pageSize = 10;
results = taskService.createTaskQuery()
.workbasketKeyDomainIn(new KeyDomain("GPK_KSC", "DOMAIN_A"))
@ -133,7 +133,7 @@ public class QueryTasksWithPaginationAccTest extends AbstractAccTest {
TaskService taskService = taskanaEngine.getTaskService();
// 0 limit/size = 0 results
int pageNumber = 1;
int pageNumber = 2;
int pageSize = 0;
List<TaskSummary> results = taskService.createTaskQuery()
.workbasketKeyDomainIn(new KeyDomain("GPK_KSC", "DOMAIN_A"))
@ -141,7 +141,7 @@ public class QueryTasksWithPaginationAccTest extends AbstractAccTest {
assertThat(results.size(), equalTo(0));
// Negative size will be 0 = 0 results
pageNumber = 1;
pageNumber = 2;
pageSize = -1;
results = taskService.createTaskQuery()
.workbasketKeyDomainIn(new KeyDomain("GPK_KSC", "DOMAIN_A"))
@ -175,7 +175,7 @@ public class QueryTasksWithPaginationAccTest extends AbstractAccTest {
TaskService taskService = taskanaEngine.getTaskService();
// entrypoint set outside result amount
int pageNumber = 5;
int pageNumber = 6;
int pageSize = 10;
taskService.createTaskQuery()
.workbasketKeyDomainIn(new KeyDomain("GPK_KSC", "DOMAIN_A"))

View File

@ -89,7 +89,7 @@ public class QueryWorkbasketsWithPaginationAccTest extends AbstractAccTest {
WorkbasketService workbasketService = taskanaEngine.getWorkbasketService();
// Getting full page
int pageNumber = 1;
int pageNumber = 2;
int pageSize = 4;
List<WorkbasketSummary> results = workbasketService.createWorkbasketQuery()
.domainIn("DOMAIN_A")
@ -97,7 +97,7 @@ public class QueryWorkbasketsWithPaginationAccTest extends AbstractAccTest {
assertThat(results.size(), equalTo(4));
// Getting full page
pageNumber = 3;
pageNumber = 4;
pageSize = 1;
results = workbasketService.createWorkbasketQuery()
.domainIn("DOMAIN_A")
@ -105,7 +105,7 @@ public class QueryWorkbasketsWithPaginationAccTest extends AbstractAccTest {
assertThat(results.size(), equalTo(1));
// Getting last results on 1 big page
pageNumber = 0;
pageNumber = 1;
pageSize = 100;
results = workbasketService.createWorkbasketQuery()
.domainIn("DOMAIN_A")
@ -113,7 +113,7 @@ public class QueryWorkbasketsWithPaginationAccTest extends AbstractAccTest {
assertThat(results.size(), equalTo(8));
// Getting last results on multiple pages
pageNumber = 1;
pageNumber = 2;
pageSize = 5;
results = workbasketService.createWorkbasketQuery()
.domainIn("DOMAIN_A")
@ -130,7 +130,7 @@ public class QueryWorkbasketsWithPaginationAccTest extends AbstractAccTest {
WorkbasketService workbasketService = taskanaEngine.getWorkbasketService();
// 0 limit/size = 0 results
int pageNumber = 1;
int pageNumber = 2;
int pageSize = 0;
List<WorkbasketSummary> results = workbasketService.createWorkbasketQuery()
.domainIn("DOMAIN_A")
@ -138,7 +138,7 @@ public class QueryWorkbasketsWithPaginationAccTest extends AbstractAccTest {
assertThat(results.size(), equalTo(0));
// Negative size will be 0 = 0 results
pageNumber = 1;
pageNumber = 2;
pageSize = -1;
results = workbasketService.createWorkbasketQuery()
.domainIn("DOMAIN_A")
@ -167,7 +167,7 @@ public class QueryWorkbasketsWithPaginationAccTest extends AbstractAccTest {
WorkbasketService workbasketService = taskanaEngine.getWorkbasketService();
// entrypoint set outside result amount
int pageNumber = 5;
int pageNumber = 6;
int pageSize = 10;
workbasketService.createWorkbasketQuery()
.domainIn("DOMAIN_A")

View File

@ -1,5 +1,6 @@
package pro.taskana.rest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@ -66,11 +67,35 @@ public class WorkbasketControllerIntTest {
.getLink(Link.REL_SELF)
.getHref()
.endsWith("/v1/workbaskets?type=PERSONAL&sortBy=key&order=desc"));
}
@Test
public void testGetSecondPageSortedByKey() {
RestTemplate template = getRestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic dGVhbWxlYWRfMTp0ZWFtbGVhZF8x");
HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<PagedResources<WorkbasketSummaryResource>> response = template.exchange(
"http://127.0.0.1:" + port + "/v1/workbaskets?sortBy=key&order=desc&page=2&pagesize=5", HttpMethod.GET,
request,
new ParameterizedTypeReference<PagedResources<WorkbasketSummaryResource>>() {
});
assertEquals(5, response.getBody().getContent().size());
assertEquals("USER_1_1", response.getBody().getContent().iterator().next().key);
assertNotNull(response.getBody().getLink(Link.REL_SELF));
assertTrue(response.getBody()
.getLink(Link.REL_SELF)
.getHref()
.endsWith("/v1/workbaskets?sortBy=key&order=desc&page=2&pagesize=5"));
assertNotNull(response.getBody().getLink("allWorkbaskets"));
assertTrue(response.getBody()
.getLink("allWorkbaskets")
.getHref()
.endsWith("/v1/workbaskets"));
assertNotNull(response.getBody().getLink(Link.REL_FIRST));
assertNotNull(response.getBody().getLink(Link.REL_LAST));
assertNotNull(response.getBody().getLink(Link.REL_NEXT));
assertNotNull(response.getBody().getLink(Link.REL_PREVIOUS));
}
/**

View File

@ -93,18 +93,27 @@ public class WorkbasketController {
@RequestParam(value = "type", required = false) String type,
@RequestParam(value = "requiredPermission", required = false) String requiredPermission,
@RequestParam(value = "page", required = false) String page,
@RequestParam(value = "pagesize", required = false) String pagesize) {
@RequestParam(value = "pagesize", required = false) String pagesize) throws InvalidArgumentException {
WorkbasketQuery query = workbasketService.createWorkbasketQuery();
addSortingToQuery(query, sortBy, order);
addAttributeFilter(query, name, nameLike, key, keyLike, descLike, owner, ownerLike, type);
addAuthorizationFilter(query, requiredPermission);
// long totalElements = query.count();
PageMetadata pageMetadata = new PageMetadata(Integer.MAX_VALUE, 0, 11, 4);
List<WorkbasketSummary> workbasketSummaries = query.listPage((int) pageMetadata.getNumber(),
(int) pageMetadata.getSize());
PageMetadata pageMetadata = null;
List<WorkbasketSummary> workbasketSummaries = null;
if (page != null && pagesize != null) {
// paging
long totalElements = query.count();
pageMetadata = initPageMetadata(pagesize, page, totalElements);
workbasketSummaries = query.listPage((int) pageMetadata.getNumber(),
(int) pageMetadata.getSize());
} else if (page == null && pagesize == null) {
// not paging
workbasketSummaries = query.list();
} else {
throw new InvalidArgumentException("Paging information is incomplete.");
}
WorkbasketSummaryResourcesAssembler assembler = new WorkbasketSummaryResourcesAssembler();
PagedResources<WorkbasketSummaryResource> pagedResources = assembler.toResources(workbasketSummaries,
@ -377,4 +386,19 @@ public class WorkbasketController {
}
}
}
private PageMetadata initPageMetadata(String pagesizeParam, String pageParam, long totalElements)
throws InvalidArgumentException {
long pagesize;
long page;
try {
pagesize = Long.valueOf(pagesizeParam);
page = Long.valueOf(pageParam);
} catch (NumberFormatException e) {
throw new InvalidArgumentException("page and pagesize must be a integer value.");
}
PageMetadata pageMetadata = new PageMetadata(pagesize, page, totalElements, (totalElements / pagesize) + 1);
return pageMetadata;
}
}

View File

@ -1,43 +0,0 @@
package pro.taskana.rest.resource.mapper;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.Resources;
import org.springframework.stereotype.Component;
import pro.taskana.WorkbasketSummary;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.WorkbasketController;
import pro.taskana.rest.resource.WorkbasketSummaryResource;
/**
* Mapper to convert from a list of WorkbasketSummary to a workbasket list resource.
*/
@Component
public class WorkbasketListMapper {
@Autowired
private WorkbasketSummaryMapper workbasketSummaryMapper;
public Resources<WorkbasketSummaryResource> toResource(Collection<WorkbasketSummary> workbasketSummaries)
throws WorkbasketNotFoundException, NotAuthorizedException {
List<WorkbasketSummaryResource> resourceList = new ArrayList<>();
for (WorkbasketSummary workbasket : workbasketSummaries) {
resourceList.add(workbasketSummaryMapper.toResource(workbasket));
}
Resources<WorkbasketSummaryResource> workbasketListResource = new Resources<>(resourceList);
workbasketListResource.add(linkTo(WorkbasketController.class).withSelfRel());
return workbasketListResource;
}
}

View File

@ -38,7 +38,22 @@ public class WorkbasketSummaryResourcesAssembler {
UriComponentsBuilder original = getBuilderForOriginalUri();
pagedResources.add(new Link(original.toUriString()).withSelfRel());
pagedResources.add(linkTo(WorkbasketController.class).withRel("allWorkbaskets"));
if (pageMetadata != null) {
pagedResources.add(linkTo(WorkbasketController.class).withRel("allWorkbaskets"));
pagedResources.add(new Link(original.replaceQueryParam("page", 1).toUriString()).withRel(Link.REL_FIRST));
pagedResources.add(new Link(original.replaceQueryParam("page", pageMetadata.getTotalPages()).toUriString())
.withRel(Link.REL_LAST));
if (pageMetadata.getNumber() > 1) {
pagedResources
.add(new Link(original.replaceQueryParam("page", pageMetadata.getNumber() - 1).toUriString())
.withRel(Link.REL_PREVIOUS));
}
if (pageMetadata.getNumber() < pageMetadata.getTotalPages()) {
pagedResources
.add(new Link(original.replaceQueryParam("page", pageMetadata.getNumber() + 1).toUriString())
.withRel(Link.REL_NEXT));
}
}
return pagedResources;
}