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);
}