public static WorkItemConfiguration FromTeamProject(TfsTeamProjectCollection tfs, Project project) { // Export work item type definitions. var projectWorkItemTypes = new List <WorkItemConfigurationItem>(); foreach (WorkItemType workItemType in project.WorkItemTypes) { projectWorkItemTypes.Add(WorkItemConfigurationItem.FromXml(workItemType.Export(false))); } // Export categories. projectWorkItemTypes.Add(WorkItemConfigurationItemImportExport.GetCategories(project)); // Export process configuration. var commonConfig = WorkItemConfigurationItemImportExport.GetCommonConfiguration(project); if (commonConfig != null) { projectWorkItemTypes.Add(commonConfig); } var agileConfig = WorkItemConfigurationItemImportExport.GetAgileConfiguration(project); if (agileConfig != null) { projectWorkItemTypes.Add(agileConfig); } var processConfig = WorkItemConfigurationItemImportExport.GetProcessConfiguration(project); if (processConfig != null) { projectWorkItemTypes.Add(processConfig); } return(new WorkItemConfiguration(project.Name, projectWorkItemTypes)); }
private void LoadComparisonSources(object argument) { var dialog = new OpenFileDialog(); dialog.Title = "Please select the comparison source list (*.xml) to load."; dialog.Filter = "XML Files (*.xml)|*.xml"; var result = dialog.ShowDialog(Application.Current.MainWindow); if (result == true) { try { var persistedSources = SerializationProvider.Read <WorkItemConfigurationPersistenceData[]>(dialog.FileName); this.ComparisonSources.Clear(); foreach (var persistedSource in persistedSources) { var items = new List <WorkItemConfigurationItem>(); foreach (var itemXml in persistedSource.WorkItemConfigurationItems) { try { items.Add(WorkItemConfigurationItem.FromXml(itemXml)); } catch (ArgumentException) { } } this.ComparisonSources.Add(new WorkItemConfiguration(persistedSource.Name, items)); } } catch (Exception exc) { this.Logger.Log(string.Format(CultureInfo.CurrentCulture, "An error occurred while loading the work item configuration list from \"{0}\"", dialog.FileName), exc); MessageBox.Show("An error occurred while loading the work item configuration list. See the log file for details", "Error", MessageBoxButton.OK, MessageBoxImage.Warning); } } }
public static WorkItemConfiguration FromProcessTemplate(string processTemplateFileName) { // Load the process template XML. if (!File.Exists(processTemplateFileName)) { throw new FileNotFoundException("The process template file does not exist: " + processTemplateFileName); } var processTemplate = new XmlDocument(); processTemplate.Load(processTemplateFileName); var baseDir = Path.GetDirectoryName(processTemplateFileName); var items = new List <WorkItemConfigurationItem>(); string processTemplateName = null; var processTemplateNameNode = processTemplate.SelectSingleNode("/ProcessTemplate/metadata/name"); if (processTemplateNameNode != null) { processTemplateName = processTemplateNameNode.InnerText; } // Find the work item tracking XML file. var workItemFileNameAttribute = processTemplate.SelectSingleNode("/ProcessTemplate/groups/group[@id='WorkItemTracking']/taskList/@filename"); if (workItemFileNameAttribute != null) { // Load the work item tracking XML. var workItemConfigurationTemplateFileName = Path.Combine(baseDir, workItemFileNameAttribute.InnerText); if (!File.Exists(workItemConfigurationTemplateFileName)) { throw new FileNotFoundException("The work item configuration file defined in the process template file does not exist: " + workItemConfigurationTemplateFileName); } var workItemConfigurationTemplate = new XmlDocument(); workItemConfigurationTemplate.Load(workItemConfigurationTemplateFileName); // Find all work item type definition XML files. foreach (XmlAttribute witFileNameAttribute in workItemConfigurationTemplate.SelectNodes("/tasks/task[@id='WITs']/taskXml/WORKITEMTYPES/WORKITEMTYPE/@fileName")) { var witFileName = Path.Combine(baseDir, witFileNameAttribute.InnerText); items.Add(WorkItemTypeDefinition.FromFile(witFileName)); } // Find the categories XML file. var categoriesFileNameAttribute = workItemConfigurationTemplate.SelectSingleNode("/tasks/task[@id='Categories']/taskXml/CATEGORIES/@fileName"); if (categoriesFileNameAttribute != null) { var categoriesFileName = Path.Combine(baseDir, categoriesFileNameAttribute.InnerText); items.Add(WorkItemConfigurationItem.FromFile(categoriesFileName)); } else { // If the process template doesn't specify any categories (typically because it's an old // process template from before Work Item Categories existed), load an empty list anyway. // This will improve comparisons because a Team Project will always have a Work Item // Categories configuration item (even if it's empty). items.Add(WorkItemConfigurationItem.FromXml("<cat:CATEGORIES xmlns:cat=\"http://schemas.microsoft.com/VisualStudio/2008/workitemtracking/categories\"/>")); } // Find the common configuration XML file. var commonConfigurationFileNameAttribute = workItemConfigurationTemplate.SelectSingleNode("/tasks/task[@id='ProcessConfiguration']/taskXml/PROCESSCONFIGURATION/CommonConfiguration/@fileName"); if (commonConfigurationFileNameAttribute != null) { var commonConfigurationFileName = Path.Combine(baseDir, commonConfigurationFileNameAttribute.InnerText); items.Add(WorkItemConfigurationItem.FromFile(commonConfigurationFileName)); } // Find the agile configuration XML file. var agileConfigurationFileNameAttribute = workItemConfigurationTemplate.SelectSingleNode("/tasks/task[@id='ProcessConfiguration']/taskXml/PROCESSCONFIGURATION/AgileConfiguration/@fileName"); if (agileConfigurationFileNameAttribute != null) { var agileConfigurationFileName = Path.Combine(baseDir, agileConfigurationFileNameAttribute.InnerText); items.Add(WorkItemConfigurationItem.FromFile(agileConfigurationFileName)); } // Find the process configuration XML file. var processConfigurationFileNameAttribute = workItemConfigurationTemplate.SelectSingleNode("/tasks/task[@id='ProcessConfiguration']/taskXml/PROCESSCONFIGURATION/ProjectConfiguration/@fileName"); if (processConfigurationFileNameAttribute != null) { var processConfigurationFileName = Path.Combine(baseDir, processConfigurationFileNameAttribute.InnerText); items.Add(WorkItemConfigurationItem.FromFile(processConfigurationFileName)); } } return(new WorkItemConfiguration(processTemplateName, items)); }
private static WorkItemConfigurationItem GetProcessConfiguration(Project project, WorkItemConfigurationItemType type) { var configService = project.Store.TeamProjectCollection.GetService <ProjectProcessConfigurationService>(); string processConfigXml; try { if (type == WorkItemConfigurationItemType.CommonConfiguration) { var commonConfig = configService.GetCommonConfiguration(project.Uri.ToString()); var configXml = new StringBuilder(); using (var writer = XmlWriter.Create(configXml, new XmlWriterSettings { Indent = true })) { commonConfig.ToXml(writer, WorkItemConfigurationItem.CommonConfigurationXmlElementName); } processConfigXml = configXml.ToString(); } else if (type == WorkItemConfigurationItemType.AgileConfiguration) { var agileConfig = configService.GetAgileConfiguration(project.Uri.ToString()); var configXml = new StringBuilder(); using (var writer = XmlWriter.Create(configXml, new XmlWriterSettings { Indent = true })) { agileConfig.ToXml(writer, WorkItemConfigurationItem.AgileConfigurationXmlElementName); } processConfigXml = configXml.ToString(); } else if (type == WorkItemConfigurationItemType.ProcessConfiguration) { var processConfig = configService.GetProcessConfiguration(project.Uri.ToString()); var configXml = new StringBuilder(); using (var writer = XmlWriter.Create(configXml, new XmlWriterSettings { Indent = true })) { processConfig.ToXml(writer, WorkItemConfigurationItem.ProcessConfigurationXmlElementName); } processConfigXml = configXml.ToString(); } else { throw new ArgumentException("The type argument must be either a CommonConfiguration, AgileConfiguration or ProcessConfiguration."); } } catch (NullReferenceException) { // Working with the ProjectProcessConfigurationService throws NullReferenceException on TFS 2010 or earlier. return(null); } catch (SoapException) { // A Team Project that doesn't have a process configuration yet throws a SOAP exception // "TF400572: The Project Process Settings must be configured for this feature to be used". return(null); } return(WorkItemConfigurationItem.FromXml(processConfigXml)); }
public static WorkItemConfigurationItem GetCategories(Project project) { var categoriesXml = GetCategoriesXml(project); return(WorkItemConfigurationItem.FromXml(categoriesXml)); }
public static new WorkItemTypeDefinition FromXml(XmlDocument xmlDefinition) { return(WorkItemConfigurationItem.FromXml <WorkItemTypeDefinition>(xmlDefinition)); }