public void RewriteValues(IAsAdditionElement source) { if (source is KAfterRule s) { OdiNumber = s.OdiNumber; } }
public void RewriteValues(IAsAdditionElement source) { if (source is KanonasRule s) { IsOrthros = s.IsOrthros; } }
public virtual IRuleElement Deserialize(IDescriptor descriptor, IAsAdditionElement parent) { IRuleElement element = null; if (descriptor is XmlDescriptor d) { element = CreateObject(new CreateObjectRequest() { Descriptor = d, Parent = parent }); /* * Вычисляем IRewritableElement. * Если созданный элемент является таковым, используем его. * Если нет - используем parent */ parent = element as IAsAdditionElement ?? parent; FillObject(new FillObjectRequest() { Descriptor = d, Element = element, Parent = parent }); } return(element); }
private static void Rewrite(IAsAdditionElement found, IRuleHandler handler) { var currentsettings = handler.Settings; handler.Settings = currentsettings.Addition; (found as RuleElementBase).Interpret(handler); handler.Settings = currentsettings; }
/// <summary> /// Переписывает только номер песни. /// </summary> /// <param name="source"></param> public void RewriteValues(IAsAdditionElement source) { if (source is KOdiRule s) { if (s.Number != null) { Number = s.Number; } } }
public T Deserialize(IDescriptor descriptor, IAsAdditionElement parent) { var result = _innerContainer.Deserialize(descriptor, parent); if (result is IHavingVariables c) { _serializerRoot.AddHavingVariablesElement(c); } return(result); }
public T Deserialize(IDescriptor descriptor, IAsAdditionElement parent) { var result = _innerContainer.Deserialize(descriptor, parent); if (result != null) { _serializerRoot.AddElement(result); } return(result); }
/// <summary> /// Возвращает уровень глубины элемента <see cref="IAsAdditionElement"/> /// </summary> /// <param name="elem"></param> /// <returns></returns> public static int GetDepth(this IAsAdditionElement elem) { int result = 0; while (elem.Parent != null) { elem = elem.Parent; result++; } return(result); }
/// <summary> /// Обрабатывает возможности rewrite/remove элемента IAsAdditionElement. /// Если элемент найден и обработан, возвращает true. /// </summary> /// <param name="element"></param> /// <param name="handler"></param> /// <returns></returns> public static bool AsAdditionHandled(this IAsAdditionElement element, IRuleHandler handler) { bool result = false; if (handler.Settings.Addition?.RuleContainer is RootContainer container) { //ищем элемент(ы) для замены var foundItems = container.GetAsAdditionChildElements(handler, handler.Settings.Addition, element, c => (c.AsAdditionMode == AsAdditionMode.Rewrite || c.AsAdditionMode == AsAdditionMode.Remove || c.AsAdditionMode == AsAdditionMode.RewriteValues)); //если находим, исполняем/исключаем его вместо настоящего элемента foreach (var found in foundItems) { if (found != null) { switch (found.AsAdditionMode) { case AsAdditionMode.Rewrite: { //если rewrite, то исполняем элемент Rewrite(found, handler); result = true; } break; case AsAdditionMode.Remove: { result = true; //если remove, то просто ничего не делаем } break; case AsAdditionMode.RewriteValues: { //переписываем внутренние значения элемента и только element.RewriteValues(found); } break; } } } } return(result); }
public T Deserialize(IDescriptor descriptor, IAsAdditionElement parent) { if (descriptor == null) { throw new ArgumentNullException(nameof(descriptor)); } string elementName = descriptor.GetElementName(); if (Factories.ContainsKey(elementName)) { return((T)Factories[elementName].Deserialize(descriptor, parent)); } return(default(T)); }
public void RewriteValues(IAsAdditionElement source) { if (source is ModifyDay s) { if (s.DayMoveCount != null) { DayMoveCount = s.DayMoveCount; } Priority = s.Priority; if (s.ShortName != null) { ShortName = s.ShortName; } IsLastName = s.IsLastName; AsAddition = s.AsAddition; UseFullName = s.UseFullName; if (s.SignNumber != null) { SignNumber = s.SignNumber; } if (s.Filter != null) { Filter = s.Filter; } if (s.ChildDateExp != null) { ChildDateExp = s.ChildDateExp; } if (s.ModifyReplacedDay != null) { ModifyReplacedDay = s.ModifyReplacedDay; } } }
/// <summary> /// Сравнение с элементом <see cref="IAsAdditionElement"/> на совпадение /// </summary> /// <param name="elem">Элемент в основном правиле</param> /// <param name="elemToMatch">Элемент в Дополнении</param> /// <returns></returns> public static AsAdditionMatchingResult IsMatch(this IAsAdditionElement elem, IAsAdditionElement elemToMatch) { //Находим разницу в уровнях глубины элементов int dif = elem.GetDepth() - elemToMatch.GetDepth(); /* * Зашли слишком глубоко - надо останавливаться, сравнение имеет отрицательный результат * Например, элемент в основном правиле - worship?id=moleben * А элемент в дополнении - worship/kekragaria */ if (dif < 0) { return(AsAdditionMatchingResult.Fail); } /* * Уровни одинаковые - значит сравниваем напрямую */ if (dif == 0) { return((elem.AsAdditionName == elemToMatch.AsAdditionName) ? AsAdditionMatchingResult.Success : AsAdditionMatchingResult.Fail); } //Элемент в дополнении имеет меньшую глубину var compareResult = AsAdditionMatchingResult.Continue; //сравниваем родителей, пока не выйдем на одинаковый уровень while (compareResult == AsAdditionMatchingResult.Continue) { elem = elem.Parent; compareResult = elem.IsMatch(elemToMatch); } //Если на одинаковом уровне значения совпадают, значит возвращаем Continue //Иначе - Fail return((compareResult == AsAdditionMatchingResult.Success) ? AsAdditionMatchingResult.Continue : AsAdditionMatchingResult.Fail); }
/// <summary> /// Возвращает коллекцию элементов для замены, отвечающих условиям /// </summary> /// <param name="settings"></param> /// <param name="element"></param> /// <param name="predicate"></param> /// <returns></returns> public IReadOnlyList <IAsAdditionElement> GetAsAdditionChildElements(IRuleHandler handler, RuleHandlerSettings settings, IAsAdditionElement element, Func <IAsAdditionElement, bool> predicate = null) { #region old version ////используем специальный обработчик ////чтобы найти все дочерние элементы по искомым признакам //var childrenHandler = new AsAdditionElementHandler(element, predicate) { Settings = settings }; ////Interpret(childrenHandler); //foreach (RuleElementBase elem in ChildElements) //{ // elem.Interpret(childrenHandler); //} //return childrenHandler.GetResult(); #endregion var elements = _addElementsDict.GetValueOrDefault(GetKey(handler, settings)); //Проверяем, существует ли коллекция if (elements == null) { //создаем ее var childrenHandler = new CollectorRuleHandler <IAsAdditionElement>(); Interpret(childrenHandler); elements = new List <IAsAdditionElement>(childrenHandler.GetResult()); _addElementsDict.Add(GetKey(handler, settings), elements); } return(elements.Where(c => c.AsAdditionName == element.AsAdditionName) .Where(predicate) .ToList()); }
public WorshipRule(string name, IAsAdditionElement parent, IQueryProcessor queryProcessor) : base(name) { Parent = parent; QueryProcessor = queryProcessor; }
public ModifyReplacedDay(string name, IAsAdditionElement parent) : base(name, parent) { }
public ModifyDay(string name, IAsAdditionElement parent) : base(name) { Parent = parent; }
public KanonasRule(string name, IElementViewModelFactory <KanonasRule> viewModelFactory, IAsAdditionElement parent) : base(name) { ViewModelFactory = viewModelFactory ?? throw new ArgumentNullException("IElementViewModelFactory in KanonasRuleBase"); Parent = parent; }
public static void FillIAsAdditionElement(this IAsAdditionElement element, XmlNode node) { XmlAttribute attr = node.Attributes[RuleConstants.IAsAdditionElementModeAttrName]; element.AsAdditionMode = (Enum.TryParse(attr?.Value, true, out AsAdditionMode mode)) ? mode : AsAdditionMode.None; }
public Notice(string name, IAsAdditionElement parent, IQueryProcessor queryProcessor) : base(name, parent, queryProcessor) { }
public static List <RuleElementBase> DeserializeChildren(this XmlNodeList list, IRuleSerializerRoot root, IAsAdditionElement parent) { var result = new List <RuleElementBase>(); foreach (XmlNode childNode in list) { var child = root.Container <RuleElementBase>().Deserialize(new XmlDescriptor() { Element = childNode }, parent); result.Add(child); } return(result); }
/// <summary> /// Ничего не делаем. /// </summary> /// <param name="source"></param> public void RewriteValues(IAsAdditionElement source) { }