package foundation.handler;
|
|
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.Method;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import foundation.handler.envelop.EnvelopWriter;
|
import foundation.route.Operation;
|
|
|
public abstract class BaseHandler extends MethodPublisher implements IHandler {
|
|
protected static Logger logger;
|
|
static {
|
logger = LogManager.getLogger(Handler.class);
|
}
|
|
public BaseHandler() {
|
|
}
|
|
public void receive(Operation operation, DataPool dataPool, HttpServletResponse response) throws Exception {
|
//1. create pool and writer
|
ResultPool resultPool = new ResultPool(response);
|
|
try {
|
EnvelopWriter writer = new EnvelopWriter(response);
|
|
//2. before execute
|
boolean proceed = beforeDispatch(operation, dataPool, resultPool);
|
|
//3. execute
|
if (proceed) {
|
dispatch(operation, dataPool, resultPool);
|
}
|
|
//4. flush
|
if (resultPool.isFireReplay()) {
|
writer.replay(resultPool);
|
writer.flush();
|
}
|
}
|
finally {
|
resultPool.free();
|
}
|
}
|
|
protected boolean beforeDispatch(Operation operator, DataPool dataPool, ResultPool resultPool) throws Exception {
|
return true;
|
}
|
|
protected void dispatch(Operation operator, DataPool dataPool, ResultPool resultPool) throws Exception {
|
String methodName = operator.getOperator();
|
Method method = methodMap.get(methodName);
|
|
if (method == null) {
|
logger.error("method exec error: {} not exists", methodName);
|
return;
|
}
|
|
try {
|
invokeMethod(method, dataPool, resultPool);
|
}
|
catch (InvocationTargetException e) {
|
e.printStackTrace();
|
Throwable throwable = e.getTargetException();
|
|
if (throwable == null) {
|
throw e;
|
}
|
else {
|
throw (Exception) throwable;
|
}
|
}
|
}
|
|
protected abstract void invokeMethod(Method method, DataPool dataPool, ResultPool resultPool) throws Exception;
|
|
protected void onError(Exception e) throws Exception {
|
logger.error(e);
|
|
if (logger.isTraceEnabled()) {
|
e.printStackTrace();
|
}
|
}
|
|
}
|