DATACMNS-418 - Use TemplateVariables value type for pagination templates.

Changed Hateoas(Pageable|Sort)HandlerMethodArgumentResolver to use newly introduced TypeVariables abstraction to avoid having to deal with string representations manually.

The registered TemplateVariables carry a "pagination.….description" key to be resolved against a MessageSource.
This commit is contained in:
Oliver Gierke
2014-01-20 16:51:09 +01:00
parent 0f38612dab
commit 0ce214cd56
5 changed files with 36 additions and 30 deletions

View File

@@ -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<String> names = new ArrayList<String>();
List<TemplateVariable> names = new ArrayList<TemplateVariable>();
MultiValueMap<String, String> 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));
}
/*

View File

@@ -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<String, String> 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));
}
/*

View File

@@ -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<T> implements ResourceAssembler<Page<T>, 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;
}

View File

@@ -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));
}
}

View File

@@ -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 {