TSK-217: pagination support for WorkbasketController and first page to be number 1.
This commit is contained in:
parent
15dee0c269
commit
4765fc242a
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue