Exemplo n.º 1
0
        /// <summary>
        ///   Memorizza un nuovo messaggio posizione
        /// </summary>
        /// <param name="messaggio">Il messaggio</param>
        /// <returns>L'oggetto inserito con la sua location</returns>
        public IHttpActionResult Post([FromBody] MessaggioPosizione messaggio)
        {
            messaggio.IstanteArchiviazione = DateTime.Now;
            this.messaggioPosizioneRepository.Store(messaggio);

            return(CreatedAtRoute("DefaultApi", new { id = messaggio.Id }, messaggio));
        }
Exemplo n.º 2
0
        /// <summary>
        ///   Try to interpolate the three most recent messages. Interpolation only works if the
        ///   first and the third message do not interpolate.
        /// </summary>
        /// <param name="newMessage">
        ///   The message to be stored. Storage is in charge of the decorated instance.
        /// </param>
        public void Store(MessaggioPosizione newMessage)
        {
            this.decorated.Store(newMessage);

            var lastThreeMessages = this.messaggiPosizioneCollection.Find(m => m.CodiceMezzo == newMessage.CodiceMezzo)
                .SortByDescending(m => m.IstanteAcquisizione)
                .ThenByDescending(m => m.Id)
                .Limit(3)
                .ToList();

            if ((lastThreeMessages.Count == 3) &&
                firstAndThirdMessagesDoNotInterpolate(lastThreeMessages) &&
                this.AllInTheSamePosition(lastThreeMessages))
            {
                var interpolatingMessage = lastThreeMessages[0];
                var msgToInterpolate = lastThreeMessages[1];
                var lastInterpolationData = msgToInterpolate.InterpolationData ?? new InterpolationData(0, 0, null);

                var interpolationData = new InterpolationData(
                    (int)(lastInterpolationData.Length_sec +
                        newMessage.IstanteAcquisizione.Subtract(msgToInterpolate.IstanteAcquisizione).TotalSeconds),
                    lastInterpolationData.Messages + 1,
                    msgToInterpolate.IstanteAcquisizione);

                var deleteTask = this.messaggiPosizioneCollection.DeleteOneAsync(m => m.Id == msgToInterpolate.Id);
                var updateTask = this.messaggiPosizioneCollection.UpdateOneAsync(
                    m => m.Id == interpolatingMessage.Id,
                    Builders<MessaggioPosizione>.Update.Set(m => m.InterpolationData, interpolationData));

                Task.WaitAll(deleteTask, updateTask);
            }
        }
Exemplo n.º 3
0
        public void ASingleMessagesIsStored()
        {
            var storeMessaggioPosizione = new StoreMessaggioPosizione_DB(dbContext.MessaggiPosizioneCollection);

            var msg1 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow,
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
            };

            storeMessaggioPosizione.Store(msg1);

            var storedMsgs = dbContext.MessaggiPosizioneCollection
                             .Find(m => m.CodiceMezzo == "Test")
                             .ToList();

            Assert.Multiple(() =>
            {
                Assert.That(storedMsgs.Count, Is.EqualTo(1));
                Assert.That(storedMsgs[0].Id, Is.EqualTo(msg1.Id));
                Assert.That(storedMsgs[0].Ultimo, Is.True);
            });
        }
        public void Store(MessaggioPosizione newMessage)
        {
            if (!string.IsNullOrWhiteSpace(newMessage.Id))
            {
                throw new ArgumentException("Must be null", nameof(MessaggioPosizione.Id));
            }

            if (newMessage.IstanteAcquisizione.Kind == DateTimeKind.Unspecified)
            {
                throw new ArgumentException($"Date.Kind cannot be unspecified. Only local and UTC time is allowed. SourceCode: { newMessage.Fonte.CodiceFonte }.");
            }

            //fetch time and id of the last stored message for this vehicle
            var filter = Builders <MessaggioPosizione> .Filter
                         .And(
                Builders <MessaggioPosizione> .Filter.Eq(m => m.Ultimo, true),
                Builders <MessaggioPosizione> .Filter.Eq(m => m.CodiceMezzo, newMessage.CodiceMezzo)
                );

            var lastStoredMessageData = this.messaggiPosizioneCollection.Find(filter)
                                        .Sort(Builders <MessaggioPosizione> .Sort.Descending(m => m.IstanteAcquisizione))
                                        .Project(m => new
            {
                msgTime = m.IstanteAcquisizione,
                msgId   = m.Id
            })
                                        .ToList();

            //Check whether more messages are marked as last (it's an anomaly). In case, fix.
            if (lastStoredMessageData.Count >= 2)
            {
                var idsToReset = lastStoredMessageData.Skip(1).Select(m => m.msgId);
                log.Warn($"More messages found marked as last. vehicleCode: { newMessage.CodiceMezzo } ids: { string.Join(", ", idsToReset) } ");
                this.messaggiPosizioneCollection.UpdateManyAsync(
                    Builders <MessaggioPosizione> .Filter.In(m => m.Id, idsToReset),
                    Builders <MessaggioPosizione> .Update.Set(m => m.Ultimo, false));
                log.Info($"Anomalous ids have been reset. Anomaly fixed.");
            }

            var noLastMessage = !lastStoredMessageData.Any();

            if (noLastMessage)
            {
                this.InsertAsFirstMessage(newMessage);
            }
            else
            {
                var singleLastStoredMessageData = lastStoredMessageData[0];
                var newMessageIsMoreRecent      = newMessage.IstanteAcquisizione >= singleLastStoredMessageData.msgTime;

                if (newMessageIsMoreRecent)
                {
                    this.InsertMoreRecentMessage(newMessage, singleLastStoredMessageData.msgId);
                }
                else
                {
                    this.InsertLessRecentMessage(newMessage);
                }
            }
        }
        /// <summary>
        ///   Memorizza un nuovo messaggio posizione
        /// </summary>
        /// <param name="messaggio">Il messaggio</param>
        /// <returns>L'oggetto inserito con la sua location</returns>
        public IHttpActionResult Post([FromBody] MessaggioPosizione messaggio)
        {
            this.storeMessaggioPosizione.Store(messaggio);

            DatiPosizioneLive.InviaPosLive(messaggio);

            return(CreatedAtRoute("DefaultApi", new { id = messaggio.Id }, messaggio));
        }
Exemplo n.º 6
0
        public void TheSecondOfThreeCloseMessagesIsInterpolated()
        {
            var storeMessaggioPosizione = new StoreMessaggioPosizione_DB(dbContext.MessaggiPosizioneCollection);
            var interpolationDecorator  = new StoreMessaggioPosizione_DeleteInterpolatedMessages_Decorator(storeMessaggioPosizione, dbContext.MessaggiPosizioneCollection);

            interpolationDecorator.InterpolationThreshold_mt = 100;

            var msg1 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow.AddMinutes(-2),
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
            };

            var msgTime = DateTime.UtcNow.AddMinutes(-1);
            var msg2    = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = msgTime,
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
            };

            var msg3 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow.AddMinutes(0),
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
            };

            interpolationDecorator.Store(msg1);
            interpolationDecorator.Store(msg2);
            interpolationDecorator.Store(msg3);

            var storedMsgs = dbContext.MessaggiPosizioneCollection
                             .Find(m => m.CodiceMezzo == "Test")
                             .ToList();

            Assert.Multiple(() =>
            {
                Assert.That(storedMsgs.Count, Is.EqualTo(2));

                Assert.That(storedMsgs.Single(m => m.Id == msg1.Id).InterpolationData, Is.Null);

                Assert.That(storedMsgs.Single(m => m.Id == msg3.Id).InterpolationData.Messages, Is.EqualTo(1));
                Assert.That(storedMsgs.Single(m => m.Id == msg3.Id).InterpolationData.Length_sec, Is.EqualTo(60));
                Assert.That(storedMsgs.Single(m => m.Id == msg3.Id).InterpolationData.LastMsgTime.Value.Subtract(msgTime).TotalMilliseconds, Is.LessThan(10));
            });
        }
Exemplo n.º 7
0
        public void Store(MessaggioPosizione messaggio)
        {
            var sourceIp = HttpContext.Current.Request.UserHostAddress;

            if (this.AllowedSources.All(allowed => !checker.Check(sourceIp, allowed)))
            {
                throw new UnauthorizedAccessException("Client not authorized by the current configuration policies.");
            }

            this.decorated.Store(messaggio);
        }
        /// <summary>
        ///   Insert a message when it is the more recent message.
        /// </summary>
        /// <param name="newMessage">The message to be inserted</param>
        private void InsertMoreRecentMessage(MessaggioPosizione newMessage, string lastStoredMsgId)
        {
            newMessage.Ultimo = true;
            newMessage.IstanteArchiviazione = DateTime.UtcNow;
            var insertTask = this.messaggiPosizioneCollection.InsertOneAsync(newMessage);

            var updateTask = this.messaggiPosizioneCollection.UpdateOneAsync(
                m => m.Id == lastStoredMsgId,
                Builders <MessaggioPosizione> .Update.Set(m => m.Ultimo, false));

            Task.WaitAll(insertTask, updateTask);
        }
        public void Store(MessaggioPosizione messaggioPosizione)
        {
            if (!string.IsNullOrWhiteSpace(messaggioPosizione.Id))
            {
                throw new ArgumentException("Deve essere null", nameof(MessaggioPosizione.Id));
            }

            messaggioPosizione.IstanteArchiviazione = DateTime.Now;
            var dto = Mapper.Map <MessaggioPosizione_DTO>(messaggioPosizione);

            this.messaggiPosizioneCollection.InsertOne(dto);
            messaggioPosizione.Id = dto.Id;
        }
Exemplo n.º 10
0
        public void WhenThirdMessagesIsNotSoCloseMessagesAreNotInterpolated()
        {
            var storeMessaggioPosizione = new StoreMessaggioPosizione_DB(dbContext.MessaggiPosizioneCollection);
            var interpolationDecorator  = new StoreMessaggioPosizione_DeleteInterpolatedMessages_Decorator(storeMessaggioPosizione, dbContext.MessaggiPosizioneCollection);

            interpolationDecorator.InterpolationThreshold_mt = 10;

            var msg1 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow.AddMinutes(-2),
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
            };

            var msg2 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow.AddMinutes(-1),
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
            };

            var msg3 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow.AddMinutes(0),
                Localizzazione      = new Localizzazione {
                    Lat = 1.00015, Lon = 1
                },                                                              //few more than 10 mt
            };

            interpolationDecorator.Store(msg1);
            interpolationDecorator.Store(msg2);
            interpolationDecorator.Store(msg3);

            var storedMsgs = dbContext.MessaggiPosizioneCollection
                             .Find(m => m.CodiceMezzo == "Test")
                             .ToList();

            Assert.Multiple(() =>
            {
                Assert.That(storedMsgs.Count, Is.EqualTo(3));
                Assert.That(storedMsgs.Single(m => m.Id == msg1.Id).InterpolationData, Is.Null);
                Assert.That(storedMsgs.Single(m => m.Id == msg2.Id).InterpolationData, Is.Null);
                Assert.That(storedMsgs.Single(m => m.Id == msg3.Id).InterpolationData, Is.Null);
            });
        }
Exemplo n.º 11
0
        public void StoringMessageFixesAnomalousPresenceOfMoreLastMessages()
        {
            var storeMessaggioPosizione = new StoreMessaggioPosizione_DB(dbContext.MessaggiPosizioneCollection);

            var msg1 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow.AddMinutes(-2),
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
                Ultimo = true
            };

            var msg2 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow.AddMinutes(-1),
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
                Ultimo = true
            };

            dbContext.MessaggiPosizioneCollection.InsertMany(new[] { msg1, msg2 });

            var msg3 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow,
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
                Ultimo = true
            };

            storeMessaggioPosizione.Store(msg3);

            var storedMsgs = dbContext.MessaggiPosizioneCollection
                             .Find(m => m.CodiceMezzo == "Test")
                             .ToList();

            Assert.Multiple(() =>
            {
                Assert.That(storedMsgs.Count, Is.EqualTo(3));
                Assert.That(storedMsgs.Single(m => m.Id == msg1.Id).Ultimo, Is.False);
                Assert.That(storedMsgs.Single(m => m.Id == msg2.Id).Ultimo, Is.False);
                Assert.That(storedMsgs.Single(m => m.Id == msg3.Id).Ultimo, Is.True);
            });
        }
Exemplo n.º 12
0
        public void StoringMessageWithNonNullIdRaisesException()
        {
            var storeMessaggioPosizione = new StoreMessaggioPosizione_DB(dbContext.MessaggiPosizioneCollection);

            var msg = new MessaggioPosizione()
            {
                Id          = "ABCD",
                CodiceMezzo = "Test"
            };

            Assert.Throws <ArgumentException>(() =>
            {
                storeMessaggioPosizione.Store(msg);
            });
        }
        public void Store(MessaggioPosizione newMessage)
        {
            var vehicleCode = newMessage.CodiceMezzo;

            acquireLock(vehicleCode);

            try
            {
                // inserts the positione message
                this.decorated.Store(newMessage);
            }
            finally
            {
                releaseLock(vehicleCode);
            }
        }
Exemplo n.º 14
0
        public static void InviaPosLive(MessaggioPosizione messaggio)
        {
            try
            {
                GlobalHost.ConnectionManager.GetConnectionContext <DatiPosizioneLive>().Connection.Broadcast(
                    JsonConvert.SerializeObject(messaggio, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings
                {
                    NullValueHandling = NullValueHandling.Ignore
                    ,
                    ContractResolver = new DefaultContractResolver()
                    {
                        NamingStrategy = new CamelCaseNamingStrategy()
                    }
                })

                    );
            }
            catch
            {
            }
        }
Exemplo n.º 15
0
        public void Store(MessaggioPosizione newMessage)
        {
            this.decorated.Store(newMessage);

            var lastTwoMessages = this.messaggiPosizioneCollection.Find(m => m.CodiceMezzo == newMessage.CodiceMezzo)
                                  .SortByDescending(m => m.IstanteAcquisizione)
                                  .Limit(2)
                                  .ToList();

            if (lastTwoMessages.Count == 2)
            {
                var mostRecentMsg = lastTwoMessages[0];
                var lessRecentMsg = lastTwoMessages[1];
                var distance_km   = mostRecentMsg.Localizzazione.GetDistanceTo(lessRecentMsg.Localizzazione) / 1e3;
                var hours         = mostRecentMsg.IstanteAcquisizione.Subtract(lessRecentMsg.IstanteAcquisizione).TotalHours;
                var velocity_Kmh  = distance_km / hours;

                if (velocity_Kmh >= this.VelocityThreshold_Kmh)
                {
                    log.Warn($"Too high velocity for vehicle { mostRecentMsg.CodiceMezzo }: { (int)velocity_Kmh }Km/h registered at { mostRecentMsg.IstanteAcquisizione.ToString("yyyyMMddHHmmss") }. Message ids: { mostRecentMsg.Id }, { lessRecentMsg.Id }");
                }
            }
        }
Exemplo n.º 16
0
        public void TwoConsecutiveMessagesAreStored()
        {
            var storeMessaggioPosizione = new StoreMessaggioPosizione_DB(dbContext.MessaggiPosizioneCollection);

            var msg1 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow.AddMinutes(-1),
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
            };

            var msg2 = new MessaggioPosizione()
            {
                CodiceMezzo         = "Test",
                IstanteAcquisizione = DateTime.UtcNow,
                Localizzazione      = new Localizzazione {
                    Lat = 1, Lon = 1
                },
            };

            storeMessaggioPosizione.Store(msg1);
            storeMessaggioPosizione.Store(msg2);

            var storedMsgs = dbContext.MessaggiPosizioneCollection
                             .Find(m => m.CodiceMezzo == "Test")
                             .ToList();

            Assert.Multiple(() =>
            {
                Assert.That(storedMsgs.Count, Is.EqualTo(2));
                Assert.That(storedMsgs.Single(m => m.Id == msg1.Id).Ultimo, Is.False);
                Assert.That(storedMsgs.Single(m => m.Id == msg2.Id).Ultimo, Is.True);
            });
        }
 /// <summary>
 ///   Insert a message when there are more recent messages already stored.
 /// </summary>
 /// <param name="newMessage">The message to be inserted</param>
 private void InsertLessRecentMessage(MessaggioPosizione newMessage)
 {
     newMessage.Ultimo = false;
     newMessage.IstanteArchiviazione = DateTime.UtcNow;
     this.messaggiPosizioneCollection.InsertOne(newMessage);
 }
Exemplo n.º 18
0
 public static MessaggioPosizione_DTO CreateFromDomain(MessaggioPosizione messaggioPosizione)
 {
     return(Mapper.Map <MessaggioPosizione_DTO>(messaggioPosizione));
 }