public string Convert2Text(Suggestion suggestion, string html) { string convertedText = ""; HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); //lets replace all the app references HtmlNodeCollection apps = doc.DocumentNode.SelectNodes("//span[@class='app_name']"); if (apps != null) { foreach (HtmlNode appNode in apps) { appNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(suggestion.application), appNode); } } //lets replace all the start_date references HtmlNodeCollection startdates = doc.DocumentNode.SelectNodes("//span[@class='start_date']"); if (startdates != null) { foreach (HtmlNode startdateNode in startdates) { startdateNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(suggestion.release.ToString("h:mm tt dddd, MMMM dd, yyyy") + " (Mountain Time)"), startdateNode); } } //lets replace all the start_date_short references HtmlNodeCollection startdateshorts = doc.DocumentNode.SelectNodes("//span[@class='start_date_short']"); if (startdateshorts != null) { foreach (HtmlNode startdateshortNode in startdateshorts) { startdateshortNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(suggestion.release.ToString("h:mm tt dddd, MMMM dd")), startdateshortNode); } } //lets replace all the start_date_time_only references HtmlNodeCollection startdatestimeonly = doc.DocumentNode.SelectNodes("//span[@class='start_date_time_only']"); if (startdatestimeonly != null) { foreach (HtmlNode startdatetimeonlyNode in startdatestimeonly) { startdatetimeonlyNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(suggestion.release.ToString("h:mm tt")), startdatetimeonlyNode); } } //lets replace all the end_date references HtmlNodeCollection enddates = doc.DocumentNode.SelectNodes("//span[@class='end_date']"); if (enddates != null) { foreach (HtmlNode enddateNode in enddates) { enddateNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(suggestion.archive.ToString("h:mm tt dddd, MMMM dd, yyyy") + " (Mountain Time)"), enddateNode); } } //lets replace all the end_date_short references HtmlNodeCollection enddateshorts = doc.DocumentNode.SelectNodes("//span[@class='end_date_short']"); if (enddateshorts != null) { foreach (HtmlNode enddateshortNode in enddateshorts) { enddateshortNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(suggestion.archive.ToString("h:mm tt dddd, MMMM dd")), enddateshortNode); } } //lets replace all the end_date_time_only references HtmlNodeCollection enddatetimesonly = doc.DocumentNode.SelectNodes("//span[@class='end_date_time_only']"); if (enddatetimesonly != null) { foreach (HtmlNode enddatetimeonlyNode in enddatetimesonly) { enddatetimeonlyNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(suggestion.archive.ToString("h:mm tt")), enddatetimeonlyNode); } } //lets replace all the single_date references HtmlNodeCollection singledates = doc.DocumentNode.SelectNodes("//span[@class='single_date']"); if (singledates != null) { foreach (HtmlNode singledateNode in singledates) { singledateNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(suggestion.release.ToString("h:mm tt")), singledateNode); } } //lets replace all the change_number references HtmlNodeCollection changenumbers = doc.DocumentNode.SelectNodes("//span[@class='change_number']"); if (changenumbers != null) { foreach (HtmlNode changenumberNode in changenumbers) { changenumberNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(suggestion.changeNumber), changenumberNode); } } //lets replace all the support_group references HtmlNodeCollection supportgroups = doc.DocumentNode.SelectNodes("//span[@class='support_group']"); if (supportgroups != null) { foreach (HtmlNode supportgroupNode in supportgroups) { supportgroupNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(suggestion.changeGroup), supportgroupNode); } } convertedText = doc.DocumentNode.InnerHtml; return(convertedText); }
public List <Suggestion> ChangeComm(string changeNumber) { WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*"); //grab the information about this change ticket from ServiceNow GetServiceNowData SDData = new GetServiceNowData(); Task <string> changeRequest = SDData.GetChangeInfoREST(changeNumber); string changeJsonResponse = changeRequest.Result; dynamic json = JsonConvert.DeserializeObject(changeJsonResponse); string changeBody = ""; string changeGroup = ""; string CISysID = ""; string changecommCI = ""; DateTime changeStart = new DateTime(); DateTime changeEnd = new DateTime(); string jsonStart = json.result[0].start_date.ToString(); //Debug.WriteLine(jsonStart); if (json != null) { changeBody += json.result[0].description.ToString().Trim(); changeGroup += json.result[0].assignment_group.value.ToString().Trim(); CISysID += json.result[0].cmdb_ci.value.ToString().Trim(); changeStart = DateTime.ParseExact(json.result[0].start_date.ToString(), "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); changeEnd = DateTime.ParseExact(json.result[0].end_date.ToString(), "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); } else { throw new WebFaultException <string>( string.Format("There is no ticket in ServiceNow for '{0}'.", changeNumber), HttpStatusCode.NotFound); } //Lets grab ths CI information if (CISysID != "") { Task <string> changeCI = SDData.GetCIInfoREST(CISysID); string CIJson = changeCI.Result; dynamic CIjson = JsonConvert.DeserializeObject(CIJson); if (CIjson != null) { changecommCI += CIjson.result.sys_class_name.ToString().Trim(); } } //Lets see if we can detect and apps GetApplications getApps = new GetApplications(); List <string> apps = getApps.GetApps(changeBody); //Now lets build the query for this change QueryBuilder queryBuilder = new QueryBuilder(); BooleanQuery query = new BooleanQuery(); if (apps.Count() > 0) { string changeApps = String.Join(" ", apps.ToArray()); query = queryBuilder.GetCommQuery(changeBody, changeGroup, changeApps, changecommCI); } else { query = queryBuilder.GetCommQuery_NoApps(changeBody, changeGroup, changecommCI); } //Finally, execute the query against our Lucene database of change communications string indexFileLocation = @"C:\Models\ChangeData\"; Lucene.Net.Store.Directory dir = FSDirectory.Open(indexFileLocation); IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(Lucene.Net.Index.IndexReader.Open(dir, true)); TopDocs td = searcher.Search(query, 5); ScoreDoc[] hits = td.ScoreDocs; List <Suggestion> suggestions = new List <Suggestion>(); TextProcessor processor = new TextProcessor(); foreach (ScoreDoc searchResult in hits) { int docId = searchResult.Doc; double score = Convert.ToDouble(searchResult.Score); Lucene.Net.Documents.Document doc = searcher.Doc(docId); Suggestion suggestion = new Suggestion(); suggestion.changeNumber = doc.Get("changenumber"); suggestion.changeGroup = doc.Get("change_group_name"); suggestion.release = changeStart; suggestion.archive = changeEnd; suggestion.title = doc.Get("title"); suggestion.application = doc.Get("application"); suggestion.summaryHTML = processor.Convert2Text(suggestion, doc.Get("communication_descriptionHTML")); suggestion.summaryText = processor.GenerateDescriptionText(suggestion.summaryHTML); suggestion.bodyHTML = processor.Convert2Text(suggestion, doc.Get("communication_bodyHTML")); suggestion.bodyHTML += "<div id='referenceinfo'><p>Reference No.: <strong>" + changeNumber + "</strong></p><p> </p><p> </p>"; suggestions.Add(suggestion); } return(suggestions); }