AllHeaderArgumentResolver.java

package sprout.mvc.argument.builtins;

import sprout.beans.annotation.Component;
import sprout.mvc.annotation.Header;
import sprout.mvc.argument.ArgumentResolver;
import sprout.mvc.http.HttpRequest;

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

@Component
public class AllHeaderArgumentResolver implements ArgumentResolver {

    @Override
    public boolean supports(Parameter parameter) {
        return parameter.isAnnotationPresent(Header.class) && parameter.getAnnotation(Header.class).value().isEmpty();
    }

    @Override
    public Object resolve(Parameter parameter, HttpRequest<?> request, Map<String, String> pathVariables) throws Exception {
        Header headerAnnotation = parameter.getAnnotation(Header.class);
        if (headerAnnotation == null) {          // 어노테이션이 없으면 이 Resolver 가 처리 대상 아님
            return null;
        }
        String headerName = headerAnnotation.value();
        if (parameter.getType().equals(Map.class)) {
            if (headerName.isBlank()) { // @Header("") 또는 @Header(value="") 인 경우
                return request.getHeaders();
            } else {
                // @Header("SpecificHeader") Map<String, String> 처럼 오는 경우 (사용 안 함)
                throw new IllegalArgumentException("Cannot bind specific header '" + headerName + "' to a Map parameter. Use Map<String, String> without @Header for all headers.");
            }
        }
        return null;
    }
}