diff --git a/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java b/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java index 12bef4844..4c8c118d9 100644 --- a/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java +++ b/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java @@ -170,6 +170,24 @@ public class PagedResourcesAssembler implements ResourceAssembler, Pa return createLink(new UriTemplate(link.getHref()), null, link.getRel()); } + /** + * Creates the {@link PagedResources} to be equipped with pagination links downstream. + * + * @param resources the original page's elements mapped into {@link ResourceSupport} instances. + * @param metadata the calculated {@link PageMetadata}, must not be {@literal null}. + * @param page the original page handed to the assembler, must not be {@literal null}. + * @return must not be {@literal null}. + */ + protected PagedResources createPagedResource(List resources, + PageMetadata metadata, Page page) { + + Assert.notNull(resources, "Content resources must not be null!"); + Assert.notNull(metadata, "PageMetadata must not be null!"); + Assert.notNull(page, "Page must not be null!"); + + return new PagedResources(resources, metadata); + } + private PagedResources createResource(Page page, ResourceAssembler assembler, Link link) { @@ -182,7 +200,9 @@ public class PagedResourcesAssembler implements ResourceAssembler, Pa resources.add(assembler.toResource(element)); } - return addPaginationLinks(new PagedResources(resources, asPageMetadata(page)), page, link); + PagedResources resource = createPagedResource(resources, asPageMetadata(page), page); + + return addPaginationLinks(resource, page, link); } private PagedResources addPaginationLinks(PagedResources resources, Page page, Link link) { diff --git a/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java b/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java index 35cb181fb..556180000 100644 --- a/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java +++ b/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2015 the original author or authors. + * Copyright 2013-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import java.net.URI; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.Map; import org.junit.Before; @@ -33,6 +34,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.hateoas.Link; import org.springframework.hateoas.PagedResources; +import org.springframework.hateoas.PagedResources.PageMetadata; import org.springframework.hateoas.Resource; import org.springframework.hateoas.ResourceAssembler; import org.springframework.hateoas.ResourceSupport; @@ -273,6 +275,18 @@ public class PagedResourcesAssemblerUnitTests { assertThat(resources.getLink(Link.REL_LAST).getHref(), endsWith("?page=0&size=20")); } + /** + * @see DATACMNS-802 + */ + @Test + public void usesCustomPagedResources() { + + ResourceAssembler, PagedResources>> assembler = new CustomPagedResourcesAssembler( + resolver, null); + + assertThat(assembler.toResource(EMPTY_PAGE), is(instanceOf(CustomPagedResources.class))); + } + private static Page createPage(int index) { AbstractPageRequest request = new PageRequest(index, 1); @@ -310,4 +324,24 @@ public class PagedResourcesAssemblerUnitTests { return resource; } } + + static class CustomPagedResourcesAssembler extends PagedResourcesAssembler { + + public CustomPagedResourcesAssembler(HateoasPageableHandlerMethodArgumentResolver resolver, UriComponents baseUri) { + super(resolver, baseUri); + } + + @Override + protected PagedResources createPagedResource(List resources, + PageMetadata metadata, Page page) { + return new CustomPagedResources(resources, metadata); + } + } + + static class CustomPagedResources extends PagedResources { + + public CustomPagedResources(Collection content, PageMetadata metadata) { + super(content, metadata); + } + } }