Beispiel #1
0
 private PsalmLink CreatePsalmLink(PsalmLink psalmLink)
 {
     return(new PsalmLink()
     {
         Psalm = psalmLink.Psalm
     });
 }
Beispiel #2
0
        private void ImportKathismas(TypiconVersion version, List <KathismaProjection> kathismas)
        {
            kathismas.ForEach(c =>
            {
                var kathisma = new Kathisma()
                {
                    Number         = c.Number,
                    NumberName     = new ItemText(c.NumberName),
                    TypiconVersion = version
                };

                c.SlavaElements.ForEach(s =>
                {
                    var slavaElement = new SlavaElement();

                    s.PsalmLinks.ForEach(p =>
                    {
                        var psalmLink = new PsalmLink()
                        {
                            PsalmId     = p.PsalmId,
                            StartStihos = p.StartStihos,
                            EndStihos   = p.EndStihos
                        };
                        slavaElement.PsalmLinks.Add(psalmLink);
                    });

                    kathisma.SlavaElements.Add(slavaElement);
                });

                version.Kathismas.Add(kathisma);
            });
        }
Beispiel #3
0
        public static void AppendPsalmLink(this Kathisma kathisma, PsalmLink psalmLink)
        {
            var lastSlava = kathisma.SlavaElements.LastOrDefault();

            if (lastSlava == null)
            {
                lastSlava = new SlavaElement();
                kathisma.SlavaElements.Add(lastSlava);
            }
            lastSlava.PsalmLinks.Add(psalmLink);
        }
Beispiel #4
0
 public static void AppendStihos(this PsalmLink psalmLink, BookStihos stihos)
 {
     if (psalmLink.StartStihos == null)
     {
         psalmLink.StartStihos = stihos.StihosNumber;
         psalmLink.EndStihos   = stihos.StihosNumber;
     }
     else
     {
         psalmLink.EndStihos = stihos.StihosNumber;
     }
 }
Beispiel #5
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);
            }
        }
Beispiel #6
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;
                }
            }
        }
Beispiel #7
0
 /// <summary>
 /// Очищает ссылки на стихи - значит, что ссылаемся на Псалом полностью
 /// </summary>
 /// <param name="psalmLink"></param>
 private void ClearStihosIndexes(PsalmLink psalmLink)
 {
     psalmLink.StartStihos = null;
     psalmLink.EndStihos   = null;
 }
        /// <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);
            }
        }