Ejemplo n.º 1
0
        public static void AppendOrUpdatePsalmLink(this Kathisma kathisma, PsalmLink psalmLink)
        {
            var lastSlava = kathisma.SlavaElements.LastOrDefault();

            if (lastSlava == null)
            {
                lastSlava = kathisma.AppendNewSlava();
            }

            //ищем существующую PsalmLink
            var found = lastSlava.PsalmLinks.FirstOrDefault(c => c.Psalm.Number == psalmLink.Psalm.Number);

            if (found != null)
            {
                //обновляем
                found.StartStihos = psalmLink.StartStihos;
                found.EndStihos   = psalmLink.EndStihos;
            }
            else
            {
                //добавялем
                lastSlava.PsalmLinks.Add(psalmLink);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Осуществляет миграцию Кафизм на основании текстовых документов, а также существующих в БД псалмов
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="typiconEntity"></param>
        /// <exception cref="ResourceNotFoundException">В случае отсутствия Псалмов в БД</exception>
        public void MigrateKathismas(IPsalterReader reader, TypiconEntity typiconEntity)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("IPsalterReader in MigrateKathismas");
            }
            if (typiconEntity == null)
            {
                throw new ArgumentNullException("TypiconEntity in MigrateKathismas");
            }

            DeleteAllKathismas(typiconEntity);

            Kathisma  kathisma  = null;
            PsalmLink psalmLink = null;

            IPsalterElement currentElement = null;

            while (reader.Read())
            {
                switch (reader.ElementType)
                {
                case PsalterElementKind.Kathisma:
                    currentElement = reader.Element;
                    kathisma       = typiconEntity.AppendKathisma(reader.Element as Kathisma);
                    break;

                case PsalterElementKind.Psalm:
                    //если до этого читали Псалом, то добавляем его, очищая ссылки на стихи
                    if (currentElement is PsalmLink p)
                    {
                        ClearStihosIndexes(p);
                        kathisma?.AppendPsalmLink(p);
                    }
                    currentElement = reader.Element;
                    psalmLink      = CreatePsalmLink((reader.Element as Psalm).Number);
                    break;

                case PsalterElementKind.PsalmAnnotation:
                    //не нужна- ничего не делаем
                    break;

                case PsalterElementKind.PsalmText:
                    if (currentElement == null)
                    {
                        //значит пришли сюда после чтения "Славы"
                        //создаем новую ссылку на Псалом (17 кафизма)
                        psalmLink = CreatePsalmLink(psalmLink);
                    }
                    psalmLink?.AppendStihos(reader.Element as BookStihos);
                    currentElement = psalmLink;
                    break;

                case PsalterElementKind.Slava:
                    kathisma?.AppendNewSlava();
                    if (currentElement is PsalmLink pl)
                    {
                        kathisma?.AppendPsalmLink(pl);
                    }
                    currentElement = null;
                    break;
                }
            }
        }
        /// <summary>
        /// Осуществляет миграцию Кафизм на основании текстовых документов, а также существующих в БД псалмов
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="typiconEntity"></param>
        /// <param name="migrateOnlyKathismaName">Только лишь обновляет/добавляет имена у кафизм для заданного языка</param>
        /// <exception cref="ResourceNotFoundException">В случае отсутствия Псалмов в БД</exception>
        public void MigrateKathismas(IPsalterReader reader, TypiconVersion typiconEntity, bool migrateOnlyKathismaName = false)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("IPsalterReader in MigrateKathismas");
            }
            if (typiconEntity == null)
            {
                throw new ArgumentNullException("TypiconVersion in MigrateKathismas");
            }

            //Удаляем все кафизмы, если установлен флаг
            //if (clearBeforeMigration)
            //{
            //    DeleteAllKathismas(typiconEntity);
            //}

            Kathisma  kathisma  = null;
            PsalmLink psalmLink = null;

            IPsalterElement currentElement = null;

            while (reader.Read())
            {
                switch (reader.ElementType)
                {
                case PsalterElementKind.Kathisma:
                {
                    currentElement = reader.Element;
                    kathisma       = typiconEntity.AppendOrUpdateKathisma(reader.Element as Kathisma);
                    psalmLink      = null;
                }
                break;

                case PsalterElementKind.Psalm:
                {
                    if (!migrateOnlyKathismaName)
                    {
                        //если до этого читали Псалом, то добавляем его, очищая ссылки на стихи
                        if (psalmLink != null)
                        {
                            AppendAndClearPsalmLink(kathisma, psalmLink);
                        }
                        currentElement = reader.Element;
                        psalmLink      = CreatePsalmLink((reader.Element as Psalm).Number);
                    }
                }
                break;

                case PsalterElementKind.PsalmAnnotation:
                    //не нужна- ничего не делаем
                    break;

                case PsalterElementKind.PsalmText:
                {
                    if (!migrateOnlyKathismaName)
                    {
                        if (currentElement == null)
                        {
                            //значит пришли сюда после чтения "Славы"
                            //добавляем сформированную Ссылку
                            //и создаем новую ссылку на Псалом (17 кафизма)
                            if (psalmLink != null)
                            {
                                kathisma.AppendOrUpdatePsalmLink(psalmLink);
                            }
                            psalmLink = CreatePsalmLink(psalmLink);
                        }
                        psalmLink.AppendStihos(reader.Element as BookStihos);
                        currentElement = psalmLink;
                    }
                }
                break;

                case PsalterElementKind.Slava:
                {
                    if (!migrateOnlyKathismaName)
                    {
                        //Добавляем новую Славу
                        kathisma.AppendNewSlava();

                        //добавляем Ссылку
                        if (currentElement is PsalmLink p)
                        {
                            if (kathisma.SlavaElements.Count >= 3)
                            {
                                kathisma.AppendOrUpdatePsalmLink(p);
                            }
                        }

                        currentElement = null;
                    }
                }
                break;
                }
            }

            void AppendAndClearPsalmLink(Kathisma k, PsalmLink p)
            {
                //Пока убираем, потому как в текст Псалма будут входить и аннотации
                //ClearStihosIndexes(p);
                k.AppendOrUpdatePsalmLink(p);
            }
        }