package org.springframework.data.web;
import static org.springframework.hateoas.TemplateVariable.VariableType.*;
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.server.mvc.UriComponentsContributor;
import org.springframework.lang.Nullable;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
@SuppressWarnings("null")
public class HateoasSortHandlerMethodArgumentResolver extends SortHandlerMethodArgumentResolver
implements UriComponentsContributor {
public TemplateVariables getSortTemplateVariables(MethodParameter parameter, UriComponents template) {
String sortParameter = getSortParameter(parameter);
MultiValueMap<String, String> queryParameters = template.getQueryParams();
boolean append = !queryParameters.isEmpty();
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));
}
@Override
public void enhance(UriComponentsBuilder builder, @Nullable MethodParameter parameter, @Nullable Object value) {
if (!(value instanceof Sort)) {
return;
}
Sort sort = (Sort) value;
String sortParameter = getSortParameter(parameter);
builder.replaceQueryParam(sortParameter);
for (String expression : foldIntoExpressions(sort)) {
builder.queryParam(sortParameter, expression);
}
}
}