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(); } } }