HandlerMethodInvoker.java

package sprout.mvc.invoke;

import sprout.beans.annotation.Component;
import sprout.mvc.http.HttpRequest;
import sprout.mvc.argument.CompositeArgumentResolver;
import sprout.mvc.mapping.PathPattern;
import sprout.mvc.mapping.RequestMappingInfo;

import java.util.Map;

@Component
public class HandlerMethodInvoker {
    private final CompositeArgumentResolver resolvers;

    public HandlerMethodInvoker(CompositeArgumentResolver resolvers) {
        this.resolvers = resolvers;
    }

    public Object invoke(RequestMappingInfo requestMappingInfo, HttpRequest<?> request) throws Exception {
        PathPattern pattern = requestMappingInfo.pattern();
        Map<String, String> pathVariables = pattern.extractPathVariables(request.getPath());

        Object[] args = resolvers.resolveArguments(requestMappingInfo.handlerMethod(), request, pathVariables);
        return requestMappingInfo.handlerMethod().invoke(requestMappingInfo.controller(), args);
    }
}