package foundation.action; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import foundation.dao.DataReader; import foundation.dao.DataWriter; import foundation.dao.bizlogic.IActionProvider; import foundation.handler.DataPool; import foundation.handler.ResultPool; import foundation.handler.SingletonHandler; import foundation.route.Operation; public abstract class SingletonActionProvider extends SingletonHandler implements IActionProvider { @Override public void exec(ActionContext context, String methodName) throws Exception { Method method = getMethod(methodName); if (method == null) { logger.error("method exec error: {} not exists", methodName); return; } try { method.invoke(this, context); } catch (InvocationTargetException e) { e.printStackTrace(); Throwable throwable = e.getTargetException(); if (throwable == null) { throw e; } else { throw (Exception) throwable; } } } public void test(ActionContext context, String methodName) throws Exception { logger.info("action provider {}.{} test", context.getActionName(), methodName); } @Override protected void invokeMethod(Method method, DataPool dataPool, ResultPool resultPool) throws Exception { //1. Operation operation = dataPool.getOperation(); DataReader dataReader = new DataReader(operation, dataPool); DataWriter dataWriter = new DataWriter(resultPool, dataReader.getDomain()); resultPool.setLetterWriter(dataWriter); String dataName = dataReader.getDomain().getDataName(); WorkStep step = new WorkStep(dataName, operation.getOperator()); ActionContext context = new ActionContext(dataReader, dataWriter, step); //2. try { method.invoke(this, context); } catch (InvocationTargetException e) { e.printStackTrace(); Throwable throwable = e.getTargetException(); if (throwable == null) { throw e; } else { throw (Exception) throwable; } } } public void terminateTask(ActionContext context) { IWorkflowRuntime task = context.getWorkFlow(); if (task != null) { task.terminate(); } } @Override protected boolean validateMethodParameter(Class[] parameters) { if (parameters == null || parameters.length != 1) { return false; } Class type = parameters[0]; return type.isAssignableFrom(ActionContext.class); } }