diff --git a/src/main/java/org/springframework/data/web/HateoasPageableHandlerMethodArgumentResolver.java b/src/main/java/org/springframework/data/web/HateoasPageableHandlerMethodArgumentResolver.java index 7927a3082..0bd5b980c 100644 --- a/src/main/java/org/springframework/data/web/HateoasPageableHandlerMethodArgumentResolver.java +++ b/src/main/java/org/springframework/data/web/HateoasPageableHandlerMethodArgumentResolver.java @@ -15,6 +15,8 @@ */ package org.springframework.data.web; +import static org.springframework.hateoas.TemplateVariable.VariableType.*; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -22,9 +24,11 @@ import java.util.List; import org.springframework.core.MethodParameter; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.TemplateVariable; +import org.springframework.hateoas.TemplateVariable.VariableType; +import org.springframework.hateoas.TemplateVariables; import org.springframework.hateoas.mvc.UriComponentsContributor; import org.springframework.util.MultiValueMap; -import org.springframework.util.StringUtils; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -90,40 +94,27 @@ public class HateoasPageableHandlerMethodArgumentResolver extends PageableHandle * @return * @since 1.7 */ - public String getPaginationTemplateVariables(MethodParameter parameter, UriComponents template) { + public TemplateVariables getPaginationTemplateVariables(MethodParameter parameter, UriComponents template) { String pagePropertyName = getParameterNameToUse(getPageParameterName(), parameter); String sizePropertyName = getParameterNameToUse(getSizeParameterName(), parameter); - List names = new ArrayList(); + List names = new ArrayList(); MultiValueMap queryParameters = template.getQueryParams(); - boolean existingFound = false; + boolean append = !queryParameters.isEmpty(); for (String propertyName : Arrays.asList(pagePropertyName, sizePropertyName)) { if (!queryParameters.containsKey(propertyName)) { - names.add(propertyName); - } else { - existingFound = true; + + VariableType type = append ? REQUEST_PARAM_CONTINUED : REQUEST_PARAM; + String description = String.format("pagination.%s.description", propertyName); + names.add(new TemplateVariable(propertyName, type, description)); } } - String sortTemplateVariables = sortResolver.getSortTemplateVariables(parameter, template); - - if (StringUtils.hasText(sortTemplateVariables)) { - names.add(sortTemplateVariables.substring(2, sortTemplateVariables.length() - 1)); - } - - if (names.isEmpty()) { - return ""; - } - - StringBuilder builder = new StringBuilder(); - builder.append(existingFound ? "{&" : "{?"); - builder.append(StringUtils.collectionToCommaDelimitedString(names)); - builder.append("}"); - - return builder.toString(); + TemplateVariables pagingVariables = new TemplateVariables(names); + return pagingVariables.concat(sortResolver.getSortTemplateVariables(parameter, template)); } /* diff --git a/src/main/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolver.java b/src/main/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolver.java index 7b02b2960..d3b465d17 100644 --- a/src/main/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolver.java +++ b/src/main/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolver.java @@ -15,10 +15,15 @@ */ package org.springframework.data.web; +import static org.springframework.hateoas.TemplateVariable.VariableType.*; + import java.util.List; import org.springframework.core.MethodParameter; import org.springframework.data.domain.Sort; +import org.springframework.hateoas.TemplateVariable; +import org.springframework.hateoas.TemplateVariable.VariableType; +import org.springframework.hateoas.TemplateVariables; import org.springframework.hateoas.mvc.UriComponentsContributor; import org.springframework.util.Assert; import org.springframework.util.MultiValueMap; @@ -44,12 +49,19 @@ public class HateoasSortHandlerMethodArgumentResolver extends SortHandlerMethodA * @return * @since 1.7 */ - public String getSortTemplateVariables(MethodParameter parameter, UriComponents template) { + public TemplateVariables getSortTemplateVariables(MethodParameter parameter, UriComponents template) { String sortParameter = getSortParameter(parameter); MultiValueMap queryParameters = template.getQueryParams(); + boolean append = !queryParameters.isEmpty(); - return queryParameters.containsKey(sortParameter) ? "" : String.format("{?%s}", sortParameter); + if (queryParameters.containsKey(sortParameter)) { + return TemplateVariables.NONE; + } + + String description = String.format("pagination.%s.description", sortParameter); + VariableType type = append ? REQUEST_PARAM_CONTINUED : REQUEST_PARAM; + return new TemplateVariables(new TemplateVariable(sortParameter, type, description)); } /* diff --git a/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java b/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java index 038e807b0..3eeb40215 100644 --- a/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java +++ b/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java @@ -29,6 +29,8 @@ import org.springframework.hateoas.PagedResources.PageMetadata; import org.springframework.hateoas.Resource; import org.springframework.hateoas.ResourceAssembler; import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.TemplateVariables; +import org.springframework.hateoas.UriTemplate; import org.springframework.util.Assert; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import org.springframework.web.util.UriComponents; @@ -143,8 +145,8 @@ public class PagedResourcesAssembler implements ResourceAssembler, Pa } UriComponents uriComponents = UriComponentsBuilder.fromUriString(uri).build(); - resources.add(new Link(uri + pageableResolver.getPaginationTemplateVariables(getMethodParameter(), uriComponents), - Link.REL_SELF)); + TemplateVariables variables = pageableResolver.getPaginationTemplateVariables(getMethodParameter(), uriComponents); + resources.add(new Link(new UriTemplate(uri, variables), Link.REL_SELF)); return resources; } diff --git a/src/test/java/org/springframework/data/web/HateoasPageableHandlerMethodArgumentResolverUnitTests.java b/src/test/java/org/springframework/data/web/HateoasPageableHandlerMethodArgumentResolverUnitTests.java index 65e21d4e8..8145d8a6c 100644 --- a/src/test/java/org/springframework/data/web/HateoasPageableHandlerMethodArgumentResolverUnitTests.java +++ b/src/test/java/org/springframework/data/web/HateoasPageableHandlerMethodArgumentResolverUnitTests.java @@ -84,6 +84,7 @@ public class HateoasPageableHandlerMethodArgumentResolverUnitTests extends public void appendsTemplateVariablesCorrectly() { assertTemplateEnrichment("/foo", "{?page,size,sort}"); + assertTemplateEnrichment("/foo?bar=1", "{&page,size,sort}"); assertTemplateEnrichment("/foo?page=1", "{&size,sort}"); assertTemplateEnrichment("/foo?page=1&size=10", "{&sort}"); assertTemplateEnrichment("/foo?page=1&sort=foo,asc", "{&size}"); @@ -100,7 +101,7 @@ public class HateoasPageableHandlerMethodArgumentResolverUnitTests extends HateoasPageableHandlerMethodArgumentResolver resolver = getResolver(); resolver.setPageParameterName("foo"); - String variables = resolver.getPaginationTemplateVariables(null, uriComponents); + String variables = resolver.getPaginationTemplateVariables(null, uriComponents).toString(); assertThat(variables, is("{?foo,size,sort}")); } @@ -128,6 +129,6 @@ public class HateoasPageableHandlerMethodArgumentResolverUnitTests extends UriComponents uriComponents = UriComponentsBuilder.fromUriString(baseUri).build(); HateoasPageableHandlerMethodArgumentResolver resolver = getResolver(); - assertThat(resolver.getPaginationTemplateVariables(null, uriComponents), is(expected)); + assertThat(resolver.getPaginationTemplateVariables(null, uriComponents).toString(), is(expected)); } } diff --git a/src/test/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolverUnitTests.java b/src/test/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolverUnitTests.java index 7b7821373..1391ce982 100644 --- a/src/test/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolverUnitTests.java +++ b/src/test/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolverUnitTests.java @@ -61,7 +61,7 @@ public class HateoasSortHandlerMethodArgumentResolverUnitTests extends SortHandl UriComponents uriComponents = UriComponentsBuilder.fromPath("/").build(); HateoasSortHandlerMethodArgumentResolver resolver = new HateoasSortHandlerMethodArgumentResolver(); - assertThat(resolver.getSortTemplateVariables(null, uriComponents), is("{?sort}")); + assertThat(resolver.getSortTemplateVariables(null, uriComponents).toString(), is("{?sort}")); } private void assertUriStringFor(Sort sort, String expected) throws Exception {