package net.eusashead.bjugquerydsl.controller;
import java.util.Map;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
public class SkuSearchRequestHandlerMethodArgumentResolver implements
HandlerMethodArgumentResolver {
private static final String PRICE_MIN = "price.min";
private static final String PRICE_MAX = "price.max";
private static final String ATTR_PREFIX = "attr.";
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer container, NativeWebRequest request,
WebDataBinderFactory factory) throws Exception {
// Create request builder
SkuSearchRequestBuilder builder = new SkuSearchRequestBuilder();
// Get minimum price if set
if (assertParameter(PRICE_MIN, request)) {
Double minPrice = Double.valueOf(request.getParameterValues(PRICE_MIN)[0]);
builder.minPrice(minPrice);
}
// Get max price if set
if (assertParameter(PRICE_MAX, request)) {
Double maxPrice = Double.valueOf(request.getParameterValues(PRICE_MAX)[0]);
builder.maxPrice(maxPrice);
}
// Get attributes map
Map<String, String[]> attrs = request.getParameterMap();
for (String name : attrs.keySet()) {
if (name.startsWith(ATTR_PREFIX)) {
if (assertParameter(name, request)) {
builder.attribute(name.substring(ATTR_PREFIX.length()), attrs.get(name));
}
}
}
// return the request
return builder.build();
}
private boolean assertParameter(String parameter, NativeWebRequest request) {
String[] parameterValues = request.getParameterValues(parameter);
return (parameterValues != null) && (parameterValues.length >= 1);
}
@Override
public boolean supportsParameter(MethodParameter parameter) {
return SkuSearchRequest.class.equals(parameter.getParameterType());
}
}