コード例 #1
0
        public void TestToReestrMspFromMsrCatalogItemsRequestDeserializeMethod()
        {
            var xmlCurrentDoc = new XmlDocument();

            xmlCurrentDoc.Load($"{Context.XMLMessagePath}{ToReestrMspFromMsrCatalogItemsRequest.NameForESB}.xml");

            var messageObj =
                SerializationTools.DeserialiseDataContract <ToReestrMspFromMsrCatalogItemsRequest>(xmlCurrentDoc.OuterXml);
            var originalMessageObj = SynchronizationTestHelper.GetToReestrMspFromMsrCatalogItemsRequestMessage();

            //TODO поправить по аналогии с TestToMsrFromReestrMspCatalogDataDeserializeMethod
            //Assert.IsFalse(message == null);
            Assert.AreEqual(messageObj.RequestInfo, originalMessageObj.RequestInfo);
            Assert.AreEqual(messageObj.Criteria.Type, originalMessageObj.Criteria.Type);

            for (int i = 0; i < messageObj.Criteria.Condition.Length; i++)
            {
                Assert.AreEqual(messageObj.Criteria.Condition[i].Attribute, originalMessageObj.Criteria.Condition[i].Attribute);
                Assert.AreEqual(messageObj.Criteria.Condition[i].Operator, originalMessageObj.Criteria.Condition[i].Operator);
                Assert.AreEqual(messageObj.Criteria.Condition[i].Value, originalMessageObj.Criteria.Condition[i].Value);
            }

            Assert.AreEqual(messageObj.Criteria.Criteria, originalMessageObj.Criteria.Criteria);
            Assert.AreEqual(messageObj.Sorting, originalMessageObj.Sorting);
            Assert.AreEqual(messageObj.Type, originalMessageObj.Type);
        }
        /// <summary>
        /// Обработать сообщение.
        /// </summary>
        /// <param name="message">Сообщение из шины.</param>
        public void HandleMessage(SyncLogItem logItem)
        {
            if (!string.IsNullOrEmpty(logItem.DataSet))
            {
                var ds = DataServiceProvider.DataService;
                List <DataObject> toUpdate = new List <DataObject>();
                var viewGruppa             = new View {
                    DefineClassType = typeof(GruppaDublei)
                };
                viewGruppa.AddProperties(
                    nameof(GruppaDublei.idReestrZapisi),
                    nameof(GruppaDublei.FullValue)
                    );
                var viewLichnost = new View {
                    DefineClassType = typeof(Leechnost)
                };
                viewLichnost.AddProperty(nameof(Leechnost.GruppaDublei));

                var doc = new XmlDocument();
                doc.LoadXml(logItem.DataSet);

                var response = SerializationTools.DeserialiseDataContract <ToMsrFromReestrMspMergedItemsResponse>(logItem.DataSet);
                var i        = 0;
                if (response?.Items == null)
                {
                    return;
                }
                foreach (var item in response.Items)
                {
                    var idReestrZapisi = item.Beneficiary.Guid.ToString();
                    var xml            = doc.SelectNodes("//*[local-name() = 'Item']")[i].OuterXml;
                    var gruppa         = ds.Query <GruppaDublei>(GruppaDublei.Views.AuditView).Where(x => x.idReestrZapisi == idReestrZapisi).FirstOrDefault();
                    if (gruppa == null)
                    {
                        gruppa = new GruppaDublei
                        {
                            idReestrZapisi = idReestrZapisi.ToString(),
                            FullValue      = xml
                        };
                    }
                    else
                    {
                        gruppa.FullValue = xml;
                    }
                    toUpdate.Add(gruppa);
                    var keys      = item.Sources.Select(x => (object)x.Key).ToList();
                    var lichnosti = ds.Query <Leechnost>(viewLichnost).Where(x => keys.Contains(x.__PrimaryKey)).ToList();
                    lichnosti.ForEach(x => x.GruppaDublei = gruppa);
                    toUpdate.AddRange(lichnosti);
                    i++;
                }

                var objects = toUpdate.ToArray();

                ds.UpdateObjects(ref objects);
            }
        }
 protected override void Process()
 {
     if (!string.IsNullOrEmpty(_syncLogItem.DataSet))
     {
         var response = SerializationTools.DeserialiseDataContract <ToMsrFromReestrMspCatalogItemsResponse>(_syncLogItem.DataSet);
         foreach (var item in response?.Items)
         {
             ProcessClassifier(item.Classifier, null);
         }
     }
 }
コード例 #4
0
 protected override void Process()
 {
     if (!string.IsNullOrEmpty(_syncLogItem.DataSet))
     {
         var response = SerializationTools.DeserialiseDataContract <ToMsrFromReestrMspFiasItemsResponse>(_syncLogItem.DataSet);
         foreach (var item in response?.Items)
         {
             ProcessFiasAddressObjects(item.FiasAddressObjects);
             ProcessFiasHousesStructures(item.FiasHousesStructures);
         }
     }
 }
コード例 #5
0
 protected override void Process()
 {
     if (!string.IsNullOrEmpty(_syncLogItem.DataSet))
     {
         var response = SerializationTools.DeserialiseDataContract <ToMsrFromReestrMspCatalogDataChanges>(_syncLogItem.DataSet);
         foreach (var item in response?.Items)
         {
             DateTime?state = item.State == tState.deleted ? (DateTime?)DateTime.Now : null;
             ProcessClassifier(item.Classifier, state);
         }
     }
 }
コード例 #6
0
        public void TestToTUFromMSRResponseDeserializeMethod()
        {
            var xmlCurrentDoc = new XmlDocument();

            xmlCurrentDoc.Load($"{Context.XMLMessagePath}{ToTUFromMsrResponse.NameForESB}.xml");

            var messageObj =
                SerializationTools.DeserialiseDataContract <ToTUFromMsrResponse>(xmlCurrentDoc.OuterXml);
            var originalMessageObj = SynchronizationTestHelper.GetToTUFromMsrResponseMessage();

            Assert.AreEqual(messageObj.RequestInfo, originalMessageObj.RequestInfo);
            Assert.AreEqual(messageObj.Items.FirstOrDefault()?.Territory?.Guid,
                            originalMessageObj.Items.FirstOrDefault()?.Territory?.Guid);
            Assert.AreEqual(messageObj.Items.LastOrDefault()?.TypeDocument?.Guid,
                            originalMessageObj.Items.LastOrDefault()?.TypeDocument?.Guid);
        }
コード例 #7
0
        public void TestToMsrFromReestrMspFiasItemsResponseDeserializeMethod()
        {
            var xmlCurrentDoc = new XmlDocument();

            xmlCurrentDoc.Load($"{Context.XMLMessagePath}{ToMsrFromReestrMspFiasItemsResponse.NameForESB}.xml");

            var messageObj =
                SerializationTools.DeserialiseDataContract <ToMsrFromReestrMspFiasItemsResponse>(xmlCurrentDoc.OuterXml);
            var originalMessageObj = SynchronizationTestHelper.GetToMsrFromReestrMspFiasItemsMessage();

            Assert.AreEqual(messageObj.RequestInfo, originalMessageObj.RequestInfo);
            Assert.AreEqual(messageObj.Items.FirstOrDefault()?.FiasAddressObjects.AOGUID,
                            originalMessageObj.Items.FirstOrDefault()?.FiasAddressObjects.AOGUID);
            Assert.AreEqual(messageObj.Items.LastOrDefault()?.FiasHousesStructures.AOGUID,
                            originalMessageObj.Items.LastOrDefault()?.FiasHousesStructures.AOGUID);
        }
コード例 #8
0
        public void TestToReestrMspFromMsrDataChangesDeserializeMethod()
        {
            var xmlCurrentDoc = new XmlDocument();

            xmlCurrentDoc.Load($"{Context.XMLMessagePath}{ToReestrMspFromMsrDataChanges.NameForESB}.xml");

            var messageObj =
                SerializationTools.DeserialiseDataContract <ToReestrMspFromMsrDataChanges>(xmlCurrentDoc.OuterXml);
            var originalMessageObj = SynchronizationTestHelper.GetToReestrMspFromMsrDataChangesMessage();

            Assert.AreEqual(messageObj.RequestInfo, originalMessageObj.RequestInfo);
            Assert.AreEqual(messageObj.Items.FirstOrDefault()?.Beneficiary.Registration.Guid,
                            originalMessageObj.Items.FirstOrDefault()?.Beneficiary.Registration.Guid);
            Assert.AreEqual(messageObj.Items.FirstOrDefault()?.Beneficiary.Location.Street.Territory.FIAS,
                            originalMessageObj.Items.FirstOrDefault()?.Beneficiary.Location.Street.Territory.FIAS);
        }
コード例 #9
0
        public void TestToMsrFromReestrMspCatalogDataDeserializeMethod()
        {
            var xmlCurrentDoc = new XmlDocument();

            xmlCurrentDoc.Load($"{Context.XMLMessagePath}{ToMsrFromReestrMspCatalogDataChanges.NameForESB}.xml");

            var messageObj =
                SerializationTools
                .DeserialiseDataContract <ToMsrFromReestrMspCatalogDataChanges>(xmlCurrentDoc.OuterXml);
            var originalMessageObj = SynchronizationTestHelper.GetToMsrFromReestrMspCatalogDataMessage();

            Assert.AreEqual(messageObj.RequestInfo, originalMessageObj.RequestInfo);
            Assert.AreEqual(messageObj.Items.FirstOrDefault()?.Classifier.Guid,
                            originalMessageObj.Items.FirstOrDefault()?.Classifier.Guid);
            Assert.AreEqual(messageObj.Items.FirstOrDefault()?.Classifier.Category.Name,
                            originalMessageObj.Items.FirstOrDefault()?.Classifier.Category.Name);
        }
コード例 #10
0
        public void TestToMsrFromReestrMspMergedItemsResponseDeserializeMethod()
        {
            var xmlCurrentDoc = new XmlDocument();

            xmlCurrentDoc.Load($"{Context.XMLMessagePath}{ToMsrFromReestrMspMergedItemsResponse.NameForESB}.xml");

            var messageObj =
                SerializationTools.DeserialiseDataContract <ToMsrFromReestrMspMergedItemsResponse>(
                    xmlCurrentDoc.OuterXml);
            var originalMessageObj = SynchronizationTestHelper.GetToMsrFromReestrMspMergeItemsMessage();

            Assert.AreEqual(messageObj.RequestInfo, originalMessageObj.RequestInfo);
            Assert.AreEqual(messageObj.Items.FirstOrDefault()?.Beneficiary?.Guid,
                            originalMessageObj.Items.FirstOrDefault()?.Beneficiary?.Guid);
            Assert.AreEqual(messageObj.Items.FirstOrDefault()?.Sources.FirstOrDefault()?.Key,
                            originalMessageObj.Items.FirstOrDefault()?.Sources.FirstOrDefault()?.Key);
        }
コード例 #11
0
        /// <summary>
        ///     Обработать сообщение.
        /// </summary>
        /// <param name="logItem">Сообщение из журнала синхронизации.</param>
        public void HandleDataChangeMessage <TMessage, TItem>(SyncLogItem logItem)
            where TMessage : IDataChangeMessageResponse <TItem>
            where TItem : IChangedItem
        {
            if (!string.IsNullOrEmpty(logItem.DataSet))
            {
                var doc = new XmlDocument();
                doc.LoadXml(logItem.DataSet);

                var xmlClassName = Settings.GetMessageClassTypeName(logItem.Description);
                if (!string.IsNullOrEmpty(xmlClassName))
                {
                    // Получаем тип по названию класса из конфиг файла.
                    var messageType = Type.GetType(xmlClassName);
                    if (messageType != null)
                    {
                        TMessage response;
                        try
                        {
                            response =
                                SerializationTools.DeserialiseDataContract <TMessage>(logItem.DataSet);
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(
                                      $"Ошибка десерилизации объекта SyncLogItem.Pk = {logItem.__PrimaryKey}, тип ToMsrFromTUResponse.", ex);
                        }

                        if (response?.Items == null)
                        {
                            LogService.LogWarnFormat(
                                "В сообщениии SyncLogItem.Pk = {0}, отсутствуют объекты для обработки.",
                                logItem.__PrimaryKey);
                            return;
                        }

                        var arrToUpdate   = new List <DataObject>();
                        var arrConformity = new Dictionary <string, List <DataObject> >
                        {
                            { sObjectType, new List <DataObject>() },
                            { sSource, new List <DataObject>() },
                            { sConformity, new List <DataObject>() }
                        };

                        Source source = null;
                        try
                        {
                            source = _syncDS.Query <Source>(Source.Views.SourceE)
                                     .FirstOrDefault(x => x.name == logItem.DataSource);
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(
                                      $"Произошла ошибка при вычитке источника из БД Source.Name = '{logItem.DataSource}'.", ex);
                        }

                        if (source == null)
                        {
                            source = new Source {
                                name = logItem.DataSource
                            };
                            arrConformity[sSource].Add(source);
                        }

                        foreach (var item in response.Items)
                        {
                            var obj = GetXMLDataObjInChangedItem(item);
                            //Получаем настройки для обработки типа сообщения.
                            GetSyncSettings(obj, out var destType, out var mapper);
                            ProcessObject(obj, item.State, destType, mapper,
                                          item.СhangedAttributes?.Select(x => x.Name).ToList(), source, ref arrToUpdate,
                                          ref arrConformity);
                        }

                        var listSync = new List <DataObject>();
                        listSync.AddRange(arrConformity[sObjectType]);
                        listSync.AddRange(arrConformity[sSource]);
                        var objectsDef  = arrToUpdate.ToArray();
                        var objectsSync = listSync.ToArray();

                        try
                        {
                            _defDS.UpdateObjectsOrdered(ref objectsDef);

                            _syncDS.UpdateObjects(ref objectsSync);
                            objectsSync = arrConformity[sConformity].ToArray();
                            _syncDS.UpdateObjects(ref objectsSync);
                        }
                        catch (Exception ex)
                        {
                            throw new Exception($"Произошла ошибка при сохранении объектов в БД. {ex.InnerException?.Message ?? ex.Message}");
                        }
                    }
                    else
                    {
                        var errorMessage = $" Не найден XML-класс типа сообщения с названием {xmlClassName}";
                        throw new InvalidOperationException(errorMessage);
                    }
                }
                else
                {
                    var errorMessage =
                        $"Незаполнен тип xml-класса, для сообщения {logItem.Description}. Проверьте настройки секции messageHandlers в конфигурационном файле.";
                    throw new Exception(errorMessage);
                }
            }
        }
コード例 #12
0
        /// <summary>
        ///     Принять сообщение из шины.
        /// </summary>
        /// <param name="message">Сообщение.</param>
        public void AcceptMessage([MessageParameter(Name = "msg")] MessageFromESB message)
        {
            LogService.LogInfo($"BusListenerService: Принял соообщение - {message.MessageTypeID}!");

            // Ищем в конфиг файле, привязку между типов сообщения и xml-классом этого сообщения.
            var xmlClassName = Context.GetMessageXMLClassNameByMessageID(message.MessageTypeID);

            if (!string.IsNullOrEmpty(xmlClassName))
            {
                // Получаем тип по названию класса из конфиг файла.
                var messageType = Type.GetType(xmlClassName);
                if (messageType != null)
                {
                    try
                    {
                        ICommonMessage messageObj = null;
                        if (!string.IsNullOrEmpty(message.Body))
                        {
                            // Проверка валидация по XSD-схеме полученного xml.
                            if (Context.EnableXSDValidation)
                            {
                                var pathToXSD = Path.Combine(HttpRuntime.AppDomainAppPath,
                                                             $"{Context.XSDSchemasPath}{message.MessageTypeID}.xsd");
                                if (File.Exists(pathToXSD))
                                {
                                    XMLTools.CheckXMLFromStringtoXSD(message.Body, pathToXSD);
                                }
                                else
                                {
                                    LogService.LogWarn(
                                        $"BusListenerService: При получении сообщения включена проверка валидности сообщения XSD-схеме, но XSD-схема для сообщения типа {message.MessageTypeID} не найдена!{Environment.NewLine} Путь для ожидаемой XSD-схемы - {pathToXSD}");
                                }
                            }

                            // Десериализуем сообщение для его сохранения.
                            messageObj =
                                SerializationTools.DeserialiseDataContract(messageType, message.Body) as ICommonMessage;
                        }

                        if (messageObj != null)
                        {
                            // Сохранение сообщения в SyncLogItem.
                            messageObj.Save(message.SenderName, message.Body, true);
                        }
                        else
                        {
                            LogService.LogWarn(
                                $"BusListenerService: Получено пустое сообщение типа {message.MessageTypeID}. Сообщение не будет сохранено в БД!");
                        }
                    }
                    catch (XmlSchemaValidationException ex)
                    {
                        LogService.LogError(
                            $"{MessageErrorHeader} Не пройдена валидация XSD-схемы для сообщения типа {message.MessageTypeID}",
                            ex);
                        throw;
                    }
                    catch (Exception ex)
                    {
                        LogService.LogError($"{MessageErrorHeader}", ex);
                        throw;
                    }
                }
                else
                {
                    var errorMessage =
                        $"{MessageErrorHeader} Не найден XML-класс типа сообщения с названием {xmlClassName}";
                    LogService.LogError(errorMessage);
                    throw new InvalidOperationException(errorMessage);
                }
            }
            else
            {
                var errorMessage =
                    $"{MessageErrorHeader} Неизвестный тип сообщения - {message.MessageTypeID}. Проверьте настройки секции {Context.CustomSBListenerConfigSectionName} в конфигурационном файле.";
                LogService.LogError(errorMessage);
                throw new UnknowMessageTypeException(errorMessage);
            }
        }