Exemple #1
0
		public string LookupValueFromTitle( clientDataSource cds, TimeSeriesViewModel tsvm )
		{
			string value = String.Empty;

			//Validate/initialize input parameters
			if (null == cds || null == tsvm)
			{
				return value;	//Invalid parameter(s) - return early
			}

			switch (cds.title)
			{
				case "Service URL":		//Data Service URL (NOT the WSDL URL)

					//On the client's Data page, the DataTable's Service URL column lists the organization name.  The entry contains a link to the DescriptionUrl.
 					// On a search, the DataTable references the organization name value not the DescriptionUrl value...  
					//value = webServiceList.Find(wsn => wsn.ServiceCode.Equals(tsvm.ServCode, StringComparison.CurrentCultureIgnoreCase)).DescriptionUrl;
					value = tsvm.Organization;
					break;
				default:
					//Unknown title, take no action...
					break;
			}

			//Processing complete - return
			return value;
		}
Exemple #2
0
        //Copy constructor...
        public TimeSeriesViewModel(TimeSeriesViewModel tsvm)
        {
            SeriesId     = tsvm.SeriesId;
            ServCode     = tsvm.ServCode;
            ServTitle    = tsvm.ServTitle;
            ServURL      = tsvm.ServURL;
            SiteCode     = tsvm.SiteCode;
            VariableCode = tsvm.VariableCode;
            VariableName = tsvm.VariableName;
            BeginDate    = tsvm.BeginDate;
            EndDate      = tsvm.EndDate;
            ValueCount   = tsvm.ValueCount;
            SiteName     = tsvm.SiteName;
            Latitude     = tsvm.Latitude;
            Longitude    = tsvm.Longitude;
            DataType     = tsvm.DataType;
            ValueType    = tsvm.ValueType;
            SampleMedium = tsvm.SampleMedium;
            TimeUnit     = tsvm.TimeUnit;
            //BCC - 08-Aug-2016 - Enable general category assignment
            GeneralCategory = tsvm.GeneralCategory;
            TimeSupport     = tsvm.TimeSupport;
            ConceptKeyword  = tsvm.ConceptKeyword;
            //BCC - 15-Oct-29015 -  Suppress display of IsRegular
            //IsRegular = tsvm.IsRegular;
            VariableUnits = tsvm.VariableUnits;
            Citation      = tsvm.Citation;
            Organization  = tsvm.Organization;

            QCLID = tsvm.QCLID;

            QCLDesc = tsvm.QCLDesc;

            SourceOrg = tsvm.SourceOrg;

            SourceId = tsvm.SourceId;

            MethodId = tsvm.MethodId;

            MethodDesc = tsvm.MethodDesc;
        }
        //Copy constructor...
        public TimeSeriesViewModel(TimeSeriesViewModel tsvm)
        {
            SeriesId = tsvm.SeriesId;
            ServCode = tsvm.ServCode;
            ServTitle = tsvm.ServTitle;
            ServURL = tsvm.ServURL;
            SiteCode = tsvm.SiteCode;
            VariableCode = tsvm.VariableCode;
            VariableName = tsvm.VariableName;
            BeginDate = tsvm.BeginDate;
            EndDate = tsvm.EndDate;
            ValueCount = tsvm.ValueCount;
            SiteName = tsvm.SiteName;
            Latitude = tsvm.Latitude;
            Longitude = tsvm.Longitude;
            DataType = tsvm.DataType;
            ValueType = tsvm.ValueType;
            SampleMedium = tsvm.SampleMedium;
            TimeUnit = tsvm.TimeUnit;
            //BCC - 08-Aug-2016 - Enable general category assignment
            GeneralCategory = tsvm.GeneralCategory;
            TimeSupport = tsvm.TimeSupport;
            ConceptKeyword = tsvm.ConceptKeyword;
            //BCC - 15-Oct-29015 -  Suppress display of IsRegular
            //IsRegular = tsvm.IsRegular;
            VariableUnits = tsvm.VariableUnits;
            Citation = tsvm.Citation;
            Organization = tsvm.Organization;

            QCLID = tsvm.QCLID;

            QCLDesc = tsvm.QCLDesc;

            SourceOrg = tsvm.SourceOrg;

            SourceId = tsvm.SourceId;

            MethodId = tsvm.MethodId;

            MethodDesc = tsvm.MethodDesc;
        }
Exemple #4
0
		private TimeSeriesViewModel mapDataCartToTimeseries(BusinessObjects.Models.SeriesDataCartModel.SeriesDataCart dc, int id)
		{
			var allWebservices = (List < WebServiceNode >) Session["webServiceList"];

			var dict = allWebservices.Distinct().ToDictionary(i => i.ServiceCode, i => i.Organization);

			var dict1 = allWebservices.Distinct().ToDictionary(i => i.ServiceCode, i => i.Title);

			var obj = new TimeSeriesViewModel();           
			
			obj.SeriesId = id;
			obj.ServCode = dc.ServCode;
			obj.ServTitle = dict1.FirstOrDefault(x => x.Key == dc.ServCode).Value;
			obj.ServURL = dc.ServURL;
			obj.SiteCode = dc.SiteCode;
			obj.VariableCode = dc.VariableCode;
			obj.SiteName = dc.SiteName;
			obj.VariableName = dc.VariableName;
			obj.BeginDate = dc.BeginDate;
			obj.EndDate = dc.EndDate;
			obj.ValueCount = dc.ValueCount;
			obj.Latitude = dc.Latitude;
			obj.Longitude = dc.Longitude;
			obj.DataType = dc.DataType;
			obj.ValueType = dc.ValueType;
			obj.SampleMedium = dc.SampleMedium;
			//BCC - 08-Aug-2016 - Assign view model general category...
			obj.GeneralCategory = dc.GeneralCategory;
			obj.TimeUnit = dc.TimeUnit;
			obj.TimeSupport = dc.TimeSupport;
			obj.ConceptKeyword = dc.ConceptKeyword;
			//BCC - 15-Oct-2015 -  Suppress display of IsRegular
			//obj.IsRegular = dc.IsRegular;
			obj.VariableUnits = dc.VariableUnits;
			obj.Organization = dict.FirstOrDefault(x => x.Key == dc.ServCode).Value;

			//BCC - 07-Sep-2016 - Add additional fields for use with GetSeriesCatalogForBox3...
			obj.QCLID = dc.QCLID;
			obj.QCLDesc = dc.QCLDesc;

			obj.SourceId = dc.SourceId;
			obj.SourceOrg = dc.SourceOrg;

			obj.MethodId = dc.MethodId;
			obj.MethodDesc = dc.MethodDesc;

			return obj;
		}
Exemple #5
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);

		}