public void Associate(int workItemId, int changeSet, string comment)
        {
            var    workItem       = GetWorkItem(workItemId);
            var    revision       = Convert.ToInt32(workItem.WorkItemInfo["System.Rev"]);
            string historyMsg     = string.Format("Associated with changeset {0}.", changeSet);
            string changeSetLink  = "vstfs:///VersionControl/Changeset/" + changeSet;
            string oneLineComment = comment.Replace(Environment.NewLine, " ");

            oneLineComment = oneLineComment.Substring(0, Math.Min(oneLineComment.Length, 120));

            var invoker = new SoapInvoker(this);
            var msg     = invoker.CreateEnvelope("Update", headerName);

            msg.Header.Add(GetHeaderElement());

            XNamespace packageNs = XNamespace.Get("");

            msg.Body.Add(new XElement(MessageNs + "package",
                                      new XElement(packageNs + "Package", new XAttribute("Product", this.Url.ToString()),
                                                   new XElement("UpdateWorkItem", new XAttribute("ObjectType", "WorkItem"), new XAttribute("Revision", revision), new XAttribute("WorkItemID", workItemId),
                                                                new XElement("ComputedColumns",
                                                                             new XElement("ComputedColumn", new XAttribute("Column", "System.RevisedDate")),
                                                                             new XElement("ComputedColumn", new XAttribute("Column", "System.ChangedDate")),
                                                                             new XElement("ComputedColumn", new XAttribute("Column", "System.PersonId")),
                                                                             new XElement("ComputedColumn", new XAttribute("Column", "System.AuthorizedDate"))),
                                                                new XElement("InsertText", new XAttribute("FieldDisplayName", "History"), new XAttribute("FieldName", "System.History"), historyMsg),
                                                                new XElement("InsertResourceLink", new XAttribute("Comment", oneLineComment), new XAttribute("FieldName", "System.BISLinks"), new XAttribute("LinkType", "Fixed in Changeset"), new XAttribute("Location", changeSetLink))
                                                                ))));
            invoker.InvokeResponse();
        }
        public List <WorkItem> PageWorkitemsByIds(StoredQuery query, List <int> ids)
        {
            if (ids.Count > 50)
            {
                throw new Exception("Page only by 50");
            }
            var invoker = new SoapInvoker(this);
            var msg     = invoker.CreateEnvelope("PageWorkitemsByIds", headerName);

            msg.Header.Add(GetHeaderElement());
            msg.Body.Add(new XElement(MessageNs + "ids", ids.Select(i => new XElement(MessageNs + "int", i))));
            var columns = query.GetSelectColumns();
            var fields  = CachedMetaData.Instance.Fields.GetFieldsByNames(columns);

            if (fields["System.Id"] == null) //If No id Exists add it
            {
                fields.Insert(0, CachedMetaData.Instance.Fields["System.Id"]);
            }
            msg.Body.Add(new XElement(MessageNs + "columns", fields.Where(f => !f.IsLongField).Select(c => new XElement(MessageNs + "string", c.ReferenceName))));
            msg.Body.Add(new XElement(MessageNs + "longTextColumns", fields.Where(f => f.IsLongField).Select(c => new XElement(MessageNs + "int", c.Id))));
            var             response  = invoker.InvokeResponse();
            var             extractor = new TableDictionaryExtractor(response, "Items");
            var             data      = extractor.Extract();
            List <WorkItem> list      = new List <WorkItem>();

            foreach (var item in data)
            {
                list.Add(new WorkItem {
                    WorkItemInfo = item
                });
            }
            return(list);
        }
        public List <ProjectInfo> ListAllProjects()
        {
            SoapInvoker invoker = new SoapInvoker(this);

            invoker.CreateEnvelope("ListAllProjects");
            var resultEl = invoker.InvokeResult();

            return(new List <ProjectInfo>(resultEl.Elements(this.MessageNs + "ProjectInfo").Select(x => ProjectInfo.FromXml(Collection, x))));
        }
        public List <int> GetWorkItemIds(StoredQuery query, FieldList fields)
        {
            WorkItemContext context = new WorkItemContext {
                ProjectId = query.ProjectId, Me = WorkItemsContext.WhoAmI
            };

            var invoker  = new SoapInvoker(this);
            var envelope = invoker.CreateEnvelope("QueryWorkitems", headerName);

            envelope.Header.Add(GetHeaderElement());
            XNamespace queryNs = XNamespace.Get("");

            envelope.Body.Add(new XElement(MessageNs + "psQuery",
                                           new XElement(queryNs + "Query", new XAttribute("Product", this.Url.ToString()), query.GetQueryXml(context, fields))));

            XElement sorting = query.GetSortingXml();

            foreach (var items in sorting.DescendantsAndSelf())
            {
                items.Name = MessageNs + items.Name.LocalName;
            }
            envelope.Body.Add(sorting);
            envelope.Body.Add(new XElement(MessageNs + "useMaster", "false"));
            var response = invoker.InvokeResponse();

            var queryIds = response.Element(MessageNs + "resultIds").Element("QueryIds");

            if (queryIds == null)
            {
                return(new List <int>());
            }
            var list = new List <int>();

            foreach (var item in queryIds.Elements("id"))
            {
                var startId = item.Attribute("s");
                if (startId == null)
                {
                    continue;
                }
                var s     = Convert.ToInt32(startId.Value);
                var endId = item.Attribute("e");
                if (endId != null)
                {
                    var e     = Convert.ToInt32(endId.Value);
                    var range = Enumerable.Range(s, e - s + 1);
                    list.AddRange(range);
                }
                else
                {
                    list.Add(s);
                }
            }
            return(list);
        }
        private IEnumerable <XElement> GetXmlCollections()
        {
            SoapInvoker invoker = new SoapInvoker(this);
            //var serviceNs =
            var message = invoker.CreateEnvelope("QueryResourcesByType");

            message.Add(new XElement(MessageNs + "resourceTypes", new XElement(MessageNs + "guid", projectCollectionsTypeId)));
            var resultElement = invoker.InvokeResult();

            return(resultElement.XPathSelectElements("./msg:CatalogResources/msg:CatalogResource", this.NsResolver));
        }
        public List <StoredQuery> GetStoredQueries(Project project)
        {
            var invoker = new SoapInvoker(this);
            var msg     = invoker.CreateEnvelope("GetStoredQueries", headerName);

            msg.Header.Add(GetHeaderElement());
            msg.Body.Add(new XElement(MessageNs + "rowVersion", 0));
            msg.Body.Add(new XElement(MessageNs + "projectId", project.Id));
            var response  = invoker.InvokeResponse();
            var extractor = new TableExtractor <StoredQuery>(response, "StoredQueries");

            return(extractor.Extract());
        }
        private List <T> GetMetadata <T>(MetadataRowSetNames table)
            where T : class
        {
            var invoker  = new SoapInvoker(this);
            var envelope = invoker.CreateEnvelope("GetMetadataEx2", headerName);

            envelope.Header.Add(GetHeaderElement());
            envelope.Body.Add(new XElement(MessageNs + "metadataHave",
                                           new XElement(MessageNs + "MetadataTableHaveEntry",
                                                        new XElement(MessageNs + "TableName", table),
                                                        new XElement(MessageNs + "RowVersion", 0))));
            envelope.Body.Add(new XElement(MessageNs + "useMaster", "false"));
            var response  = invoker.InvokeResponse();
            var extractor = new TableExtractor <T>(response, table.ToString());

            return(extractor.Extract());
        }
        internal T LoadService <T>()
            where T : TFSCollectionService
        {
            SoapInvoker invoker = new SoapInvoker(this);

            invoker.CreateEnvelope("QueryServices");
            var resultEl  = invoker.InvokeResult();
            T   service   = Activator.CreateInstance <T>();
            var serviceEl = resultEl.XPathSelectElement(string.Format("./msg:ServiceDefinitions/msg:ServiceDefinition[@identifier='{0}']", service.ServiceResolver.Id),
                                                        TeamFoundationServerServiceMessage.NsResolver);

            if (serviceEl == null)
            {
                throw new Exception("Service not found");
            }
            service.Server      = this.collection.Server;
            service.Collection  = this.collection;
            service.RelativeUrl = serviceEl.Attribute("relativePath").Value;
            return(service);
        }
        public WorkItem GetWorkItem(int id)
        {
            var invoker = new SoapInvoker(this);
            var msg     = invoker.CreateEnvelope("GetWorkItem", headerName);

            msg.Header.Add(GetHeaderElement());
            msg.Body.Add(new XElement(MessageNs + "workItemId", id));
            var response  = invoker.InvokeResponse();
            var extractor = new TableDictionaryExtractor(response, "WorkItemInfo");
            var workItem  = new WorkItem();
            //workItem.Id = id;
            var data = extractor.Extract().Single();

            workItem.WorkItemInfo = new Dictionary <string, object>();
            foreach (var item in data)
            {
                workItem.WorkItemInfo.Add(item.Key, item.Value);
            }
            return(workItem);
        }
 internal ActionResult Invoke(ServiceAction action, IDictionary <string, string> arguments, int retry)
 {
     if (soap_adapter == null)
     {
         if (service_description.ControlUrl == null)
         {
             throw new InvalidOperationException(
                       string.Format("{0} does not have a control URL.", service_description));
         }
         soap_adapter = new SoapInvoker(service_description.ControlUrl);
     }
     try {
         return(soap_adapter.Invoke(action, arguments, retry));
     } catch (WebException e) {
         if (e.Status == WebExceptionStatus.Timeout)
         {
             service_description.CheckDisposed();
         }
         throw e;
     }
 }