public void CancelProcessInstance(String authenticatedActorId, Int64 processInstanceId, DbSession dbSession, IOrganisationService organisationComponent) { // first check if the actor is allowed to cancel this process instance authorizationHelper.CheckCancelProcessInstance(authenticatedActorId, processInstanceId, dbSession); ProcessInstanceImpl processInstance = (ProcessInstanceImpl)dbSession.Load(typeof(ProcessInstanceImpl), processInstanceId); log.Info("actor '" + authenticatedActorId + "' cancels processInstance '" + processInstanceId + "'..."); if (!processInstance.EndHasValue) { CancelFlowRecursive((FlowImpl)processInstance.RootFlow, DateTime.Now); ExecutionContextImpl executionContext = new ExecutionContextImpl(authenticatedActorId, (FlowImpl)processInstance.RootFlow, dbSession, organisationComponent); executionContext.CreateLog(authenticatedActorId, EventType.PROCESS_INSTANCE_CANCEL); EndStateImpl endState = (EndStateImpl)processInstance.ProcessDefinition.EndState; engine.ProcessEndState(endState, executionContext, dbSession); processInstance.End = DateTime.Now; // flush the updates to the db dbSession.Update(processInstance); dbSession.Flush(); } else { throw new SystemException("couldn't cancel process instance : process instance '" + processInstanceId + "' was already finished"); } }