CompositeArgumentResolver.java

package sprout.mvc.argument;

import sprout.beans.annotation.Component;
import sprout.mvc.http.HttpRequest;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.List;
import java.util.Map;

@Component
public class CompositeArgumentResolver {
    private final List<ArgumentResolver> delegates;

    public CompositeArgumentResolver(List<ArgumentResolver> delegates) {
        this.delegates = delegates;
    }

    public Object[] resolveArguments(Method method, HttpRequest<?> request, Map<String, String> pathVariables) throws Exception {
        Parameter[] params = method.getParameters();
        Object[] args = new Object[params.length];
        for (int i = 0; i < params.length; i++) {
            Parameter p = params[i];
            ArgumentResolver resolver = delegates.stream()
                    .filter(ar -> ar.supports(p))
                    .findFirst()
                    .orElseThrow(() -> new IllegalStateException("No ArgumentResolver for parameter " + p));
            args[i] = resolver.resolve(p, request, pathVariables);
        }
        return args;
    }
}