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