Exemplo n.º 1
0
 private void ThrowIfMovingExpandLockedWorkItem(WorkItemTransition transition)
 {
     if (WorkflowRepository.IsExpandLockedWorkItem(transition.WorkItem))
     {
         throw new InvalidOperationException("Item is expandlocked and cannot be moved");
     }
 }
Exemplo n.º 2
0
 private void ThrowIfViolatingWipLimit(WorkItemTransition transition)
 {
     if (!WipLimitChecker.CanAcceptWorkItem(transition.WorkItem.MoveTo(transition.WorkStep, _timeSource.GetTime())))
     {
         throw new WipLimitViolationException(transition.WorkItem, transition.WorkStep);
     }
 }
Exemplo n.º 3
0
        private void Move(WorkItem workItem, WorkStep toStep)
        {
            var transition = new WorkItemTransition(workItem, toStep);

            ThrowIfMovingParallelLockedWorkItem(transition);

            ThrowIfMovingExpandLockedWorkItem(transition);

            ThrowIfViolatingWipLimit(transition);

            if (IsMovingWithinParallelStep(transition))
            {
                MoveToWithinParallelStep(transition);
            }
            else
            {
                ThrowIfMovingToWithinExpandStep(transition);

                ThrowIfMovingToStepWithWrongClass(transition);

                CleanUpIfMovingFromExpandStep(transition);

                transition = AttemptMergeIfMovingChildOfParallelledWorkItem(transition);

                transition = CreateTransitionIfMovingToExpandStep(transition);

                var resultTransition = DoMove(transition);

                TryUpdatingExpandLockIfMovingChildOfExpandedWorkItem(resultTransition);
            }
        }
Exemplo n.º 4
0
 private void TryUpdatingExpandLockIfMovingChildOfExpandedWorkItem(WorkItemTransition resultTransition)
 {
     if (WorkflowRepository.IsChildOfExpandedWorkItem(resultTransition.WorkItem))
     {
         TryUpdatingExpandLockOnParent(resultTransition.WorkItem);
     }
 }
Exemplo n.º 5
0
 private void ThrowIfMovingToStepWithWrongClass(WorkItemTransition transition)
 {
     if (!WorkflowRepository.IsValidWorkStepForWorkItem(transition.WorkItem, transition.WorkStep))
     {
         throw new InvalidOperationException("Invalid step for work item");
     }
 }
Exemplo n.º 6
0
 private void ThrowIfMovingParallelLockedWorkItem(WorkItemTransition transition)
 {
     if (WorkflowRepository.IsParallelLockedWorkItem(transition.WorkItem))
     {
         throw new InvalidOperationException("Work item is locked for parallel work");
     }
 }
Exemplo n.º 7
0
        private WorkItemTransition DoMove(WorkItemTransition transition)
        {
            var movedWorkItem = transition.WorkItem.MoveTo(transition.WorkStep, _timeSource.GetTime());

            WorkflowRepository.UpdateWorkItem(movedWorkItem);

            return(new WorkItemTransition(movedWorkItem, transition.WorkStep));
        }
Exemplo n.º 8
0
 private WorkItemTransition CreateTransitionIfMovingToExpandStep(WorkItemTransition transition)
 {
     if (WorkflowRepository.IsExpandStep(transition.WorkStep))
     {
         CreateTransientWorkSteps(transition.WorkItem, transition.WorkStep);
     }
     return(transition);
 }
Exemplo n.º 9
0
        private void ThrowIfMovingToWithinExpandStep(WorkItemTransition transition)
        {
            WorkStep dummyStep;

            if (!WorkflowRepository.IsExpandStep(transition.WorkStep) && !WorkflowRepository.IsWithinTransientStep(transition.WorkStep, out dummyStep) && WorkflowRepository.IsWithinExpandStep(transition.WorkStep))
            {
                throw new InvalidOperationException("Cannot move item to within expand step");
            }
        }
Exemplo n.º 10
0
        private bool IsMovedUnderneathParallelParent(WorkItemTransition transition, out WorkItem parallelParent)
        {
            if (WorkflowRepository.IsChildOfParallelledWorkItem(transition.WorkItem, out parallelParent))
            {
                return(transition.WorkStep.Path.StartsWith(parallelParent.Path));
            }

            return(false);
        }
Exemplo n.º 11
0
        private WorkItemTransition AttemptMergeIfMovingChildOfParallelledWorkItem(WorkItemTransition transition)
        {
            if (WorkflowRepository.IsMergeableParallelledChild(transition.WorkItem, transition.WorkStep))
            {
                var workItemToMove = MergeParallelWorkItems(transition);

                transition = new WorkItemTransition(workItemToMove, transition.WorkStep);
            }

            return(transition);
        }
Exemplo n.º 12
0
        private WorkItemTransition AttemptMergeIfMovingChildOfParallelledWorkItem(WorkItemTransition transition)
        {
            if (WorkflowRepository.IsMergeableParallelledChild(transition.WorkItem, transition.WorkStep))
            {
                var workItemToMove = MergeParallelWorkItems(transition);

                transition = new WorkItemTransition(workItemToMove, transition.WorkStep);
            }

            return transition;
        }
Exemplo n.º 13
0
        private void LockAndMoveToParallelRoot(WorkItemTransition transition)
        {
            ThrowIfMovingToStepWithWrongClass(transition);

            var lockedAndMovedItem = transition.WorkItem
                                     .MoveTo(transition.WorkStep, _timeSource.GetTime())
                                     .UpdateStatus(WorkItemStatus.ParallelLocked);

            WorkflowRepository.UpdateWorkItem(lockedAndMovedItem);

            if (WorkflowRepository.IsInExpandStep(transition.WorkItem))
            {
                CleanUpIfMovingFromExpandStep(transition);
            }
        }
Exemplo n.º 14
0
        private IEnumerable <string> GetPathsToTraverseForParallelStep(WorkItemTransition transition)
        {
            IEnumerable <string> pathsBetweenRootAndTarget;
            WorkItem             parallelParent;

            if (IsMovedUnderneathParallelParent(transition, out parallelParent))
            {
                var commonRootStepPath = WorkflowPath.FindCommonRoot(parallelParent.Path, transition.WorkStep.Path);
                pathsBetweenRootAndTarget = WorkflowPath.GetPathsBetween(commonRootStepPath, transition.WorkStep.Path).Skip(1);
            }
            else
            {
                var commonRootStepPath = WorkflowPath.FindCommonRoot(transition.WorkItem.Path, transition.WorkStep.Path);
                pathsBetweenRootAndTarget = WorkflowPath.GetPathsBetween(commonRootStepPath, transition.WorkStep.Path);
            }

            return(pathsBetweenRootAndTarget);
        }
Exemplo n.º 15
0
        private WorkItem MergeParallelWorkItems(WorkItemTransition transition)
        {
            var unlockedParentWorkItem = WorkflowRepository.GetWorkItem(transition.WorkItem.Parent.Id).UpdateStatus(WorkItemStatus.Normal);

            WorkflowRepository.UpdateWorkItem(unlockedParentWorkItem);

            foreach (var childWorkItem in WorkflowRepository.GetChildWorkItems(transition.WorkItem.Parent).ToList())
            {
                if (WorkflowRepository.IsExpandStep(transition.WorkStep))
                {
                    CleanUpIfMovingFromExpandStep(new WorkItemTransition(childWorkItem, transition.WorkStep));
                }

                WorkflowRepository.DeleteWorkItem(childWorkItem.Id);
            }

            return(unlockedParentWorkItem);
        }
Exemplo n.º 16
0
        private void MoveToWithinParallelStep(WorkItemTransition transition)
        {
            var newTransition = transition;

            if (!WorkflowRepository.IsValidWorkStepForWorkItem(transition.WorkItem, transition.WorkStep))
            {
                newTransition = TraverseParallelMoveHierarchy(transition);
            }

            ThrowIfMovingToStepWithWrongClass(newTransition);

            CleanUpIfMovingFromExpandStep(newTransition);

            newTransition = AttemptMergeIfMovingChildOfParallelledWorkItem(newTransition);

            var resultTransition = DoMove(newTransition);

            TryUpdatingExpandLockIfMovingChildOfExpandedWorkItem(resultTransition);
        }
Exemplo n.º 17
0
        private WorkItem CreateParallelledChildrenAndReturnWorkItemToMove(WorkItemTransition transition, WorkStep parallelStep)
        {
            var helper = new ParallelStepHelper(WorkflowRepository);

            var splitWorkItems = helper.SplitForParallelism(transition.WorkItem, parallelStep);

            foreach (var splitWorkItem in splitWorkItems)
            {
                WorkflowRepository.CreateWorkItem(splitWorkItem);

                WorkStep expandStep;
                var      isInExpandStep = WorkflowRepository.IsInExpandStep(transition.WorkItem, out expandStep);
                if (isInExpandStep)
                {
                    CreateTransientWorkSteps(splitWorkItem, expandStep);
                }
            }

            var idToMove       = ParallelStepHelper.GetParallelId(transition.WorkItem.Id, parallelStep, transition.WorkStep);
            var workItemToMove = splitWorkItems.First(wi => wi.Id == idToMove);

            return(workItemToMove);
        }
Exemplo n.º 18
0
        private WorkItemTransition TraversePathsForParallelStep(WorkItemTransition transition, IEnumerable <string> pathsBetweenRootAndTarget)
        {
            var currentWorkItem = transition.WorkItem;

            WorkStep parentWorkStep = null;

            foreach (var inBetweenPath in pathsBetweenRootAndTarget)
            {
                var currentWorkStep   = WorkflowRepository.GetWorkStep(inBetweenPath);
                var currentTransition = new WorkItemTransition(currentWorkItem, currentWorkStep);

                if (parentWorkStep != null && WorkflowRepository.IsParallelStep(parentWorkStep))
                {
                    var transitionToParallelRoot = new WorkItemTransition(currentWorkItem, parentWorkStep);
                    LockAndMoveToParallelRoot(transitionToParallelRoot);

                    currentWorkItem = CreateParallelledChildrenAndReturnWorkItemToMove(currentTransition, parentWorkStep);
                }

                parentWorkStep = currentWorkStep;
            }

            return(new WorkItemTransition(currentWorkItem, transition.WorkStep));
        }
Exemplo n.º 19
0
 private void ThrowIfMovingToStepWithWrongClass(WorkItemTransition transition)
 {
     if (!WorkflowRepository.IsValidWorkStepForWorkItem(transition.WorkItem, transition.WorkStep))
     {
         throw new InvalidOperationException("Invalid step for work item");
     }
 }
Exemplo n.º 20
0
 private void ThrowIfMovingParallelLockedWorkItem(WorkItemTransition transition)
 {
     if (WorkflowRepository.IsParallelLockedWorkItem(transition.WorkItem))
     {
         throw new InvalidOperationException("Work item is locked for parallel work");
     }
 }
Exemplo n.º 21
0
 private void ThrowIfMovingExpandLockedWorkItem(WorkItemTransition transition)
 {
     if (WorkflowRepository.IsExpandLockedWorkItem(transition.WorkItem))
     {
         throw new InvalidOperationException("Item is expandlocked and cannot be moved");
     }
 }
Exemplo n.º 22
0
        private void MoveToWithinParallelStep(WorkItemTransition transition)
        {
            var newTransition = transition;

            if (!WorkflowRepository.IsValidWorkStepForWorkItem(transition.WorkItem, transition.WorkStep))
            {
                newTransition = TraverseParallelMoveHierarchy(transition);
            }

            ThrowIfMovingToStepWithWrongClass(newTransition);

            CleanUpIfMovingFromExpandStep(newTransition);

            newTransition = AttemptMergeIfMovingChildOfParallelledWorkItem(newTransition);

            var resultTransition = DoMove(newTransition);

            TryUpdatingExpandLockIfMovingChildOfExpandedWorkItem(resultTransition);
        }
Exemplo n.º 23
0
 private bool IsMovingWithinParallelStep(WorkItemTransition transition)
 {
     return(WorkflowRepository.IsWithinParallelStep(transition.WorkStep));
 }
Exemplo n.º 24
0
 private void TryUpdatingExpandLockIfMovingChildOfExpandedWorkItem(WorkItemTransition resultTransition)
 {
     if (WorkflowRepository.IsChildOfExpandedWorkItem(resultTransition.WorkItem))
     {
         TryUpdatingExpandLockOnParent(resultTransition.WorkItem);
     }
 }
Exemplo n.º 25
0
        private WorkItemTransition TraverseParallelMoveHierarchy(WorkItemTransition transition)
        {
            var pathsBetweenRootAndTarget = GetPathsToTraverseForParallelStep(transition);

            return TraversePathsForParallelStep(transition, pathsBetweenRootAndTarget);
        }
Exemplo n.º 26
0
 private bool IsMovingWithinParallelStep(WorkItemTransition transition)
 {
     return WorkflowRepository.IsWithinParallelStep(transition.WorkStep);
 }
Exemplo n.º 27
0
        private bool IsMovedUnderneathParallelParent(WorkItemTransition transition, out WorkItem parallelParent)
        {
            if (WorkflowRepository.IsChildOfParallelledWorkItem(transition.WorkItem, out parallelParent))
            {
                return transition.WorkStep.Path.StartsWith(parallelParent.Path);
            }

            return false;
        }
Exemplo n.º 28
0
        private IEnumerable<string> GetPathsToTraverseForParallelStep(WorkItemTransition transition)
        {
            IEnumerable<string> pathsBetweenRootAndTarget;
            WorkItem parallelParent;
            if (IsMovedUnderneathParallelParent(transition, out parallelParent))
            {
                var commonRootStepPath = WorkflowPath.FindCommonRoot(parallelParent.Path, transition.WorkStep.Path);
                pathsBetweenRootAndTarget = WorkflowPath.GetPathsBetween(commonRootStepPath, transition.WorkStep.Path).Skip(1);
            }
            else
            {
                var commonRootStepPath = WorkflowPath.FindCommonRoot(transition.WorkItem.Path, transition.WorkStep.Path);
                pathsBetweenRootAndTarget = WorkflowPath.GetPathsBetween(commonRootStepPath, transition.WorkStep.Path);
            }

            return pathsBetweenRootAndTarget;
        }
Exemplo n.º 29
0
        private WorkItemTransition DoMove(WorkItemTransition transition)
        {
            var movedWorkItem = transition.WorkItem.MoveTo(transition.WorkStep,_timeSource.GetTime());

            WorkflowRepository.UpdateWorkItem(movedWorkItem);

            return new WorkItemTransition(movedWorkItem, transition.WorkStep);
        }
Exemplo n.º 30
0
 private void CleanUpIfMovingFromExpandStep(WorkItemTransition transition)
 {
     var remover = new WorkItemRemover(WorkflowRepository);
     remover.CleanUpIfInExpandStep(transition.WorkItem);
 }
Exemplo n.º 31
0
 private void ThrowIfMovingToWithinExpandStep(WorkItemTransition transition)
 {
     WorkStep dummyStep;
     if (!WorkflowRepository.IsExpandStep(transition.WorkStep) && !WorkflowRepository.IsWithinTransientStep(transition.WorkStep, out dummyStep) && WorkflowRepository.IsWithinExpandStep(transition.WorkStep))
     {
         throw new InvalidOperationException("Cannot move item to within expand step");
     }
 }
Exemplo n.º 32
0
        private void LockAndMoveToParallelRoot(WorkItemTransition transition)
        {
            ThrowIfMovingToStepWithWrongClass(transition);

            var lockedAndMovedItem = transition.WorkItem
                .MoveTo(transition.WorkStep, _timeSource.GetTime())
                .UpdateStatus(WorkItemStatus.ParallelLocked);

            WorkflowRepository.UpdateWorkItem(lockedAndMovedItem);

            if (WorkflowRepository.IsInExpandStep(transition.WorkItem))
            {
                CleanUpIfMovingFromExpandStep(transition);
            }
        }
Exemplo n.º 33
0
 private void ThrowIfViolatingWipLimit(WorkItemTransition transition)
 {
     if(!WipLimitChecker.CanAcceptWorkItem(transition.WorkItem.MoveTo(transition.WorkStep,_timeSource.GetTime())))
     {
         throw new WipLimitViolationException(transition.WorkItem,transition.WorkStep);
     }
 }
Exemplo n.º 34
0
        private WorkItem MergeParallelWorkItems(WorkItemTransition transition)
        {
            var unlockedParentWorkItem = WorkflowRepository.GetWorkItem(transition.WorkItem.Parent.Id).UpdateStatus(WorkItemStatus.Normal);
            WorkflowRepository.UpdateWorkItem(unlockedParentWorkItem);

            foreach (var childWorkItem in WorkflowRepository.GetChildWorkItems(transition.WorkItem.Parent).ToList())
            {
                if (WorkflowRepository.IsExpandStep(transition.WorkStep))
                {
                    CleanUpIfMovingFromExpandStep(new WorkItemTransition(childWorkItem, transition.WorkStep));
                }

                WorkflowRepository.DeleteWorkItem(childWorkItem.Id);
            }

            return unlockedParentWorkItem;
        }
Exemplo n.º 35
0
        private WorkItemTransition TraversePathsForParallelStep(WorkItemTransition transition, IEnumerable<string> pathsBetweenRootAndTarget)
        {
            var currentWorkItem = transition.WorkItem;

            WorkStep parentWorkStep = null;

            foreach (var inBetweenPath in pathsBetweenRootAndTarget)
            {
                var currentWorkStep = WorkflowRepository.GetWorkStep(inBetweenPath);
                var currentTransition = new WorkItemTransition(currentWorkItem,currentWorkStep);

                if (parentWorkStep != null && WorkflowRepository.IsParallelStep(parentWorkStep))
                {
                    var transitionToParallelRoot = new WorkItemTransition(currentWorkItem, parentWorkStep);
                    LockAndMoveToParallelRoot(transitionToParallelRoot);

                    currentWorkItem = CreateParallelledChildrenAndReturnWorkItemToMove(currentTransition, parentWorkStep);
                }

                parentWorkStep = currentWorkStep;
            }

            return new WorkItemTransition(currentWorkItem, transition.WorkStep);
        }
Exemplo n.º 36
0
        private void Move(WorkItem workItem, WorkStep toStep)
        {
            var transition = new WorkItemTransition(workItem, toStep);

            ThrowIfMovingParallelLockedWorkItem(transition);

            ThrowIfMovingExpandLockedWorkItem(transition);

            ThrowIfViolatingWipLimit(transition);

            if (IsMovingWithinParallelStep(transition))
            {
                MoveToWithinParallelStep(transition);
            }
            else
            {
                ThrowIfMovingToWithinExpandStep(transition);

                ThrowIfMovingToStepWithWrongClass(transition);

                CleanUpIfMovingFromExpandStep(transition);

                transition = AttemptMergeIfMovingChildOfParallelledWorkItem(transition);

                transition = CreateTransitionIfMovingToExpandStep(transition);

                var resultTransition = DoMove(transition);

                TryUpdatingExpandLockIfMovingChildOfExpandedWorkItem(resultTransition);
            }
        }
Exemplo n.º 37
0
        private WorkItemTransition TraverseParallelMoveHierarchy(WorkItemTransition transition)
        {
            var pathsBetweenRootAndTarget = GetPathsToTraverseForParallelStep(transition);

            return(TraversePathsForParallelStep(transition, pathsBetweenRootAndTarget));
        }
Exemplo n.º 38
0
        private void CleanUpIfMovingFromExpandStep(WorkItemTransition transition)
        {
            var remover = new WorkItemRemover(WorkflowRepository);

            remover.CleanUpIfInExpandStep(transition.WorkItem);
        }
Exemplo n.º 39
0
        private WorkItem CreateParallelledChildrenAndReturnWorkItemToMove(WorkItemTransition transition, WorkStep parallelStep)
        {
            var helper = new ParallelStepHelper(WorkflowRepository);

            var splitWorkItems = helper.SplitForParallelism(transition.WorkItem, parallelStep);

            foreach (var splitWorkItem in splitWorkItems)
            {
                WorkflowRepository.CreateWorkItem(splitWorkItem);

                WorkStep expandStep;
                var isInExpandStep = WorkflowRepository.IsInExpandStep(transition.WorkItem, out expandStep);
                if (isInExpandStep)
                {
                    CreateTransientWorkSteps(splitWorkItem, expandStep);
                }
            }

            var idToMove = ParallelStepHelper.GetParallelId(transition.WorkItem.Id, parallelStep, transition.WorkStep);
            var workItemToMove = splitWorkItems.First(wi => wi.Id == idToMove);

            return workItemToMove;
        }
Exemplo n.º 40
0
 private WorkItemTransition CreateTransitionIfMovingToExpandStep(WorkItemTransition transition)
 {
     if (WorkflowRepository.IsExpandStep(transition.WorkStep))
     {
         CreateTransientWorkSteps(transition.WorkItem, transition.WorkStep);
     }
     return transition;
 }