package foundation.action; import foundation.dao.DataPackage; import foundation.dao.DataReader; import foundation.dao.DataWriter; import foundation.dao.OperatorCode; import foundation.dao.bizlogic.IActionProvider; import foundation.handler.ResultPool; import foundation.json.IJSONWriter; import foundation.util.ContentBuilder; import foundation.util.Util; public class ActionContext { private IWorkflowRuntime workFlow; private StateContext stateContext; private String dataName; private DataPackage dataPackage; private IWorkStep step; private ActionMeta actionMeta; private IActionProvider provider; private String param; private DataReader dataReader; private DataWriter dataWriter; public ActionContext() { workFlow = new EmptyWorkflow(); } public ActionContext(DataReader dataReader, DataWriter dataWriter, IWorkStep step) { //1. this.step = step; this.dataName = step.getDataName(); this.dataReader = dataReader; this.dataWriter = dataWriter; //2. provider = step.createActionProvider(); } public ActionContext(StateContext stateContext, WorkFlowRuntime workFlow, IWorkStep step) { //1. this.stateContext = stateContext; this.workFlow = workFlow; this.step = step; this.dataName = step.getDataName(); this.dataReader = workFlow.getDataReader(); this.dataWriter = workFlow.getDataWriter(); //2. provider = step.createActionProvider(); } public ActionContext newInstance() { ActionContext result = new ActionContext(); result.stateContext = stateContext; result.workFlow = workFlow; result.dataReader = dataReader; result.dataWriter = dataWriter; result.step = step; if (step != null) { result.dataName = step.getDataName(); } return result; } public void setDataPackage(DataPackage dataPackage) { this.dataPackage = dataPackage; } public boolean isApprovedByStateEvent() { String eventCode = step.getOnEventCode(); if (Util.isEmpty(eventCode) || StateContext.isEmpty(stateContext) || Util.isEmpty(dataName)) { return true; } return stateContext.isState(dataName, eventCode); } public IWorkflowRuntime getWorkFlow() { return workFlow; } public double getTransactionScore() { return step.getTransactionScore(); } public String getStepName() { return step.getStepName(); } public void terminateTask() { workFlow.terminate(); } public OperatorCode getOperatorCode() { return step.getOperatorCode(); } public DataReader getDataReader() { return dataReader; } public DataWriter getDataWriter() { return dataWriter; } public ResultPool getResultPool() { return dataWriter.getResultPool(); } public IWorkStep getStep() { return step; } public String getDataName() throws Exception { if (dataName == null) { return dataReader.getString("dataname"); } return dataName; } public DataPackage getDataPackage() throws Exception { if (dataPackage == null) { return dataReader.getDataPackage(); } return dataPackage; } public IActionProvider getActionProvider() { return provider; } public String getActionParam() { if (step != null) { return step.getActionParam(); } if (actionMeta != null) { return actionMeta.getParam(); } return null; } public String getStepParam() { if (step != null) { return step.getParam(); } return param; } public String getParam() { return param; } public String getActionName() { if (step != null) { return step.getActionName(); } return param; } public String getMethodName() { if (step != null) { return step.getMethodName(); } if (actionMeta != null) { return actionMeta.getMethodName(); } return null; } public String getDescription() { if (step != null) { String onEvent = step.getOnEventCode(); if (Util.isEmpty(onEvent)) { return step.getActionName(); } return step.getActionName() + "(" + onEvent + ")"; } return param; } public void setStateCode(String dataName, String stateCode) { stateContext.setState(dataName, stateCode); } public void setWorkFlow(WorkFlowRuntime workFlow) { this.workFlow = workFlow; } public T getContext(Class clazz) { return workFlow.getContext(clazz); } public void addContext(Object context) { workFlow.addContext(context); } public void setProvider(IActionProvider provider) { this.provider = provider; } public void setParam(String param) { this.param = param; } public void toString(ContentBuilder result) { step.toString(result); } public void writeJSON(IJSONWriter writer) { writer.beginObject(); step.writeJSONBody(writer); writer.write("param", step.getParam()); writer.endObject(); } public String getParam(String paramName, String defaultValue) { if(dataReader != null) { return dataReader.getString(paramName, defaultValue); } return defaultValue; } }