From a16375bb1778ed7e63c5205168aeee3563d0c96d Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 23 Jan 2014 15:41:37 +0100 Subject: [PATCH] DATACMNS-418 - PagedResourcesAssembler now exposes method to append template parameters. PagedResourcesAssembler.appendPaginationParameterTemplates adds the currently missing pagination template variables to the given link. --- .../data/web/PagedResourcesAssembler.java | 23 ++++++++++++-- .../web/PagedResourcesAssemblerUnitTests.java | 30 +++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java b/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java index 3eeb40215..cf7f3ba18 100644 --- a/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java +++ b/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java @@ -113,6 +113,25 @@ public class PagedResourcesAssembler implements ResourceAssembler, Pa return createResource(page, assembler, link); } + /** + * Adds the pagination parameters for all parameters not already present in the given {@link Link}. + * + * @param link must not be {@literal null}. + * @return + */ + public Link appendPaginationParameterTemplates(Link link) { + + Assert.notNull(link, "Link must not be null!"); + + String uri = link.getHref(); + UriTemplate uriTemplate = new UriTemplate(uri); + UriComponents uriComponents = UriComponentsBuilder.fromUriString(uri).build(); + + TemplateVariables variables = pageableResolver.getPaginationTemplateVariables(getMethodParameter(), uriComponents); + + return new Link(uriTemplate.with(variables), link.getRel()); + } + private PagedResources createResource(Page page, ResourceAssembler assembler, Link link) { @@ -144,9 +163,7 @@ public class PagedResourcesAssembler implements ResourceAssembler, Pa foo(resources, page.previousPageable(), uri, Link.REL_PREVIOUS); } - UriComponents uriComponents = UriComponentsBuilder.fromUriString(uri).build(); - TemplateVariables variables = pageableResolver.getPaginationTemplateVariables(getMethodParameter(), uriComponents); - resources.add(new Link(new UriTemplate(uri, variables), Link.REL_SELF)); + resources.add(appendPaginationParameterTemplates(new Link(uri))); return resources; } diff --git a/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java b/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java index d621f67b4..e335d818b 100644 --- a/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java +++ b/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java @@ -55,6 +55,7 @@ public class PagedResourcesAssemblerUnitTests { PagedResources> resources = assembler.toResource(createPage(0)); assertThat(resources.getLink(Link.REL_PREVIOUS), is(nullValue())); + assertThat(resources.getLink(Link.REL_SELF), is(notNullValue())); assertThat(resources.getLink(Link.REL_NEXT), is(notNullValue())); } @@ -65,6 +66,7 @@ public class PagedResourcesAssemblerUnitTests { PagedResources> resources = assembler.toResource(createPage(1)); assertThat(resources.getLink(Link.REL_PREVIOUS), is(notNullValue())); + assertThat(resources.getLink(Link.REL_SELF), is(notNullValue())); assertThat(resources.getLink(Link.REL_NEXT), is(notNullValue())); } @@ -75,6 +77,7 @@ public class PagedResourcesAssemblerUnitTests { PagedResources> resources = assembler.toResource(createPage(2)); assertThat(resources.getLink(Link.REL_PREVIOUS), is(notNullValue())); + assertThat(resources.getLink(Link.REL_SELF), is(notNullValue())); assertThat(resources.getLink(Link.REL_NEXT), is(nullValue())); } @@ -87,6 +90,7 @@ public class PagedResourcesAssemblerUnitTests { PagedResources> resources = assembler.toResource(createPage(1)); assertThat(resources.getLink(Link.REL_PREVIOUS).getHref(), startsWith(baseUri.toUriString())); + assertThat(resources.getLink(Link.REL_SELF), is(notNullValue())); assertThat(resources.getLink(Link.REL_NEXT).getHref(), startsWith(baseUri.toUriString())); } @@ -99,6 +103,7 @@ public class PagedResourcesAssemblerUnitTests { PagedResources> resources = assembler.toResource(createPage(1), link); assertThat(resources.getLink(Link.REL_PREVIOUS).getHref(), startsWith(link.getHref())); + assertThat(resources.getLink(Link.REL_SELF), is(notNullValue())); assertThat(resources.getLink(Link.REL_NEXT).getHref(), startsWith(link.getHref())); } @@ -117,6 +122,31 @@ public class PagedResourcesAssemblerUnitTests { assembler.toResource(page); } + /** + * @see DATACMNS-418 + */ + @Test + public void addsSelfLinkWithPaginationTemplateVariables() { + + PagedResourcesAssembler assembler = new PagedResourcesAssembler(resolver, null); + PagedResources> resources = assembler.toResource(createPage(1)); + + Link selfLink = resources.getLink(Link.REL_SELF); + assertThat(selfLink.getHref(), endsWith("{?page,size,sort}")); + } + + /** + * @see DATACMNS-418 + */ + @Test + public void appendsMissingTemplateParametersToLink() { + + PagedResourcesAssembler assembler = new PagedResourcesAssembler(resolver, null); + + Link link = new Link("/foo?page=0"); + assertThat(assembler.appendPaginationParameterTemplates(link), is(new Link("/foo?page=0{&size,sort}"))); + } + private static Page createPage(int index) { AbstractPageRequest request = new PageRequest(index, 1);