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); }
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); }
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); }
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)); }
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); } }
/// <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); }
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); }
/// <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); }
public override DayElementBase Calculate(RuleHandlerSettings settings) { YmnosStructure result = null; if (base.Calculate(settings) is Kontakion kontakion) { result = kontakion.ToYmnosStructure(ShowIkos); } return(result); }
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; }
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); } } }
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 }); }
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; } } } }
/// <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); }
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)); }
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); } }
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()); }
public override DayElementBase Calculate(RuleHandlerSettings settings) => GetStructure(settings);