/// <summary> /// Updates task state for a given taskId based on the task event /// </summary> private void UpdateState(string taskId, TaskStateEvent taskEvent) { var taskInfo = GetTaskInfo(taskId); RecordingTime(taskId, taskInfo, taskEvent); taskInfo.TaskState.MoveNext(taskEvent); taskInfo.TimeStateUpdated = DateTime.Now; }
/// <summary> /// Recording timing from one task state to another /// The method can be extended to record the time for other task states /// The log level should be changed to verb once we complete the testing /// </summary> private void RecordingTime(string taskId, TaskInfo taskInfo, TaskStateEvent taskEvent) { if (taskInfo.TaskState.CurrentState.Equals(TaskState.TaskWaitingForClose) && taskEvent.Equals(TaskStateEvent.CompletedTask)) { var timeSpan = DateTime.Now - taskInfo.TimeStateUpdated; _totalNumberOfClosedTasksByDriver++; _totalTaskClosingTimeSpan = _totalTaskClosingTimeSpan.Add(timeSpan); Logger.Log(Level.Info, "RecordClosingTime for task id {0}, closing time: {1}, average closing time: {2}.", taskId, timeSpan.Milliseconds, _totalTaskClosingTimeSpan.Milliseconds / _totalNumberOfClosedTasksByDriver); } }
/// <summary> /// Get next valid state based on the current state and event given without changing the current state /// If there is no valid next state, TaskStateTransitionException will be thrown. /// </summary> /// <param name="taskEvent"></param> /// <returns></returns> internal TaskState GetNext(TaskStateEvent taskEvent) { StateTransition <TaskState, TaskStateEvent> transition = new StateTransition <TaskState, TaskStateEvent>(_currentState, taskEvent); TaskState nextState; if (!Transitions.TryGetValue(transition, out nextState)) { throw new TaskStateTransitionException(_currentState, taskEvent); } return(nextState); }
/// <summary> /// Move to the next state /// If it is not able to move to the next valid state for a given event, TaskStateTransitionException will be thrown. /// </summary> /// <param name="taskEvent"></param> /// <returns></returns> internal TaskState MoveNext(TaskStateEvent taskEvent) { _currentState = GetNext(taskEvent); return(_currentState); }
/// <summary> /// Updates task state for a given taskId based on the task event /// </summary> /// <param name="taskId"></param> /// <param name="taskEvent"></param> private void UpdateState(string taskId, TaskStateEvent taskEvent) { GetTaskInfo(taskId).TaskState.MoveNext(taskEvent); }
/// <summary> /// Exception when error happens in task state transition /// </summary> /// <param name="taskState"></param> /// <param name="taskEvent"></param> internal TaskStateTransitionException(TaskState taskState, TaskStateEvent taskEvent) : base(ExceptionMessage(taskState, taskEvent)) { }
/// <summary> /// Format a message /// </summary> /// <param name="taskState"></param> /// <param name="taskEvent"></param> /// <returns></returns> private static string ExceptionMessage(TaskState taskState, TaskStateEvent taskEvent) { return(string.Format(CultureInfo.InvariantCulture, "Unexpected event {0} in state {1}.", taskEvent, taskState)); }
/// <summary> /// Move to the next state /// If it is not able to move to the next valid state for a given event, TaskStateTransitionException will be thrown. /// </summary> /// <param name="taskEvent"></param> /// <returns></returns> internal TaskState MoveNext(TaskStateEvent taskEvent) { _currentState = GetNext(taskEvent); return _currentState; }
/// <summary> /// Get next valid state based on the current state and event given without changing the current state /// If there is no valid next state, TaskStateTransitionException will be thrown. /// </summary> /// <param name="taskEvent"></param> /// <returns></returns> internal TaskState GetNext(TaskStateEvent taskEvent) { StateTransition<TaskState, TaskStateEvent> transition = new StateTransition<TaskState, TaskStateEvent>(_currentState, taskEvent); TaskState nextState; if (!Transitions.TryGetValue(transition, out nextState)) { throw new TaskStateTransitionException(_currentState, taskEvent); } return nextState; }
/// <summary> /// Updates task state for a given taskId based on the task event /// </summary> /// <param name="taskId"></param> /// <param name="taskEvent"></param> private void UpdateState(string taskId, TaskStateEvent taskEvent) { GetTaskInfo(taskId).TaskState.MoveNext(taskEvent); }
/// <summary> /// Format a message /// </summary> /// <param name="taskState"></param> /// <param name="taskEvent"></param> /// <returns></returns> private static string ExceptionMessage(TaskState taskState, TaskStateEvent taskEvent) { return string.Format(CultureInfo.InvariantCulture, "Unexpected event {0} in state {1}.", taskEvent, taskState); }
/// <summary> /// Exception when error happens in task state transition /// </summary> /// <param name="taskState"></param> /// <param name="taskEvent"></param> internal TaskStateTransitionException(TaskState taskState, TaskStateEvent taskEvent) : base(ExceptionMessage(taskState, taskEvent)) { }