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 }); }
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); }
/// <summary> /// Формирует запрос для дальнейшей обработки: главную и второстепенную службу, HandlingMode /// Процесс описан в документации /// </summary> /// <param name="req"></param> /// <returns></returns> public virtual RuleHandlerSettings Create(GetRuleSettingsRequest req) { //MenologyRule - не может быть null if (req.MenologyRule == null) { throw new NullReferenceException("MenologyRule"); } //находим день Октоиха - не может быть null if (req.OktoikhDay == null) { throw new NullReferenceException("OktoikhDay"); } //находим TriodionRule //TriodionRule triodionRule = req.Typicon.GetTriodionRule(req.Date); //находим ModifiedRule с максимальным приоритетом //ModifiedRule modifiedRule = _modifiedRuleService.GetModifiedRuleHighestPriority(req.Typicon, req.Date); //создаем выходной объект RuleHandlerSettings settings = null; //Номер Знака службы, указанный в ModifiedRule, который будет использовать в отображении Расписания int?signNumber = null; if (req.ModifiedRule != null) { //custom SignNumber signNumber = req.ModifiedRule.SignNumber; if (req.ModifiedRule.IsAddition == true) { //создаем первый объект, который в дальнейшем станет ссылкой Addition у выбранного правила settings = InnerCreate(req.ModifiedRule.RuleEntity, req.ModifiedRule.RuleEntity.DayWorships, req.OktoikhDay, req, null); //обнуляем его, чтобы больше не участвовал в формировании req.ModifiedRule = null; } } //получаем главное Правило и коллекцию богослужебных текстов (DayRule Rule, IEnumerable <DayWorship> Worships) = CalculatePriorities(req.ModifiedRule, req.MenologyRule, req.TriodionRule); //смотрим, не созданы ли уже настройки if (settings != null) { //созданы - значит был определен элемент для добавления settings.DayWorships.AddRange(Worships); } TypiconRule seniorRule = Rule; //смотрим, главным ставить само Правило или Знак службы /* * Если Правило имеет: * пустое RuleDefinition * //и Правило помечено как Дополнение * и определен Шаблон */ if ( string.IsNullOrEmpty(Rule.RuleDefinition) && Rule.IsAddition && Rule.Template != null ) { seniorRule = seniorRule.Template; } RuleHandlerSettings outputSettings = GetRecursiveSettings(seniorRule, Worships, req.OktoikhDay, req, settings, signNumber); return(outputSettings); }