Exemplo n.º 1
0
        private static void processPISA_BQ_single_XML(string[] Element, DateTime dt1970, logXContainer _ret, XmlSerializer logSerializer, string _PersonIdentifier, string _xml)
        {
            var _tr  = new StringReader(_xml);
            log _log = (log)logSerializer.Deserialize(_tr);

            if (_log.itemGroup != null)
            {
                // update epoch information
                foreach (var i in _log.itemGroup)
                {
                    if (!i.epochSpecified && i.userEvents.Length > 0)
                    {
                        i.epoch = i.userEvents[0].epoch;
                    }
                }

                List <logItemGroup> _sortedItemGroupList = _log.itemGroup.OrderBy(o => o.epoch).ToList();

                DateTime _MinAbsoluteTime = DateTime.MaxValue;
                DateTime _PreviousEvent   = DateTime.MaxValue;
                if (_log.User != _PersonIdentifier)
                {
                    throw new Exception("Person identifier miss-match.");
                }
                int _EventID           = _ret.GetMaxID(_PersonIdentifier);
                int _EventVisitCounter = 0;

                Dictionary <string, int> _elementVisitCounterDict = new Dictionary <string, int>();
                string _currentElement = "";

                foreach (var p in _sortedItemGroupList)
                {
                    string _Element = p.code;

                    if (_currentElement != _Element)
                    {
                        _EventVisitCounter = 0;
                        _currentElement    = _Element;
                        if (!_elementVisitCounterDict.ContainsKey(_Element))
                        {
                            _elementVisitCounterDict.Add(_Element, 0);
                        }
                        else
                        {
                            _elementVisitCounterDict[_Element] += 1;
                        }
                    }

                    DateTime _ElementStart = dt1970.AddMilliseconds(p.epoch);
                    if (_PreviousEvent == DateTime.MaxValue)
                    {
                        _PreviousEvent = _ElementStart;
                    }

                    foreach (var _event in p.userEvents)
                    {
                        string _LogEventName = _event.type;

                        DateTime _AbsoluteTime = dt1970.AddMilliseconds(_event.epoch);
                        if (_AbsoluteTime < _MinAbsoluteTime)
                        {
                            _MinAbsoluteTime = _AbsoluteTime;
                        }

                        Dictionary <string, string> _EventValues = new Dictionary <string, string>();
                        for (int i = 0; i < _event.ItemsElementName.Length; i++)
                        {
                            if (_event.ItemsElementName[i].ToString() == "context")
                            {
                                _EventValues.Add("Context", _event.Items[i]);
                            }
                            else if (_event.ItemsElementName[i].ToString() == "value")
                            {
                                _EventValues.Add("Value", _event.Items[i]);
                            }
                            else if (_event.ItemsElementName[i].ToString() == "id")
                            {
                                _EventValues.Add("Id", _event.Items[i]);
                            }
                            else
                            {
                                throw new Exception("Element name not expected.");
                            }
                        }

                        _EventValues.Add("RelativeTimeFrame", (_AbsoluteTime - _ElementStart).TotalMilliseconds.ToString());
                        _EventValues.Add("RelativeTimePrevious", (_AbsoluteTime - _PreviousEvent).TotalMilliseconds.ToString());

                        if (Element.Length == 0 || Element.Contains <string>(_Element))
                        {
                            var doc  = new XDocument(new XElement(_LogEventName));
                            var root = doc.Root;
                            foreach (string val in _EventValues.Keys)
                            {
                                root.Add(new XAttribute(val, _EventValues[val]));
                            }

                            logxGenericLogElement _parament = new logxGenericLogElement()
                            {
                                PersonIdentifier = _PersonIdentifier,
                                Item             = _Element,
                                EventID          = _EventID,
                                EventName        = _LogEventName,
                                TimeStamp        = _AbsoluteTime,
                                EventDataXML     = doc.ToString()
                            };

                            _ret.AddEvent(_parament);
                        }

                        _EventID           += 1;
                        _EventVisitCounter += 1;
                        _PreviousEvent      = _AbsoluteTime;
                    }
                }

                // check for suspicious times

                /* TODO
                 * _currentElement = "";
                 * List<string> framesWithSuspiciousData = new List<string>();
                 * foreach (var v in _inMemoryTempDataEvents)
                 * {
                 *  if (_currentElement != v.EventName)
                 *      _currentElement = v.EventName;
                 *
                 *  if (v.TimeDifferencePrevious.TotalMinutes > 30)
                 *      v.AddEventValue("Flag", "TimeToLong");
                 *
                 *  if (v.TimeDifferencePrevious.TotalMilliseconds < 0)
                 *      v.AddEventValue("Flag", "TimeNegative");
                 * }
                 */
            }

            _tr.Close();
        }