/// <summary> /// Cancel active transition. /// Returns tokens to input places if the transition has been STARTED. /// </summary> /// <param name="correlationId"></param> private void CancelTransition(string correlationId) { TaskShell at = GetActiveTransition(correlationId); if (at == null) throw new Exception("Invalid correlation Id"); log.Info("Cancelling transition {0}", at.ToString()); if (at.Status != TransitionStatus.ENABLED && at.Status != TransitionStatus.STARTED) throw new Exception("Invalid transition status"); if (at.Status == TransitionStatus.STARTED) { //return tokens to input places foreach (string plid in at.AllocatedPlaces) { AddToken(plid); } } at.CancelTask(); at.Status = TransitionStatus.CANCELLED; ActiveTransitionCancelled ac = new ActiveTransitionCancelled(); ac.CorrelationId = at.CorrelationId; ac.DefinitionId = ProcessDefinitionId; ac.InstanceId = InstanceId; ac.TaskId = at.TaskId; ac.TaskType = Definition.GetTask(at.TaskId).GetType().Name; NotifyProcessEvent(ac); }
/// <summary> /// Cancel active transition instance /// How do we do that? /// 1. Do activity-specific cancellation /// 2. Update status of each input token: if it has no more enabled transitions, put it into READY state. Otherwise, leave it in WAITING_TASK /// </summary> /// <param name="at"></param> private void CancelActiveTransition(TaskShell at) { log.Info("Cancelling transition {0}", at.CorrelationId); if (at.IsImmediate) throw new Exception("Cannot cancel an immediate transition"); if (at.Status != TransitionStatus.ENABLED && at.Status != TransitionStatus.STARTED) throw new Exception("Invalid transition status"); at.CancelTask(); Debug.Assert(at.Status == TransitionStatus.CANCELLED); foreach (string t in at.Tokens) { Token tok = GetToken(t); Debug.Assert(tok.Status == TokenStatus.LOCKED_ENABLED || tok.Status == TokenStatus.LOCKED_ALLOCATED); Debug.Assert(tok.ActiveTransitions.Contains(at.CorrelationId)); if (!tok.ActiveTransitions.Remove(at.CorrelationId)) throw new Exception("Error removing transition id from token"); //should never happen if (tok.ActiveTransitions.Count == 0) { tok.Status = TokenStatus.READY; } } ActiveTransitionCancelled ac = new ActiveTransitionCancelled(); ac.CorrelationId = at.CorrelationId; ac.DefinitionId = ProcessDefinitionId; ac.InstanceId = InstanceId; ac.TaskId = at.TaskId; ac.TaskType = Definition.GetTask(at.TaskId).GetType().Name; NotifyProcessEvent(ac); }