private void Create(WorkItem newWorkItem) { var leafStep = WorkflowRepository.GetLeafStep(newWorkItem.Path); if (leafStep.Type != WorkStepType.Begin) { throw new InvalidOperationException("Can only create work items in begin step"); } var classes = WorkflowRepository.GetWorkItemClasses(leafStep); newWorkItem = newWorkItem.MoveTo(leafStep, _timeSource.GetTime()).UpdateClasses(classes); WorkStep transientStep; if (WorkflowRepository.IsWithinTransientStep(leafStep, out transientStep)) { var parentItem = GetTransientParentWorkItem(transientStep); WorkflowRepository.UpdateWorkItem(parentItem.UpdateStatus(WorkItemStatus.ExpandLocked)); newWorkItem = newWorkItem.MoveTo(leafStep, _timeSource.GetTime()).UpdateParent(parentItem, WorkItemParentType.Expanded); foreach (var workItemClass in newWorkItem.Classes) { foreach (var rootClass in WorkItemClass.FindRootClasses(workItemClass)) { newWorkItem = newWorkItem.AddClass(rootClass); } } } else if (WorkflowRepository.IsWithinExpandStep(leafStep)) { throw new InvalidOperationException("Cannot create item directly under expand step"); } if (!newWorkItem.Ordinal.HasValue) { newWorkItem = newWorkItem.UpdateOrdinal(WorkflowRepository.GetNextOrdinal(newWorkItem)); } WorkflowRepository.CreateWorkItem(newWorkItem); }
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); }