package eu.codearte.resteeth.handlers;
import eu.codearte.resteeth.annotation.StaticHeader;
import eu.codearte.resteeth.annotation.StaticHeaders;
import eu.codearte.resteeth.core.RestInvocation;
import org.springframework.web.bind.annotation.RequestHeader;
import java.lang.annotation.Annotation;
/**
* @author Jakub Kubrynski
*/
public class HeadersHandler implements RestInvocationHandler {
@Override
public Object proceed(RestInvocation invocation) {
addDynamicHeaders(invocation);
addStaticHeaders(invocation);
return invocation.proceed();
}
private void addDynamicHeaders(RestInvocation invocation) {
Annotation[][] parametersAnnotations = invocation.getMethod().getParameterAnnotations();
for (int i = 0; i < parametersAnnotations.length; i++) {
Annotation[] parameterAnnotation = parametersAnnotations[i];
for (Annotation annotation : parameterAnnotation) {
if (RequestHeader.class.isAssignableFrom(annotation.annotationType())) {
RequestHeader requestHeader = (RequestHeader) annotation;
invocation.getDynamicHeaders().add(requestHeader.value(), String.valueOf(invocation.getArguments()[i]));
}
}
}
}
private void addStaticHeaders(RestInvocation invocation) {
//FIXME should read annotation from metadata - then also interface could be annotated
StaticHeader staticHeader = invocation.getMethod().getAnnotation(StaticHeader.class);
if (staticHeader != null) {
invocation.getMetadata().getHttpHeaders().add(staticHeader.name(), staticHeader.value());
}
StaticHeaders staticHeaders = invocation.getMethod().getAnnotation(StaticHeaders.class);
if (staticHeaders != null) {
for (StaticHeader header : staticHeaders.value()) {
invocation.getMetadata().getHttpHeaders().add(header.name(), header.value());
}
}
}
@Override
public int getOrder() {
return 90;
}
}