예제 #1
0
 public WebServicesSettings(SearchSettings parent)
 {
     if (parent == null) throw new ArgumentNullException("parent");
     _parent = parent;
 }
예제 #2
0
 public KeywordsSettings(SearchSettings parent)
 {
     if (parent == null) throw new ArgumentNullException("parent");
     _parent = parent;
 }
예제 #3
0
		public ActionResult updateMarkers(FormCollection collection)
		{
			if ( bFirstCall)
			{
				//First time called since last web site restart - log selected <appSettings> values...
				bFirstCall = false;

				dblogcontext.clearParameters();
				dblogcontext.clearReturns();

				dblogcontext.addParameter("ServiceUrl", ConfigurationManager.AppSettings["ServiceUrl"]);
				dblogcontext.addParameter("ServiceUrl_1_1_EndPoint", ConfigurationManager.AppSettings["ServiceUrl1_1_EndPoint"]);
				dblogcontext.addParameter("ByuUrl", ConfigurationManager.AppSettings["ByuUrl"]);
				dblogcontext.addParameter("MaxClustercount", ConfigurationManager.AppSettings["MaxClustercount"].ToString());
				dblogcontext.addParameter("maxAllowedTimeseriesReturn", ConfigurationManager.AppSettings["maxAllowedTimeseriesReturn"].ToString());
				dblogcontext.addParameter("maxCombinedExportValues", ConfigurationManager.AppSettings["maxCombinedExportValues"].ToString());
				dblogcontext.addParameter("blobContainer", ConfigurationManager.AppSettings["blobContainer"]);
				dblogcontext.addParameter("aspnet:MaxJsonDeserializerMembers", ConfigurationManager.AppSettings["aspnet:MaxJsonDeserializerMembers"].ToString());
				dblogcontext.addParameter("currentVersion", ConfigurationManager.AppSettings["currentVersion"].ToString());

				DateTime dtNow = DateTime.UtcNow;
				dblogcontext.createLogEntry(System.Web.HttpContext.Current, dtNow, dtNow, "updateMarkers(...)", "first call - selected appSettings values...", Level.Info);
			}

			var searchSettings = new SearchSettings();
			string markerjSON = string.Empty;
		   
			//get map geometry
			double xMin, xMax, yMin, yMax;
			int zoomLevel;

			int CLUSTERWIDTH = 50; //Cluster region width, all pin within this area are clustered
			int CLUSTERHEIGHT = 50; //Cluster region height, all pin within this area are clustered
			int CLUSTERINCREMENT = 5; //increment for clusterwidth 
			int MINCLUSTERDISTANCE = 25;
			int MAXCLUSTERCOUNT = Convert.ToInt32(ConfigurationManager.AppSettings["MaxClustercount"].ToString()); //maximum ammount of clustered markers

			UniversalTypeConverter.TryConvertTo<double>(collection["xMin"], out xMin);
			UniversalTypeConverter.TryConvertTo<double>(collection["xMax"], out xMax);
			UniversalTypeConverter.TryConvertTo<double>(collection["yMin"], out yMin);
			UniversalTypeConverter.TryConvertTo<double>(collection["yMax"], out yMax);
			Box box = new Box(xMin, xMax, yMin, yMax);
			UniversalTypeConverter.TryConvertTo<int>(collection["zoomLevel"], out zoomLevel);
			var activeWebservices = new List<WebServiceNode>();

			//Attempt to retrieve filtered timeseries ids, if indicated
			string strFilterAndSearchCriteria = collection["filterAndSearchCriteria"];

			clientFilterAndSearchCriteria filterAndSearchCriteria = null;

			if (!String.IsNullOrWhiteSpace(strFilterAndSearchCriteria))
			{
				filterAndSearchCriteria = JsonConvert.DeserializeObject<clientFilterAndSearchCriteria>(strFilterAndSearchCriteria);
			}

			//if it is a new request
			if (collection["isNewRequest"].ToString() == "true")
			{

				bool canConvert = false;

				var keywords = Regex.Split(collection["keywords"], @"##");
				var tileWidth = 10;
				var tileHeight = 10;
				List<int> webServiceIds = null;
				try
				{
					//Increase date range by one day to accomodate one day searches, if indicated...
					//Set begin date time to 00:00:00, set end date time to 23:59:59
					searchSettings.DateSettings.StartDate = Convert.ToDateTime(collection["startDate"]);
					searchSettings.DateSettings.StartDate = searchSettings.DateSettings.StartDate.Date.AddHours(0).AddMinutes(0).AddSeconds(0);

					searchSettings.DateSettings.EndDate = Convert.ToDateTime(collection["endDate"]);
					if (searchSettings.DateSettings.StartDate.Date == searchSettings.DateSettings.EndDate.Date)
					{
						searchSettings.DateSettings.EndDate = searchSettings.DateSettings.EndDate.Date.AddDays(1);
					}
					searchSettings.DateSettings.EndDate = searchSettings.DateSettings.EndDate.Date.AddHours(23).AddMinutes(59).AddSeconds(59);
					
					//Convert to int Array
					if (collection["services"].Length > 0)
					{
						webServiceIds = collection["services"].Split(',').Select(s => Convert.ToInt32(s)).ToList();
					}

					var dataWorker = new DataWorker();

					var allWebservices = dataWorker.getWebServiceList();


					//filter list
					if (webServiceIds != null)
					{
						activeWebservices = dataWorker.filterWebservices(allWebservices, webServiceIds);
					}
					Session["webServiceList"] = allWebservices;

					//Clear parameters...
					dblogcontext.clearParameters();
					dberrorcontext.clearParameters();

					//Add call parameters...
					dblogcontext.addParameter("box", box);
					dberrorcontext.addParameter("box", box);
					if (1 == keywords.Length && "" == keywords[0])
					{
						dblogcontext.addParameter("keywords", "All");
						dberrorcontext.addParameter("keywords", "All");
					}
					else
					{
						StringBuilder sb1 = new StringBuilder();
						foreach (string keyword in keywords)
						{
							sb1.AppendFormat("{0}, ", keyword);
						}

						dblogcontext.addParameter("keywords", sb1.ToString());
						dberrorcontext.addParameter("keywords", sb1.ToString());
					}

					dblogcontext.addParameter("tileWidth", tileWidth);
					dberrorcontext.addParameter("tileWidth", tileWidth);

					dblogcontext.addParameter("tileHeight", tileHeight);
					dberrorcontext.addParameter("tileHeight", tileHeight);

					dblogcontext.addParameter("startDate", searchSettings.DateSettings.StartDate);
					dberrorcontext.addParameter("startDate", searchSettings.DateSettings.StartDate);

					dblogcontext.addParameter("endDate", searchSettings.DateSettings.EndDate);
					dberrorcontext.addParameter("endDate", searchSettings.DateSettings.EndDate);

					if (0 >= activeWebservices.Count)
					{
						dblogcontext.addParameter("activeWebServices", "All");
						dberrorcontext.addParameter("activeWebServices", "All");
					}
					else
					{
						StringBuilder sb1 = new StringBuilder();
						activeWebservices.ForEach(wsn => sb1.AppendFormat("{0},", wsn.Title));

						dblogcontext.addParameter("activeWebServices", sb1.ToString());
						dberrorcontext.addParameter("activeWebServices", sb1.ToString());
					}

					DateTime startDtUtc = DateTime.UtcNow;

					var series = dataWorker.getSeriesData(box, keywords.ToArray(), tileWidth, tileHeight,
																	 searchSettings.DateSettings.StartDate,
																	  searchSettings.DateSettings.EndDate,
																	  activeWebservices);
					DateTime endDtUtc = DateTime.UtcNow;

					//Clear returns
					dblogcontext.clearReturns();

					//Add returned series count...
					dblogcontext.addReturn("seriesCount", series.Count);

					//Create log entry...
					dblogcontext.createLogEntry(System.Web.HttpContext.Current, startDtUtc, endDtUtc, "updateMarkers(...)", "calls dataWorker.getSeriesData(...)", Level.Info);

					var list = new List<TimeSeriesViewModel>();

					if (!EnvironmentContext.LocalEnvironment())
					{
						//Non-local environment - do not attempt to create debug files...
						//Watch out for similar loop code in 'else' block...
						if (series.Count > 0)
					{
						for (int i = 0; i < series.Count; i++)
						{
							var tvm = new TimeSeriesViewModel();
							tvm = mapDataCartToTimeseries(series[i], i);
							list.Add(tvm);
						}
					}
					}
					else
					{
						//Local environment - create debug files, if indicated...
#if (DEBUG)
						//BCC - Test - write data cart and time series objects to files...
						using (System.IO.StreamWriter swSdc = System.IO.File.CreateText(@"C:\CUAHSI\SeriesDataCart.json"))
						{
							using (System.IO.StreamWriter swTsvm = System.IO.File.CreateText(@"C:\CUAHSI\TimeSeriesViewModel.json"))
							{
								JsonSerializer jsonser = new JsonSerializer();

								swSdc.Write('[');	//Write start of array...
								swTsvm.Write('[');
#endif
								//Watch out for similar loop code in 'if' block...
								if (series.Count > 0)
								{
									for (int i = 0; i < series.Count; i++)
									{
										var tvm = new TimeSeriesViewModel();
										tvm = mapDataCartToTimeseries(series[i], i);
										list.Add(tvm);
#if (DEBUG)
										jsonser.Serialize(swSdc, series[i]);
										jsonser.Serialize(swTsvm, tvm);

										if ((i + 1) < series.Count)
										{
											swSdc.Write(',');	//Separate array element...
											swTsvm.Write(',');
										}
#endif
									}
								}
#if (DEBUG)
								swSdc.Write(']');	//Write end of array...
								swTsvm.Write(']');
							}
						}
#endif
					}

					var markerClustererHelper = new MarkerClustererHelper();

					//save list for later
					Session["Series"] = list;

					//transform list int clusteredpins
					var pins = transformSeriesDataCartIntoClusteredPin(list, filterAndSearchCriteria);

					var clusteredPins = markerClustererHelper.clusterPins(pins, CLUSTERWIDTH, CLUSTERHEIGHT, CLUSTERINCREMENT, zoomLevel, MAXCLUSTERCOUNT, MINCLUSTERDISTANCE);
					Session["ClusteredPins"] = clusteredPins;

					var centerPoint = new LatLong(0, 0);
					markerjSON = markerClustererHelper.createMarkersGEOJSON(clusteredPins, zoomLevel, centerPoint, "");
				}
			   
				catch (Exception ex)
				{
					//NOTE: Override 'standard' IIS error handling since we are using 'standard' HTTP error codes - RequestEntityTooLarge and RequestTimeout...
					//Sources:	http://stackoverflow.com/questions/22071211/when-performing-post-via-ajax-bad-request-is-returned-instead-of-the-json-resul
					//			http://stackoverflow.com/questions/3993941/in-iis7-5-what-module-removes-the-body-of-a-400-bad-request/4029197#4029197
					//			http://weblog.west-wind.com/posts/2009/Apr/29/IIS-7-Error-Pages-taking-over-500-Errors

					//Find the 'inner-most' exception...
					while (null != ex.InnerException)
					{
						ex = ex.InnerException;
					}

					if ( typeof (WebException) == ex.GetType())
					{
						//Web exception - return the error message...
						WebException wex = (WebException) ex;

						Response.StatusCode = (int) wex.Status;
						Response.StatusDescription = wex.Message;
						Response.TrySkipIisCustomErrors = true;	//Tell IIS to use your error text not the 'standard' error text!!
						//ALSO clues jQuery to add the parsed responseJSON object to the jqXHR object!!
						dberrorcontext.createLogEntry(System.Web.HttpContext.Current, DateTime.UtcNow, "updateMarkers(...)", wex, "Web Exception: " + wex.Message);

						return Json(new { Message = wex.Message }, "application/json");

					}
					else if ( typeof (System.InvalidOperationException) == ex.GetType() )
					{
						//Recover the returned error message...
						Response.StatusCode = (int)HttpStatusCode.RequestEntityTooLarge;
						Response.StatusDescription = ex.Message;
						Response.TrySkipIisCustomErrors = true;	//Tell IIS to use your error text not the 'standard' error text!!
																//ALSO clues jQuery to add the parsed responseJSON object to the jqXHR object!!
						dberrorcontext.createLogEntry(System.Web.HttpContext.Current, DateTime.UtcNow, "updateMarkers(...)", ex, "NON-Web Exception" + ex.Message);

						return Json(new { Message = ex.Message }, "application/json");
					}
					else
					{
						//Assume a timeout has occurred...
						string message = "The execution of the search took too long. Please limit search area and/or Keywords.";
						Response.StatusCode = (int)HttpStatusCode.RequestTimeout;
						Response.StatusDescription = message;
						Response.TrySkipIisCustomErrors = true;	//Tell IIS to use your error text not the 'standard' error text!!
																//ALSO clues jQuery to add the parsed responseJSON object to the jqXHR object!!
						dberrorcontext.createLogEntry(System.Web.HttpContext.Current, DateTime.UtcNow, "updateMarkers(...)", ex, "Defaults to timeout exception: " + message);

						return Json(new { Message = message }, "application/json");
					}
				}

				//var session2 =(List<BusinessObjects.Models.SeriesDataCartModel.SeriesDataCart>) Session["Series"];
			}
			else
			{
             	//BCC - 19-Nov-2015 - GitHub Issues #67 - Application unresponsive after session timeout and zoom out...
				var retrievedSeries = (List<TimeSeriesViewModel>)Session["Series"];

				if (null != retrievedSeries)	//If a session timeout has occurred, the new session object will not contain the 'Series' element!!
				{
					var markerClustererHelper = new MarkerClustererHelper();
					//transform list int clusteredpins
					var pins = transformSeriesDataCartIntoClusteredPin(retrievedSeries, filterAndSearchCriteria);

					var clusteredPins = markerClustererHelper.clusterPins(pins, CLUSTERWIDTH, CLUSTERHEIGHT, CLUSTERINCREMENT, zoomLevel, MAXCLUSTERCOUNT, MINCLUSTERDISTANCE);
					Session["ClusteredPins"] = clusteredPins;

					var centerPoint = new LatLong(0, 0);
					markerjSON = markerClustererHelper.createMarkersGEOJSON(clusteredPins, zoomLevel, centerPoint, "");
				}
				else
				{
					//Likely session timeout - return a Request Timeout error (408)...
					string message = "User session has expired!!";

					Response.StatusCode = (int) HttpStatusCode.RequestTimeout;
					Response.StatusDescription = message;
					Response.TrySkipIisCustomErrors = true;	//Tell IIS to use your error text not the 'standard' error text!!

					return Json(new { Message = message }, "application/json");
				}

			}
			return Json(markerjSON);

		}