Example #1
0
        /// <summary>
        /// To delete the rule and all opposite rules. If the rule is executed at the time when this method is called, it will not be deleted.
        /// </summary>
        /// <param name="container">The rules container.</param>
        /// <param name="rule">Rule.</param>
        /// <returns><see langword="true" />, if rule was removed, otherwise, <see langword="false" />.</returns>
        public static bool TryRemoveWithExclusive(this IMarketRuleContainer container, IMarketRule rule)
        {
            if (container == null)
            {
                throw new ArgumentNullException(nameof(container));
            }

            if (rule == null)
            {
                throw new ArgumentNullException(nameof(rule));
            }

            if (container.TryRemoveRule(rule))
            {
                if (rule.ExclusiveRules.Count > 0)
                {
                    foreach (var exclusiveRule in rule.ExclusiveRules.SyncGet(c => c.CopyAndClear()))
                    {
                        container.TryRemoveRule(exclusiveRule, false);
                    }
                }

                return(true);
            }

            return(false);
        }
Example #2
0
        /// <summary>
        /// To delete a rule. If a rule is executed at the time when this method is called, it will not be deleted.
        /// </summary>
        /// <param name="container">The rules container.</param>
        /// <param name="rule">Rule.</param>
        /// <param name="checkCanFinish">To check the possibility of rule suspension.</param>
        /// <returns><see langword="true" />, if a rule was successfully deleted, <see langword="false" />, if a rule cannot be currently deleted.</returns>
        public static bool TryRemoveRule(this IMarketRuleContainer container, IMarketRule rule, bool checkCanFinish = true)
        {
            if (container == null)
            {
                throw new ArgumentNullException(nameof(container));
            }

            if (rule == null)
            {
                throw new ArgumentNullException(nameof(rule));
            }

            var isRemoved = false;

            if ((!checkCanFinish && !rule.IsActive && rule.IsReady) || rule.CanFinish())
            {
                container.Rules.Remove(rule);
                isRemoved = true;
            }

            if (isRemoved)
            {
                container.AddRuleLog(LogLevels.Debug, rule, LocalizedStrings.Str1084, rule);
            }

            return(isRemoved);
        }
Example #3
0
		/// <summary>
		/// Release resources.
		/// </summary>
		protected override void DisposeManaged()
		{
			_container.AddRuleLog(LogLevels.Debug, this, LocalizedStrings.Str1092);
			_container = null;

			base.DisposeManaged();

			Holder.RuleStat.Remove(this);
		}
Example #4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="MarketRuleList"/>.
        /// </summary>
        /// <param name="container">The rules container.</param>
        public MarketRuleList(IMarketRuleContainer container)
        {
            if (container == null)
            {
                throw new ArgumentNullException(nameof(container));
            }

            _container = container;
        }
Example #5
0
        /// <summary>
        /// To activate the rule.
        /// </summary>
        /// <param name="container">The rules container.</param>
        /// <param name="rule">Rule.</param>
        /// <param name="process">The handler.</param>
        public static void ActiveRule(this IMarketRuleContainer container, IMarketRule rule, Func <bool> process)
        {
            if (process == null)
            {
                throw new ArgumentNullException(nameof(process));
            }

            container.AddRuleLog(LogLevels.Debug, rule, LocalizedStrings.Str1082);

            List <IMarketRule> removedRules = null;

            // mika
            // проверяем правило, так как оно могло быть удалено параллельным потоком
            if (!rule.IsReady)
            {
                return;
            }

            rule.IsActive = true;

            try
            {
                if (process())
                {
                    container.Rules.Remove(rule);
                    removedRules = new List <IMarketRule> {
                        rule
                    };
                }
            }
            finally
            {
                rule.IsActive = false;
            }

            if (removedRules == null)
            {
                return;
            }

            if (rule.ExclusiveRules.Count > 0)
            {
                foreach (var exclusiveRule in rule.ExclusiveRules.SyncGet(c => c.CopyAndClear()))
                {
                    container.TryRemoveRule(exclusiveRule, false);
                    removedRules.Add(exclusiveRule);
                }
            }

            foreach (var removedRule in removedRules)
            {
                container.AddRuleLog(LogLevels.Debug, removedRule, LocalizedStrings.Str1083);
            }
        }
Example #6
0
        /// <summary>
        /// To form a rule (include <see cref="IMarketRule.IsReady"/>).
        /// </summary>
        /// <param name="rule">Rule.</param>
        /// <param name="container">The rules container.</param>
        /// <returns>Rule.</returns>
        public static IMarketRule Apply(this IMarketRule rule, IMarketRuleContainer container)
        {
            if (rule == null)
            {
                throw new ArgumentNullException(nameof(rule));
            }

            if (container == null)
            {
                throw new ArgumentNullException(nameof(container));
            }

            container.Rules.Add(rule);
            return(rule);
        }
Example #7
0
        /// <summary>
        /// To process rules in suspended mode (for example, create several rules and start them up simultaneously). After completion of method operation all rules, attached to the container resume their activity.
        /// </summary>
        /// <param name="container">The rules container.</param>
        /// <param name="action">The action to be processed at suspended rules. For example, to add several rules simultaneously.</param>
        public static void SuspendRules(this IMarketRuleContainer container, Action action)
        {
            if (container == null)
            {
                throw new ArgumentNullException(nameof(container));
            }

            if (action == null)
            {
                throw new ArgumentNullException(nameof(action));
            }

            container.SuspendRules();

            try
            {
                action();
            }
            finally
            {
                container.ResumeRules();
            }
        }
Example #8
0
 /// <summary>
 /// To form a rule (include <see cref="IMarketRule.IsReady"/>).
 /// </summary>
 /// <typeparam name="TToken">The type of token.</typeparam>
 /// <typeparam name="TArg">The type of argument, accepted by the rule.</typeparam>
 /// <param name="rule">Rule.</param>
 /// <param name="container">The rules container.</param>
 /// <returns>Rule.</returns>
 public static MarketRule <TToken, TArg> Apply <TToken, TArg>(this MarketRule <TToken, TArg> rule, IMarketRuleContainer container)
 {
     return((MarketRule <TToken, TArg>)((IMarketRule)rule).Apply(container));
 }
Example #9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MarketRuleList"/>.
 /// </summary>
 /// <param name="container">The rules container.</param>
 public MarketRuleList(IMarketRuleContainer container)
 {
     _container = container ?? throw new ArgumentNullException(nameof(container));
 }