package org.joget.workflow.shark;
import org.joget.commons.util.LogUtil;
import org.enhydra.shark.StandardToolActivityHandler;
import org.enhydra.shark.api.client.wfmc.wapi.WMSessionHandle;
import org.enhydra.shark.api.internal.toolagent.ToolAgentGeneralException;
import org.enhydra.shark.api.internal.working.WfActivityInternal;
import org.springframework.context.ApplicationContext;
import org.joget.workflow.model.WorkflowAssignment;
import org.joget.workflow.model.WorkflowVariable;
import org.joget.workflow.util.WorkflowUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.joget.workflow.model.dao.WorkflowHelper;
import org.joget.workflow.model.service.WorkflowManager;
public class WorkflowToolActivityHandler extends StandardToolActivityHandler {
public WorkflowToolActivityHandler() {
super();
}
@Override
public void executeActivity(WMSessionHandle shandle, WfActivityInternal act) throws Exception, ToolAgentGeneralException {
ApplicationContext appContext = WorkflowUtil.getApplicationContext();
WorkflowHelper workflowMapper = (WorkflowHelper) appContext.getBean("workflowHelper");
WorkflowAssignment workflowAssignment = null;
try {
String processId = act.container(shandle).manager(shandle).name(shandle);
String activityId = act.activity_definition_id(shandle);
String version = act.container(shandle).manager(shandle).version(shandle);
// retrieve assignment
workflowAssignment = new WorkflowAssignment();
workflowAssignment.setProcessId(act.process_id(shandle));
workflowAssignment.setProcessDefId(processId);
workflowAssignment.setProcessName(act.container(shandle).name(shandle));
workflowAssignment.setProcessVersion(version);
workflowAssignment.setProcessRequesterId((String) shandle.getVendorData());
workflowAssignment.setDescription(act.description(shandle));
workflowAssignment.setActivityDefId(activityId);
workflowAssignment.setActivityId(act.key(shandle));
workflowAssignment.setActivityName(act.name(shandle));
workflowAssignment.setAssigneeId(act.getPerformerId(shandle));
//call this just to set process link for subflow
WorkflowManager workflowManager = (WorkflowManager) appContext.getBean("workflowManager");
workflowManager.getProcessDefIdByInstanceId(workflowAssignment.getProcessId());
// retrieve workflow variables
List<WorkflowVariable> processVariableList = new ArrayList();
Map variableMap = act.process_context(shandle);
Iterator it = variableMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> pairs = (Map.Entry) it.next();
WorkflowVariable var = new WorkflowVariable();
var.setId(pairs.getKey());
var.setVal(pairs.getValue());
processVariableList.add(var);
}
workflowAssignment.setProcessVariableList(processVariableList);
// execute tool
WorkflowUtil.addAuditTrail(this.getClass().getName(), "executeTool", workflowAssignment.getActivityId(), new Class[]{WorkflowAssignment.class}, new Object[]{workflowAssignment}, null);
if(!workflowMapper.executeTool(workflowAssignment)){
WorkflowUtil.addAuditTrail(this.getClass().getName(), "executeActivity", "Could not execute tool [processId=" + act.container(shandle).manager(shandle).name(shandle) + ", version=" + act.container(shandle).manager(shandle).version(shandle) + ", activityId=" + act.activity_definition_id(shandle) + "]", new Class[]{WorkflowAssignment.class}, new Object[]{workflowAssignment}, null);
}else{
WorkflowUtil.addAuditTrail(this.getClass().getName(), "executeToolCompleted", workflowAssignment.getActivityId(), new Class[]{WorkflowAssignment.class}, new Object[]{workflowAssignment}, null);
}
} catch (Throwable ex) {
workflowMapper.addAuditTrail(this.getClass().getName(), "executeActivity", "Could not execute tool [processId=" + act.container(shandle).manager(shandle).name(shandle) + ", version=" + act.container(shandle).manager(shandle).version(shandle) + ", activityId=" + act.activity_definition_id(shandle) + "]", new Class[]{WorkflowAssignment.class}, new Object[]{workflowAssignment}, null);
LogUtil.error(getClass().getName(), ex, "Could not execute tool [processId=" + act.container(shandle).manager(shandle).name(shandle) + ", version=" + act.container(shandle).manager(shandle).version(shandle) + ", activityId=" + act.activity_definition_id(shandle) + "]");
}
}
}