예제 #1
0
        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));
            }
        }
예제 #2
0
 public MockProjectCollection([NotNull] MockProject project)
     : this(new[] { (IProject)project }.ToList())
 {
 }