/// <summary>
 /// Sets the cached subs key.
 /// </summary>
 /// <param name="ieToken">The ie token.</param>
 /// <param name="key">The key.</param>
 /// <param name="qsp">The QSP.</param>
 private void SetCachedSubsKey(string ieToken, string key, QuestionSetProxy qsp)
 {
      cache.Add(key + "_subskey", new CFRunState { key = key, ieToken = ieToken, qsp = qsp }, new CacheItemPolicy { SlidingExpiration = new TimeSpan(0, 1, 0, 0) });
 }
 /// <summary>
 /// Updates the cache QSP.
 /// </summary>
 /// <param name="qsp">The QSP.</param>
 /// <param name="key">The key.</param>
 private void UpdateCacheQSP(QuestionSetProxy qsp, string key)
 {
     if(KeyExists(key))
     {
         ((CFRunState)cache[key + "_subskey"]).qsp = qsp;
     }
 }
 /// <summary>
 /// Renders the HTML.
 /// </summary>
 /// <param name="qsp">The QSP.</param>
 /// <returns>System.String.</returns>
 private string RenderHTML(QuestionSetProxy qsp)
 {
     StringBuilder sb = new StringBuilder();
     sb.AppendLine("<!doctype html><html><head></head><body>");
     sb.AppendLine("<h3>" + qsp.Preamble + "</h3>");
     if (!qsp.Complete)
     {
         sb.AppendLine("<h3>" + qsp.QuestionHeader + "</h3>");
         sb.AppendLine("<table>");
         foreach (var q in qsp.questions)
         {
             sb.AppendLine(string.Format("<tr><td>{0} {1}</td><td id=\"{2}\">&nbsp;&nbsp;________&nbsp;&nbsp;</td></tr>", q.Text, FormatQuestion(q),q.Reference));
         }
         sb.AppendLine("</table>");
     }
     else
     {
         sb.AppendLine("<h3>" + qsp.ResponseHeader + "</h3>");
         sb.AppendLine("<table>");
         foreach (var r in qsp.responses)
         {
             sb.AppendLine("<tr><td>" + r.Annotation + " " + r.MainText + "</td></tr>");
         }
         sb.AppendLine("</table>");
     }
     sb.AppendLine("</body></html>");
     return sb.ToString();
 }
 /// <summary>
 /// Renders the text.
 /// </summary>
 /// <param name="qsp">The QSP.</param>
 /// <returns>System.String.</returns>
 private string RenderText(QuestionSetProxy qsp)
 {
     StringBuilder sb = new StringBuilder();
     sb.AppendLine(qsp.Preamble);
     if (!qsp.Complete)
     {
         sb.AppendLine(qsp.QuestionHeader);
         foreach (var q in qsp.questions)
         {
             sb.AppendLine(q.Text + " " + FormatQuestion(q));
         }
     }
     else
     {
         sb.AppendLine(qsp.ResponseHeader);
         foreach (var r in qsp.responses)
         {
             sb.AppendLine(r.Annotation + " " + r.MainText);
         }
     }
     return sb.ToString();
 }
        /// <summary>
        /// Parses the response body.
        /// </summary>
        /// <param name="body">The body.</param>
        /// <param name="oldQsp">The old QSP.</param>
        /// <param name="html">if set to <c>true</c> [HTML].</param>
        /// <returns>QuestionSetProxy.</returns>
        /// <exception cref="System.NotImplementedException"></exception>
        private QuestionSetProxy ParseResponseBody(string body, QuestionSetProxy oldQsp, bool html)
        {
            if (html)//in this case we will rely on the id being returned
            {
                var doc = new HtmlDocument();
                doc.LoadHtml(body);
                if (doc.DocumentNode.SelectNodes("//td[@id]") == null)
                    return oldQsp; // not correctly formed
                foreach (HtmlNode reference in doc.DocumentNode.SelectNodes("//td[@id]"))
                {
                    var id = reference.Attributes["id"].Value;
                    var value = reference.InnerText;
                    value = value.Replace('_', ' ').Replace("&nbsp;"," ").Trim();
                    foreach (var q in oldQsp.questions)
                    {
                        if (q.Reference == id)
                        {
                            switch (q.qtype)
                            {
                                case 0: //numeric
                                    {
                                        double res;
                                        if (double.TryParse(value, out res))
                                        {
                                            if (res >= q.minval && res <= q.maxval)
                                                q.DResponse = res;
                                        }
                                    }
                                    break;
                                case 1: //categorical
                                    {
                                        int best = -1;
                                        double nearest = double.MaxValue;
                                        int index = 0;
                                        foreach (string s in q.categories)
                                        {
                                            var p = Levenshtein.Distance(s.ToLower(), value.ToLower());
                                            if (p < nearest)
                                            {
                                                best = index;
                                                nearest = p;
                                            }
                                            index++;
                                        }
                                        q.SResponse = q.categories[best];
                                    }

                                    break;
                                case 2: //textual
                                    q.SResponse = value;
                                    break;
                            }
                        }
                    }
                }

            }
            return oldQsp;
        }
        public async Task<ActionResult> DFRun(string backButton, string nextButton, QuestionSetProxy qsp)
        {
            if (ModelState.IsValid)
            {
                var client = new HttpClient();
                var sub = Session["subs"] as Subs;
                var queryString = HttpUtility.ParseQueryString(string.Empty);
                queryString["subscription-key"] = sub.SubscriptionKey.ToString();
                if (!string.IsNullOrEmpty(nextButton))
                {
                    var uri = Settings.Default.QSetPath + "?" + queryString;

                    HttpResponseMessage response = await client.PostAsJsonAsync(uri, qsp);

                    if (response.Content != null)
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            var responseString = await response.Content.ReadAsStringAsync();
                            QuestionSetProxy nqsp = JsonConvert.DeserializeObject<QuestionSetProxy>(responseString);
                            ModelState.Clear();
                            return View(nqsp);
                        }
                        else if ((int)response.StatusCode == 429)
                        {
                            ModelState.AddModelError("", "Rate limit exceeded - wait and try again or upgrade to Unlimited");
                            return View(qsp);
                        }
                    }
                }
                if (!string.IsNullOrEmpty(backButton))
                {
                    var uri = Settings.Default.QSetPath + "/" + qsp.ieToken + "?" + queryString;
                    HttpResponseMessage response = await client.DeleteAsync(uri);
                    if (response.Content != null)
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            var responseString = await response.Content.ReadAsStringAsync();
                            QuestionSetProxy nqsp = JsonConvert.DeserializeObject<QuestionSetProxy>(responseString);
                            ModelState.Clear();
                            return View(nqsp);
                        }
                        else if ((int)response.StatusCode == 429)
                        {
                            ModelState.AddModelError("", "Rate limit exceeded - wait and try again or upgrade to Unlimited");
                            return View(qsp);
                        }
                    }
                }
            }
            return View();
        }
Beispiel #7
0
        public async Task<ActionResult> Index(string backButton, string nextButton, QuestionSetProxy qsp)
        {
            //           Response.CacheControl = "no-cache";
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);
            queryString["subscription-key"] = GetCachedSubsKey(qsp.ieToken);
            if (!string.IsNullOrEmpty(nextButton))
            {
                var uri = Settings.Default.APIM_path + "?" + queryString;

                HttpResponseMessage response = await client.PostAsJsonAsync(uri, qsp);

                if (response.Content != null)
                {
                    if (response.IsSuccessStatusCode)
                    {
                        var responseString = await response.Content.ReadAsStringAsync();
                        QuestionSetProxy nqsp = JsonConvert.DeserializeObject<QuestionSetProxy>(responseString);
                        if (nqsp.Complete) //trigger push responses
                        {
                            var res = nqsp.values != null ? nqsp.values : new Dictionary<string,string>(); // get from response
                            var report = ToTextReport(res);
                            telemetry.TrackEvent(string.Format("Form completed {0}, {1}, {2}", usageMapId, subscriptionKey, report),res); 
                            await DarlFormController.FireTheTriggers(res,report);
                        }
                        ModelState.Clear();
                        return View( nqsp);
                    }
                    else if ((int)response.StatusCode == 429)
                    {
                        ModelState.AddModelError("", "Rate limit exceeded - wait and try again or upgrade to Unlimited");
                        return View( qsp);
                    }
                }
            }
            if (!string.IsNullOrEmpty(backButton))
            {
                var uri = Settings.Default.APIM_path + "/" + qsp.ieToken + "?" + queryString;
                HttpResponseMessage response = await client.DeleteAsync(uri);
                if (response.Content != null)
                {
                    if (response.IsSuccessStatusCode)
                    {
                        var responseString = await response.Content.ReadAsStringAsync();
                        QuestionSetProxy nqsp = JsonConvert.DeserializeObject<QuestionSetProxy>(responseString);
                        ModelState.Clear();
                        return View(qsp);
                    }
                    else if ((int)response.StatusCode == 429)
                    {
                        ModelState.AddModelError("", "Rate limit exceeded - wait and try again or upgrade to Unlimited");
                        return View(qsp);
                    }
                }
            }
            return View( "Error");
        }