package core.framework.impl.web;
import core.framework.api.web.Interceptor;
import core.framework.api.web.Invocation;
import core.framework.api.web.Request;
import core.framework.api.web.Response;
import core.framework.api.web.WebContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
/**
* @author neo
*/
public class InvocationImpl implements Invocation {
private final Logger logger = LoggerFactory.getLogger(InvocationImpl.class);
private final ControllerHolder controller;
private final Interceptors interceptors;
private final Request request;
private final WebContextImpl context;
private int currentStack;
public InvocationImpl(ControllerHolder controller, Interceptors interceptors, Request request, WebContextImpl context) {
this.controller = controller;
this.interceptors = interceptors;
this.request = request;
this.context = context;
}
@Override
public <T extends Annotation> T annotation(Class<T> annotationClass) {
Method controllerMethod = controller.targetMethod;
T annotation = controllerMethod.getDeclaredAnnotation(annotationClass);
if (annotation == null)
annotation = controllerMethod.getDeclaringClass().getDeclaredAnnotation(annotationClass);
return annotation;
}
@Override
public WebContext context() {
return context;
}
@Override
public Response proceed() throws Exception {
if (controller.skipInterceptor || currentStack >= interceptors.interceptors.size()) {
logger.debug("execute controller, controller={}", controller.controllerInfo);
return controller.controller.execute(request);
} else {
Interceptor interceptor = interceptors.interceptors.get(currentStack);
currentStack++;
logger.debug("intercept, interceptorClass={}", interceptor.getClass().getCanonicalName());
return interceptor.intercept(this);
}
}
}