public void BatchSave(IEnumerable <IWorkItem> workItems) { // First: Fix up the work items and save them to our dictionary foreach (var item in workItems) { Save(item); } // Second: Update the links for the work items We need to save first so we can create recipricol links if required (e.g. parent -> child also needs a child -> parent) foreach (var item in workItems) { SaveLinks(item); } // Third: If any of the work items have types that are missing from their project, add those var missingWits = new Dictionary <IProject, HashSet <IWorkItemType> >(); foreach (var item in workItems) { var projectName = item[CoreFieldRefNames.TeamProject].ToString(); var witName = item[CoreFieldRefNames.WorkItemType].ToString(); IProject project; try { project = Projects[projectName]; } catch (DeniedOrNotExistException) { Trace.TraceWarning("Project {0} missing from work item store.", projectName); project = new MockProject(this); } if (!project.WorkItemTypes.Contains(witName)) { Trace.TraceWarning("Project {0} is missing work item type definition {1}", project, witName); missingWits.TryAdd(project, new HashSet <IWorkItemType>(WorkItemTypeComparer.Default)); var t = item.Type as MockWorkItemType; if (t?.Store != this) { t.Store = this; } missingWits[project].Add(item.Type); } } // Fourth: If there are any missing wits update the project and reset the project collection if (!missingWits.Any()) { return; } var changesRequired = false; var newProjects = new List <IProject>(); foreach (var project in Projects) { if (!missingWits.ContainsKey(project)) { newProjects.Add(project); continue; } var wits = missingWits[project]; if (!wits.Any()) { newProjects.Add(project); } else { changesRequired = true; wits.UnionWith(project.WorkItemTypes); var w = new WorkItemTypeCollection(wits.ToList()); var p = new MockProject(project.Guid, project.Name, project.Uri, w, project.AreaRootNodes, project.IterationRootNodes); newProjects.Add(p); } } if (changesRequired) { _projects = new Lazy <IProjectCollection>(() => new MockProjectCollection(newProjects)); } }
public MockProjectCollection([NotNull] MockProject project) : this(new[] { (IProject)project }.ToList()) { }