From 1fb7466065fe387ddb8c05492bba9ef5c2b8a46d Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 20 May 2015 13:33:53 +0200 Subject: [PATCH] DATACMNS-701 - First and last links are now always rendered for navigable PagedResources. We now always render both first and last links in case the page returned is navigable, which essentially means: whenever the result spans across more than one page. I.e. whenever either a next or prev link will be rendered, both first and last links are rendered, too. Clients can still reason about the fact whether they're on the first or last page by the non-presence of prev (indicates you're on the first page) or next (indicates you're on the last page). --- .../data/web/PagedResourcesAssembler.java | 10 ++++++---- .../data/web/PagedResourcesAssemblerUnitTests.java | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java b/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java index 6c0442aaf..12bef4844 100644 --- a/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java +++ b/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java @@ -189,7 +189,9 @@ public class PagedResourcesAssembler implements ResourceAssembler, Pa UriTemplate base = getUriTemplate(link); - if (page.hasPrevious() || forceFirstAndLastRels) { + boolean isNavigable = page.hasPrevious() || page.hasNext(); + + if (isNavigable || forceFirstAndLastRels) { resources.add(createLink(base, new PageRequest(0, page.getSize(), page.getSort()), Link.REL_FIRST)); } @@ -203,7 +205,7 @@ public class PagedResourcesAssembler implements ResourceAssembler, Pa resources.add(createLink(base, page.nextPageable(), Link.REL_NEXT)); } - if (page.hasNext() || forceFirstAndLastRels) { + if (isNavigable || forceFirstAndLastRels) { int lastIndex = page.getTotalPages() == 0 ? 0 : page.getTotalPages() - 1; @@ -221,8 +223,8 @@ public class PagedResourcesAssembler implements ResourceAssembler, Pa */ private UriTemplate getUriTemplate(Link baseLink) { - String href = baseLink != null ? baseLink.getHref() : baseUri == null ? ServletUriComponentsBuilder - .fromCurrentRequest().build().toString() : baseUri.toString(); + String href = baseLink != null ? baseLink.getHref() + : baseUri == null ? ServletUriComponentsBuilder.fromCurrentRequest().build().toString() : baseUri.toString(); return new UriTemplate(href); } diff --git a/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java b/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java index 68f7983b7..35cb181fb 100644 --- a/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java +++ b/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java @@ -238,11 +238,11 @@ public class PagedResourcesAssemblerUnitTests { * @see DATACMNS-701 */ @Test - public void doesNotAddFirstLinkForFirstPageByDefault() { + public void addsFirstAndLastLinksForFirstPage() { PagedResources> resources = assembler.toResource(createPage(0)); - assertThat(resources.getLink(Link.REL_FIRST), is(nullValue())); + assertThat(resources.getLink(Link.REL_FIRST).getHref(), endsWith("?page=0&size=1")); assertThat(resources.getLink(Link.REL_LAST).getHref(), endsWith("?page=2&size=1")); } @@ -250,12 +250,12 @@ public class PagedResourcesAssemblerUnitTests { * @see DATACMNS-701 */ @Test - public void doesNotAddLastLinkForLastPageByDefault() { + public void addsFirstAndLastLinksForLastPage() { PagedResources> resources = assembler.toResource(createPage(2)); assertThat(resources.getLink(Link.REL_FIRST).getHref(), endsWith("?page=0&size=1")); - assertThat(resources.getLink(Link.REL_LAST), is(nullValue())); + assertThat(resources.getLink(Link.REL_LAST).getHref(), endsWith("?page=2&size=1")); } /**