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>&nbsp;</p><p>&nbsp;</p>";

                suggestions.Add(suggestion);
            }

            return(suggestions);
        }