示例#1
0
        private string GetVesselUpdateQuery(VesselUpdateModel update)
        {
            VesselAisUpdateModel existingVessel = FindExistingVessel(update.VesselId);

            existingVessel.VesselId = update.VesselId;
            existingVessel.Imo      = update.IMO;

            string query = BuildSingleVesselQuery(existingVessel, update) ?? "";

            return(query);
        }
示例#2
0
        public async Task <VesselUpdateModel> GetVesselUpdatesAsync(VesselAisUpdateModel aisUpdateModel, CancellationToken token, SemaphoreSlim semaphoreThrottel)
        {
            VesselUpdateModel vessel = null;

            try
            {
                bool skip = false;

                if (aisUpdateModel.Mmsi == 0) //if could not be scrapped with "full"
                {
                    skip = true;
                    _progress.AddSkipped();
                }

                await semaphoreThrottel.WaitAsync();

                if (!skip)
                {
                    vessel          = _scrapper.ScrapSingleVessel(aisUpdateModel.Mmsi, aisUpdateModel.Imo);
                    vessel.VesselId = aisUpdateModel.VesselId;

                    if (vessel.IMO != aisUpdateModel.Imo)
                    {
                        throw new Exception("Received vessel imo differs from the one passed.");
                    }

                    while (_progress.GetIsUpdatingDatabase() || _progress.GetIsUpdatingPaused())
                    {
                        await Task.Delay(100);
                    }

                    _progress.AddToReturnedResultsQuantity();
                }
            }
            catch (Exception ex)
            {
                _progress.SetLastError(ex.Message);
                _progress.AddFailedRequest();
                vessel = null;
            }
            finally
            {
                while (_progress.GetIsUpdatingDatabase() || _progress.GetIsUpdatingPaused())
                {
                    await Task.Delay(100);
                }

                semaphoreThrottel.Release();
            }

            return(vessel);
        }
        private void GetVesselUpdatesAsync_OnMmsiEqualZero_ReturnsNullAndCallsMethodsInFinallyOnce()
        {
            VesselAisUpdateModel updateModel = new VesselAisUpdateModel()
            {
                Mmsi = 0
            };

            Task <VesselUpdateModel> result = _service.GetVesselUpdatesAsync(updateModel, new CancellationToken(), new SemaphoreSlim(1));

            Assert.Null(result.Result);
            _progressMock.Verify(mock => mock.GetIsUpdatingDatabase(), Times.Once());
            _progressMock.Verify(mock => mock.GetIsUpdatingPaused(), Times.Once());
        }
        private void GetVesselUpdatesAsync_OnExceptionThrownByScrapSingleVessel_CallsMethodsInCatchOnce()
        {
            Exception ex = new Exception("some_exception");

            _scrapperMock.Setup(mock => mock.ScrapSingleVessel(It.IsAny <int>(), It.IsAny <int>())).Throws(ex);
            VesselAisUpdateModel updateModel = new VesselAisUpdateModel()
            {
                Mmsi = 12345678, Speed = 0.1, Imo = _correctImo
            };

            Task <VesselUpdateModel> result = _service.GetVesselUpdatesAsync(updateModel, new CancellationToken(), new SemaphoreSlim(1));

            Assert.Null(result.Result);
            _progressMock.Verify(mock => mock.GetIsUpdatingDatabase(), Times.Once());
            _progressMock.Verify(mock => mock.GetIsUpdatingPaused(), Times.Once());
            _progressMock.Verify(mock => mock.AddFailedRequest(), Times.Once());
            _progressMock.Verify(mock => mock.SetLastError(ex.Message), Times.Once());
        }
        public VesselAisUpdateModel GetVesselData(string searchQuery)
        {
            VesselAisUpdateModel existing = new VesselAisUpdateModel();
            using (SqlConnection connection = GetConnection(_connectionString))
            using (SqlCommand command = connection.CreateCommand())
            {
                connection.Open();
                command.CommandType = CommandType.Text;
                command.CommandText = searchQuery;
                using (SqlDataReader rdr = command.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        existing.Mmsi = (int)rdr["MMSI"];
                        existing.SpeedMax = null;

                        if (!string.IsNullOrEmpty(rdr["SpeedMax"].ToString()))
                        {
                            if (double.TryParse(rdr["SpeedMax"].ToString(), out double d))
                            {
                                existing.SpeedMax = d;
                            }
                        }

                        if (!string.IsNullOrEmpty(rdr["DraughtMax"].ToString()))
                        {
                            if (double.TryParse(rdr["DraughtMax"].ToString(), out double d))
                            {
                                existing.DraughtMax = d;
                            }
                        }
                    }
                }

                connection.Close();
            }

            return existing;
        }
        private void GetVesselUpdatesAsync_OnReceivedResultWithDifferentImo_ThrowsException()
        {
            int                  _incorrectImo = _correctImo - 1;
            Exception            ex            = new Exception("Received vessel imo differs from the one passed.");
            VesselAisUpdateModel updateModel   = new VesselAisUpdateModel()
            {
                Imo = 9482469, Mmsi = 12345678, Speed = 0.1
            };
            VesselUpdateModel returnedModel = new VesselUpdateModel()
            {
                IMO = _incorrectImo
            };

            _scrapperMock.Setup(mock => mock.ScrapSingleVessel(It.IsAny <int>(), It.IsAny <int>())).Returns(returnedModel);

            Task <VesselUpdateModel> result = _service.GetVesselUpdatesAsync(updateModel, new CancellationToken(), new SemaphoreSlim(1));

            Assert.Null(result.Result);
            _progressMock.Verify(mock => mock.GetIsUpdatingDatabase(), Times.Once());
            _progressMock.Verify(mock => mock.GetIsUpdatingPaused(), Times.Once());
            _progressMock.Verify(mock => mock.AddFailedRequest(), Times.Once());
            _progressMock.Verify(mock => mock.SetLastError(ex.Message), Times.Once());
        }
        private void GetVesselUpdatesAsync_OnCorrectVesselModel_ReturnsVesselUpdateModel()
        {
            VesselAisUpdateModel updateModel = new VesselAisUpdateModel()
            {
                Mmsi = 12345678, Speed = 0.1, Imo = _correctImo
            };

            Task <VesselUpdateModel> result = _service.GetVesselUpdatesAsync(updateModel, new CancellationToken(), new SemaphoreSlim(1));

            Assert.NotNull(result.Result);
            Assert.Equal(new DateTime(2020, 10, 02), result.Result.AISLatestActivity);
            Assert.Equal("some_status", result.Result.AISStatus);
            Assert.Equal(new DateTime(2020, 10, 03), result.Result.ETA);
            Assert.Equal(200.3, result.Result.Course);
            Assert.Equal(8.4, result.Result.Speed);
            Assert.Equal("some_port", result.Result.Destination);
            Assert.Equal(10.3, result.Result.Draught);
            Assert.Equal(9482469, result.Result.IMO);
            Assert.Equal(312619000, result.Result.MMSI);
            Assert.Equal(3.7294, result.Result.Lon);
            Assert.Equal(41.842, result.Result.Lat);
            _progressMock.Verify(mock => mock.GetIsUpdatingDatabase(), Times.Exactly(2));
            _progressMock.Verify(mock => mock.GetIsUpdatingPaused(), Times.Exactly(2));
        }
示例#8
0
        private string BuildSingleVesselQuery(VesselAisUpdateModel existingVessel, VesselUpdateModel update)
        {
            StringBuilder vesselQuerySb = new StringBuilder();

            vesselQuerySb.Append("UPDATE dbo.Vessels SET IMO = '" + update.IMO + "'");
            if (existingVessel.Mmsi == 0)
            {
                if (update.MMSI.HasValue)
                {
                    vesselQuerySb.Append(" , MMSI = '" + update.MMSI + "'");
                }
            }
            if (update.AISLatestActivity.HasValue)
            {
                vesselQuerySb.Append(" , AISLatestActivity = '" + update.AISLatestActivity.Value.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'");
            }
            if (update.ETA.HasValue)
            {
                vesselQuerySb.Append(" , ETA = '" + update.ETA.Value.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'");
            }
            if (update.Course.HasValue)
            {
                vesselQuerySb.Append(" , Course = '" + update.Course.Value.ToString("0.0", System.Globalization.CultureInfo.InvariantCulture) + "'");
            }
            if (update.Lat.HasValue)
            {
                vesselQuerySb.Append(" , Lat = '" + update.Lat.Value.ToString("0.0000", System.Globalization.CultureInfo.InvariantCulture) + "'");
            }
            if (update.Lon.HasValue)
            {
                vesselQuerySb.Append(" , Lon = '" + update.Lon.Value.ToString("0.0000", System.Globalization.CultureInfo.InvariantCulture) + "'");
            }
            if (update.Speed.HasValue)
            {
                vesselQuerySb.Append(" , Speed = '" + update.Speed.Value.ToString("0.0", System.Globalization.CultureInfo.InvariantCulture) + "'");
                if ((existingVessel.SpeedMax < update.Speed || existingVessel.SpeedMax == null) && update.Speed != 0)
                {
                    vesselQuerySb.Append(" , SpeedMax = '" + update.Speed.Value.ToString("0.0", System.Globalization.CultureInfo.InvariantCulture) + "'");
                }
            }
            if (update.Draught.HasValue)
            {
                vesselQuerySb.Append(" , Draught = '" + update.Draught.Value.ToString("0.0", System.Globalization.CultureInfo.InvariantCulture) + "'");
                if ((existingVessel.DraughtMax < update.Draught || existingVessel.DraughtMax == null) && update.Draught != 0)
                {
                    vesselQuerySb.Append(" , DraughtMax = '" + update.Draught.Value.ToString("0.0", System.Globalization.CultureInfo.InvariantCulture) + "'");
                }
            }
            if (!string.IsNullOrEmpty(update.AISStatus))
            {
                vesselQuerySb.Append(" , AISStatus = '" + _stringParser.MakeFirstCharactersToUpper(update.AISStatus) + "'");
            }
            if (!string.IsNullOrEmpty(update.Destination))
            {
                vesselQuerySb.Append(" , Destination = '" + _stringParser.MakeFirstCharactersToUpper(update.Destination) + "'");
            }
            if (!string.IsNullOrEmpty(update.GeographicalArea))
            {
                vesselQuerySb.Append(" , GeographicalArea = '" + update.GeographicalArea + "'");
            }
            if (!string.IsNullOrEmpty(update.CurrnetPortLocode))
            {
                vesselQuerySb.Append(" , CurrnetPortLocode = '" + update.CurrnetPortLocode + "'");
            }
            vesselQuerySb.Append(" WHERE VesselId = " + existingVessel.VesselId + "; ");

            vesselQuerySb.AppendLine();

            return(vesselQuerySb.ToString());
        }