Example #1
0
        public override DayElementBase Calculate(RuleHandlerSettings settings)
        {
            YmnosStructure result = null;

            Kanonas kanonas = GetKanonas(settings);

            if (kanonas != null)
            {
                switch (Place)
                {
                case KanonasPlaceKind.sedalen:
                    if (kanonas.Sedalen != null)
                    {
                        result = new YmnosStructure();
                        result.Groups.AddRange(kanonas.Sedalen.Groups);
                    }
                    break;

                case KanonasPlaceKind.kontakion:
                    if (kanonas.Kontakion != null)
                    {
                        result = kanonas.Kontakion.ToYmnosStructure();
                    }
                    break;
                }
            }

            return(result);
        }
Example #2
0
        public override DayElementBase Calculate(RuleHandlerSettings settings)
        {
            YmnosStructure result = null;

            if (!IsValid)
            {
                return(null);
            }

            if (Source == YmnosSource.Irmologion)
            {
                int calcIhos = (ReferenceYmnos.Calculate(settings) as YmnosStructure).Ihos;

                GetTheotokionResponse response = theotokionApp.Get(
                    new GetTheotokionRequest()
                {
                    Place = Place.Value, Ihos = calcIhos, DayOfWeek = settings.Date.DayOfWeek
                });

                if (response.Exception == null && response.BookElement != null)
                {
                    result = new YmnosStructure();
                    result.Theotokion.Add(response.BookElement);
                }
            }
            else
            {
                result = base.Calculate(settings) as YmnosStructure;
            }

            return(result);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="own">Свои сгенерированные настройки</param>
        /// <param name="external">Внешние от <see cref="_innerCalculator"/></param>
        /// <param name="oktoikhMode">Если true - День Октоиха назначается для external, иначе для own</param>
        /// <returns>Самый последний Addition у <see cref="own"/></returns>
        protected RuleHandlerSettings FillWorships(RuleHandlerSettings own, RuleHandlerSettings external, bool oktoikhMode)
        {
            external.Menologies.AddRange(own.Menologies);
            external.Triodions.AddRange(own.Triodions);

            //external.Menologies.InsertRange(0, own.Menologies);
            //external.Triodions.InsertRange(0, own.Triodions);

            if (oktoikhMode)
            {
                external.OktoikhDay = own.OktoikhDay;
            }
            else
            {
                own.OktoikhDay = external.OktoikhDay;
            }

            var lastAddition = external;

            if (external.Addition != null)
            {
                lastAddition = FillWorships(own, external.Addition, oktoikhMode);
            }

            return(lastAddition);
        }
        public YmnosStructure GetStructure(RuleHandlerSettings settings)
        {
            if (!IsValid)
            {
                return(null);
            }

            YmnosStructure result = new YmnosStructure();

            switch (Kind)
            {
            case YmnosRuleKind.Ymnos:
                result.Groups.Add(Element);
                break;

            case YmnosRuleKind.Doxastichon:
                result.Doxastichon = Element;
                break;

            case YmnosRuleKind.Theotokion:
                result.Theotokion.Add(Element);
                break;
            }

            return(result);
        }
Example #5
0
        private Kanonas GetFromSource(RuleHandlerSettings settings)
        {
            Kanonas result = null;
            Kanonas source = GetKanonas(settings);

            if (source != null)
            {
                result = new Kanonas()
                {
                    Acrostic   = source.Acrostic,
                    Annotation = source.Annotation,
                    Ihos       = source.Ihos,
                    Stihos     = source.Stihos
                };

                foreach (Odi odi in source.Odes)
                {
                    Odi o = new Odi()
                    {
                        Number = odi.Number
                    };

                    //добавляем катавасию(и)
                    o.Troparia.AddRange(odi.Troparia.FindAll(c => c.Kind == YmnosKind.Katavasia));
                    //добавляем саму песнь
                    result.Odes.Add(o);
                }
            }

            return(result);
        }
Example #6
0
        private Result <RuleHandlerSettings> InnerCreate(CreateRuleSettingsRequest req, RootContainer container)
        {
            var settings = new RuleHandlerSettings()
            {
                Addition         = req.AdditionalSettings,
                TypiconVersionId = req.TypiconVersionId,
                Date             = req.Date,
                RuleContainer    = container,
                PrintDayTemplate = req.PrintDayTemplate,
                ApplyParameters  = req.ApplyParameters,
                CheckParameters  = req.CheckParameters,
                OktoikhDay       = req.OktoikhDay,
            };

            if (req.Menologies != null)
            {
                settings.Menologies = req.Menologies.ToList();
            }

            if (req.Triodions != null)
            {
                settings.Triodions = req.Triodions.ToList();
            }

            return(Result.Ok(settings));
        }
Example #7
0
        public override DayElementBase Calculate(RuleHandlerSettings settings)
        {
            Kontakion result = null;

            if (!ThrowExceptionIfInvalid(settings))
            {
                //разбираемся с source
                DayContainer day = GetDayContainer(settings);

                var kontakia = day?.Orthros?.Kontakia;

                //не выдаем ошибки, если день не найден
                if (kontakia != null)
                {
                    //теперь разбираемся с place
                    switch (Place)
                    {
                    case KontakionPlace.orthros1:
                    {
                        result = (kontakia.Count > 0) ? kontakia[0] : null;
                    }
                    break;

                    case KontakionPlace.orthros2:
                    {
                        result = (kontakia.Count > 1) ? kontakia[1] : null;
                    }
                    break;
                    }
                }
            }

            return(result);
        }
        protected Kanonas GetKanonas(RuleHandlerSettings settings)
        {
            Kanonas result = null;

            //разбираемся с source
            DayStructureBase dayWorship = null;

            switch (Source)
            {
            case KanonasSource.Item1:
                dayWorship = (settings.DayWorships.Count > 0) ? settings.DayWorships[0] : null;
                break;

            case KanonasSource.Item2:
                dayWorship = (settings.DayWorships.Count > 1) ? settings.DayWorships[1] : null;
                break;

            case KanonasSource.Item3:
                dayWorship = (settings.DayWorships.Count > 2) ? settings.DayWorships[2] : null;
                break;

            case KanonasSource.Oktoikh:
                dayWorship = settings.OktoikhDay;
                break;
            }

            if (dayWorship != null)
            {
                switch (Kanonas)
                {
                case KanonasKind.Apodipno:
                    //TODO: добавить реализацию
                    break;

                case KanonasKind.Mesoniktiko:
                    //TODO: добавить реализацию
                    break;

                case KanonasKind.Orthros1:
                    result = GetOrthrosKanonas(dayWorship, 0);
                    break;

                case KanonasKind.Orthros2:
                    result = GetOrthrosKanonas(dayWorship, 1);
                    break;

                case KanonasKind.Orthros3:
                    result = GetOrthrosKanonas(dayWorship, 2);
                    break;
                }
            }

            return(result);

            Kanonas GetOrthrosKanonas(DayStructureBase day, int index)
            {
                return((day.GetElement().Orthros?.Kanones?.Count > index) ? day.GetElement().Orthros.Kanones[index] : null);
            }
        }
Example #9
0
        /// <summary>
        /// Переопределяет правило для исполнения
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public override RuleHandlerSettings Create(GetRuleSettingsRequest request)
        {
            RuleHandlerSettings result = base.Create(request);

            result.Rule.RuleDefinition = CustomRule;

            return(result);
        }
Example #10
0
        public override DayElementBase Calculate(RuleHandlerSettings settings)
        {
            YmnosStructure result = null;

            Kanonas kanonas = GetKanonas(settings);

            if (kanonas != null)
            {
                switch (Place)
                {
                case KanonasPlaceKind.sedalen:
                    if (kanonas.Sedalen?.Groups?.Count > 0 &&
                        kanonas.Sedalen?.Groups[0]?.Ymnis?.Count > 0)
                    {
                        result = new YmnosStructure();
                        YmnosGroup th = new YmnosGroup()
                        {
                            Annotation = new ItemText(kanonas.Sedalen.Groups[0].Annotation),
                            Ihos       = kanonas.Sedalen.Groups[0].Ihos,
                            Prosomoion = new Prosomoion(kanonas.Sedalen.Groups[0].Prosomoion)
                        };
                        th.Ymnis.Add(new Ymnos(kanonas.Sedalen.Groups[0].Ymnis[0]));
                        result.Theotokion.Add(th);
                    }
                    break;

                case KanonasPlaceKind.sedalen_theotokion:
                    if (kanonas.Sedalen?.Theotokion != null)
                    {
                        result = new YmnosStructure()
                        {
                            Theotokion = kanonas.Sedalen.Theotokion
                        };
                    }
                    break;

                case KanonasPlaceKind.sedalen_stavrostheotokion:
                    if (kanonas?.Sedalen?.Theotokion != null &&
                        kanonas.Sedalen.Theotokion.Exists(c => c.Kind == YmnosGroupKind.Stavros))
                    {
                        //Оставляем только крестобородичен
                        result = new YmnosStructure()
                        {
                            Theotokion = kanonas.Sedalen.Theotokion
                        };
                        result.Theotokion.RemoveAll(c => c.Kind == YmnosGroupKind.Undefined);
                    }
                    break;

                default:
                    result = base.Calculate(settings) as YmnosStructure;
                    break;
                }
            }

            return(result);
        }
        public string Compose(RuleHandlerSettings settings, DateTime date)
        {
            //находим самое последнее правило - добавление
            while (settings.Addition != null)
            {
                settings = settings.Addition;
            }

            if (settings.DayWorships == null || settings.DayWorships.Count() == 0)
            {
                return(string.Empty);
            }

            string result = "";

            DayWorship seniorService = settings.DayWorships[0];

            //собираем все имена текстов, кроме главного
            if (settings.DayWorships.Count > 1)
            {
                for (int i = 1; i < settings.DayWorships.Count; i++)
                {
                    result += settings.DayWorships[i].WorshipName[settings.Language.Name] + " ";
                }
            }

            //а теперь разбираемся с главным

            string s = seniorService.WorshipName[settings.Language.Name];

            if (date.DayOfWeek != DayOfWeek.Sunday ||
                (date.DayOfWeek == DayOfWeek.Sunday &&
                 (seniorService.UseFullName || seniorService.WorshipShortName.IsEmpty)))
            {
                result = $"{s} {result}";
            }

            int priority = (settings.Rule is Sign sign) ? sign.Priority : settings.Rule.Template.Priority;

            if (/*(settings.Rule is MenologyRule)
                 * && */(date.DayOfWeek == DayOfWeek.Sunday) &&
                (priority > 1))
            {
                //Если Триоди нет и воскресенье, находим название Недели из Октоиха
                //и добавляем название Недели в начало Name

                //Если имеется короткое название, то добавляем только его

                result = oktoikhContext.GetSundayName(date, settings.Language.Name,
                                                      GetShortName(settings.DayWorships, settings.Language.Name)) + " " + result;

                //жестко задаем воскресный день
                //handlerRequest.Rule = inputRequest.TypiconEntity.Settings.TemplateSunday;
            }

            return(result);
        }
Example #12
0
        /// <summary>
        /// Возвращает указанные в правиле богослужебные тексты.
        /// </summary>
        /// <param name="settings"></param>
        /// <returns>Если таковые не объявлены в DayWorship, возвращает NULL.</returns>
        public YmnosStructure GetStructure(RuleHandlerSettings settings)
        {
            YmnosStructure result = null;

            if (!ThrowExceptionIfInvalid(settings))
            {
                //разбираемся с source
                DayContainer day = GetDayContainer(settings);

                //не выдаем ошибки, если день не найден
                if (day != null)
                {
                    //теперь разбираемся с place И kind
                    switch (Kind)
                    {
                    case YmnosRuleKind.Ymnos:
                    {
                        var groups = day.GetYmnosGroups(Place, Count, StartFrom);
                        if (groups != null)
                        {
                            result = new YmnosStructure();
                            result.Groups.AddRange(groups);
                        }
                    }
                    break;

                    case YmnosRuleKind.Doxastichon:
                    {
                        var groups = day.GetYmnosGroups(Place, 1, StartFrom);
                        if (groups?.Count > 0)
                        {
                            result = new YmnosStructure {
                                Doxastichon = groups[0]
                            };
                        }
                    }
                    break;

                    case YmnosRuleKind.Theotokion:
                    {
                        var groups = day.GetYmnosGroups(Place, 1, StartFrom);
                        if (groups?.Count > 0)
                        {
                            result = new YmnosStructure();
                            result.Theotokion.AddRange(groups);
                        }
                    }
                    break;
                    }
                }
            }

            return(result);
        }
Example #13
0
        public override DayElementBase Calculate(RuleHandlerSettings settings)
        {
            YmnosStructure result = null;

            if (base.Calculate(settings) is Kontakion kontakion)
            {
                result = kontakion.ToYmnosStructure(ShowIkos);
            }

            return(result);
        }
Example #14
0
        private Sign GetRootAdditionSign(RuleHandlerSettings settings)
        {
            if (settings.Addition == null)
            {
                var sign = (settings.Rule is Sign s) ? s : settings.Rule.Template;

                return(sign?.GetPredefinedTemplate());
            }

            return(GetRootAdditionSign(settings.Addition));
        }
        public override DayElementBase Calculate(RuleHandlerSettings settings)
        {
            Kanonas result = null;
            Kanonas source = GetKanonas(settings);

            if (source != null)
            {
                result = new Kanonas()
                {
                    Acrostic   = source.Acrostic,
                    Annotation = source.Annotation,
                    Ihos       = source.Ihos,
                    Stihos     = source.Stihos
                };

                foreach (Odi odi in source.Odes)
                {
                    Odi o = new Odi()
                    {
                        Number = odi.Number
                    };

                    //добавляем ирмос(ы)
                    Ymnos irmos = odi.Troparia.Find(c => c.Kind == YmnosKind.Irmos);

                    int troparia = IrmosCount;
                    while (troparia > 0)
                    {
                        o.Troparia.Add(irmos);
                        troparia--;
                    }

                    //добавляем тропари
                    o.Troparia.AddRange(GetYmnis(odi));

                    //if (IncludeKatavasia
                    //     && (odi.Number == 3 || odi.Number == 6 || odi.Number == 8 || odi.Number == 9))
                    //{
                    //    //добавляем ирмос в качестве катавасии
                    //    Ymnos katavasia = new Ymnos(irmos)
                    //    {
                    //        Kind = YmnosKind.Katavasia
                    //    };
                    //    o.Troparia.Add(katavasia);
                    //}

                    //добавляем саму песнь
                    result.Odes.Add(o);
                }
            }

            return(result);
        }
        public ModificationsRuleHandler(RuleHandlerSettings settings, int year)
        {
            _settings = settings;
            //Initialize(settings);

            AuthorizedTypes = new List <Type>()
            {
                typeof(ModifyDay)
            };

            _yearToModify = year;
        }
Example #17
0
        public DayElementBase Calculate(RuleHandlerSettings settings)
        {
            var psalm = QueryProcessor.Process(new PsalmQuery(Number));

            BookReading psalmReading = null;

            if (psalm?.Reading != null)
            {
                psalmReading = GetPsalm(psalm.Reading);
            }

            return(psalmReading);
        }
        /// <summary>
        /// Выкидывает исключение, если настройки обработчика позволяют это
        /// </summary>
        /// <param name="handler"></param>
        /// <returns>Возвращает true, если элемент неверно заполнен</returns>
        public bool ThrowExceptionIfInvalid(RuleHandlerSettings settings)
        {
            if (!IsValid)
            {
                //if (settings.ThrowExceptionIfInvalid)
                //{
                //    ThrowExceptionIfInvalid();
                //}
                return(true);
            }

            return(false);
        }
        private void CalculateStructure(RuleHandlerSettings settings, IReadOnlyList <TChildElement> container)
        {
            Structure = new TStructure();

            foreach (var element in container)
            {
                TStructure elemStructure = element.GetStructure(settings);

                if (elemStructure != null)
                {
                    Structure.Merge(elemStructure);
                }
            }
        }
Example #20
0
        public DayElementBase Calculate(RuleHandlerSettings settings)
        {
            var response = PsalterContext.Get(new GetPsalmRequest()
            {
                Number = Number
            });

            BookReading psalmReading = null;

            if (response.Psalm != null)
            {
                psalmReading = GetPsalm(response.Psalm);
            }
            return(psalmReading);
        }
 private RuleHandlerSettings InnerCreate(TypiconRule rule, IEnumerable <DayWorship> dayWorships, OktoikhDay oktoikhDay,
                                         GetRuleSettingsRequest req, RuleHandlerSettings additionalSettings, int?signNumber = null)
 {
     return(new RuleHandlerSettings()
     {
         Addition = additionalSettings,
         Date = req.Date,
         Rule = rule,
         DayWorships = dayWorships.ToList(),
         OktoikhDay = oktoikhDay,
         Language = LanguageSettingsFactory.Create(req.Language),
         SignNumber = signNumber,
         //ThrowExceptionIfInvalid = req.ThrowExceptionIfInvalid,
         ApplyParameters = req.ApplyParameters,
         CheckParameters = req.CheckParameters
     });
 }
Example #22
0
        public Exapostilarion GetStructure(RuleHandlerSettings settings)
        {
            Exapostilarion result = null;

            if (!ThrowExceptionIfInvalid(settings))
            {
                //разбираемся с source
                DayContainer day = GetDayContainer(settings);

                //не выдаем ошибки, если день не найден
                if (day != null)
                {
                    //теперь разбираемся с place И kind
                    switch (Kind)
                    {
                    case ExapostilarionItemKind.Exap:
                    {
                        List <ExapostilarionItem> ymnis = GetYmnis(day);
                        if (ymnis != null)
                        {
                            result = new Exapostilarion();
                            result.Ymnis.AddRange(ymnis);
                        }
                    }
                    break;

                    case ExapostilarionItemKind.Theotokion:
                    {
                        ExapostilarionItem ymnos = GetYmnos(day);
                        if (ymnos != null)
                        {
                            result = new Exapostilarion
                            {
                                Theotokion = ymnos
                            };
                        }
                    }
                    break;
                    }
                }
            }

            return(result);
        }
        private RuleHandlerSettings GetRecursiveSettings(TypiconRule rule, IEnumerable <DayWorship> dayWorships, OktoikhDay oktoikhDay,
                                                         GetRuleSettingsRequest req, RuleHandlerSettings additionalSettings, int?signNumber = null)
        {
            RuleHandlerSettings outputSettings = InnerCreate(rule, dayWorships, oktoikhDay, req, additionalSettings, signNumber);

            /*
             * Если Правило имеет:
             *      Правило помечено как Дополнение
             *      и определен Шаблон
             */

            if (/*string.IsNullOrEmpty(rule.RuleDefinition) && */ rule.IsAddition && rule.Template != null)
            {
                //если правило определено и определено как добавление, входим в рекурсию
                outputSettings = GetRecursiveSettings(rule.Template, dayWorships, oktoikhDay, req, outputSettings);
            }

            return(outputSettings);
        }
        public DayElementBase CalculateEveryDayKatavasia(RuleHandlerSettings settings)
        {
            Kanonas result = null;
            Kanonas source = GetKanonas(settings);

            if (source != null)
            {
                result = new Kanonas()
                {
                    Acrostic   = source.Acrostic,
                    Annotation = source.Annotation,
                    Ihos       = source.Ihos,
                    Stihos     = source.Stihos
                };

                foreach (Odi odi in source.Odes)
                {
                    Odi o = new Odi()
                    {
                        Number = odi.Number
                    };

                    //ирмос
                    Ymnos irmos = odi.Troparia.Find(c => c.Kind == YmnosKind.Irmos);

                    if ((odi.Number == 3 || odi.Number == 6 || odi.Number == 8 || odi.Number == 9))
                    {
                        //добавляем ирмос в качестве катавасии
                        Ymnos katavasia = new Ymnos(irmos)
                        {
                            Kind = YmnosKind.Katavasia
                        };
                        o.Troparia.Add(katavasia);
                    }

                    //добавляем саму песнь
                    result.Odes.Add(o);
                }
            }

            return(result);
        }
        private void CalculateYmnosStructure(RuleHandlerSettings settings, ExecContainer container)
        {
            Structure = new YmnosStructure();
            foreach (ICalcStructureElement element in container.ChildElements)
            {
                if (element.Calculate(settings) is YmnosStructure s)
                {
                    switch (element)
                    {
                    case YmnosRule r:
                        AsYmnosRule(r, s);
                        break;

                    case KSedalenRule r:
                        AsKanonasSedalenRule(r, s);
                        break;
                    }
                }
            }
        }
Example #26
0
        /// <summary>
        /// Возвращает все дочерние элементы согласно введенного generic типа
        /// </summary>
        /// <typeparam name="T">Тип элемента правил для поиска</typeparam>
        /// <param name="predicate">Дополнительные условия для поиска</param>
        /// <returns></returns>
        public IReadOnlyList <T> GetChildElements <T>(RuleHandlerSettings settings, Func <T, bool> predicate = null) //where T : RuleExecutable, ICustomInterpreted
        {
            //используем специальный обработчик
            //чтобы найти все дочерние элементы по искомым признакам
            var childrenHandler = new CollectorRuleHandler <T>()
            {
                Settings = settings
            };

            //Interpret(childrenHandler);

            foreach (RuleElementBase elem in ChildElements)
            {
                elem.Interpret(childrenHandler);
            }

            var result = childrenHandler.GetResult();

            return((predicate != null) ? result.Where(predicate).ToList() : result);
        }
Example #27
0
        protected DayContainer GetDayContainer(RuleHandlerSettings settings)
        {
            //разбираемся с source
            DayStructureBase dayContainer = null;

            switch (Source)
            {
            case YmnosSource.Menology1:
                dayContainer = (settings.Menologies.Count > 0) ? settings.Menologies[0] : null;
                break;

            case YmnosSource.Menology2:
                dayContainer = (settings.Menologies.Count > 1) ? settings.Menologies[1] : null;
                break;

            case YmnosSource.Menology3:
                dayContainer = (settings.Menologies.Count > 2) ? settings.Menologies[2] : null;
                break;

            case YmnosSource.Triodion1:
                dayContainer = (settings.Triodions.Count > 0) ? settings.Triodions[0] : null;
                break;

            case YmnosSource.Oktoikh:
                dayContainer = settings.OktoikhDay;
                break;

            case YmnosSource.WeekDay:
            {
                dayContainer = queryProcessor.Process(new WeekDayAppQuery(settings.Date.DayOfWeek));
            }
            break;
            }

            //if (dayContainer == null)
            //{
            //    throw new KeyNotFoundException("YmnosStructureRule source not found: " + Source.ToString());
            //}

            return(dayContainer?.GetElement(serializer));
        }
Example #28
0
        public static void Calculate(this List <Kanonas> kanonesCalc, RuleHandlerSettings handlerSettings, IReadOnlyList <KKanonasItemRule> kanones,
                                     IReadOnlyList <KKatavasiaRule> katavasiaColection, bool isOrthros)
        {
            if (kanonesCalc == null)
            {
                kanonesCalc = new List <Kanonas>();
            }
            else
            {
                kanonesCalc.Clear();
            }

            var katavasia = katavasiaColection.FirstOrDefault();

            for (int i = 0; i < kanones.Count; i++)
            {
                KKanonasItemRule item = kanones[i] as KKanonasItemRule;

                if (item.Calculate(handlerSettings) is Kanonas k)
                {
                    kanonesCalc.Add(k);
                }

                //это правило для канона Утрени, определение катавасии отсутствует и канон последний
                if (isOrthros && katavasia == null && i == kanones.Count - 1)
                {
                    //добавляем еще один канон, который будет состоять ТОЛЬКО из катавасий после 3, 6, 8, 9-х песен
                    if (item.CalculateEveryDayKatavasia(handlerSettings) is Kanonas k1)
                    {
                        kanonesCalc.Add(k1);
                    }
                }
            }

            if (katavasia != null)
            {
                kanonesCalc.Add(katavasia.Calculate(handlerSettings) as Kanonas);
            }
        }
Example #29
0
        public void LessDate()
        {
            string xml = TestDataXmlReader.GetXmlString("LessDateTest.xml");

            var settings = new RuleHandlerSettings()
            {
                Date = new DateTime(2017, 02, 08)
            };

            var handler = new IsAdditionTestHandler()
            {
                Settings = settings
            };

            var ruleContainer = TestRuleSerializer.Deserialize <RootContainer>(xml);

            ruleContainer.Interpret(handler);

            var result = handler.GetResult();

            Assert.AreEqual(1, result.Count());
        }
Example #30
0
 public override DayElementBase Calculate(RuleHandlerSettings settings) => GetStructure(settings);