Пример #1
0
 public void RewriteValues(IAsAdditionElement source)
 {
     if (source is KAfterRule s)
     {
         OdiNumber = s.OdiNumber;
     }
 }
Пример #2
0
 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);
        }
Пример #4
0
        private static void Rewrite(IAsAdditionElement found, IRuleHandler handler)
        {
            var currentsettings = handler.Settings;

            handler.Settings = currentsettings.Addition;
            (found as RuleElementBase).Interpret(handler);

            handler.Settings = currentsettings;
        }
Пример #5
0
 /// <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);
        }
Пример #7
0
        public T Deserialize(IDescriptor descriptor, IAsAdditionElement parent)
        {
            var result = _innerContainer.Deserialize(descriptor, parent);

            if (result != null)
            {
                _serializerRoot.AddElement(result);
            }

            return(result);
        }
Пример #8
0
        /// <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);
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        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));
        }
Пример #11
0
        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;
                }
            }
        }
Пример #12
0
        /// <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);
        }
Пример #13
0
        /// <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());
        }
Пример #14
0
        public WorshipRule(string name, IAsAdditionElement parent, IQueryProcessor queryProcessor) : base(name)
        {
            Parent = parent;

            QueryProcessor = queryProcessor;
        }
Пример #15
0
 public ModifyReplacedDay(string name, IAsAdditionElement parent) : base(name, parent)
 {
 }
Пример #16
0
 public ModifyDay(string name, IAsAdditionElement parent) : base(name)
 {
     Parent = parent;
 }
Пример #17
0
        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;
        }
Пример #19
0
 public Notice(string name, IAsAdditionElement parent, IQueryProcessor queryProcessor) : base(name, parent, queryProcessor)
 {
 }
Пример #20
0
        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);
        }
Пример #21
0
 /// <summary>
 /// Ничего не делаем.
 /// </summary>
 /// <param name="source"></param>
 public void RewriteValues(IAsAdditionElement source)
 {
 }