示例#1
0
        public void Write(IStyleSystem styleSystem, XContainer container, ICondition condition, IConditionWriter childWriter)
        {
            IConditionWriter w;

            if (writers.TryGetValue(condition.GetType(), out w))
            {
                w.Write(styleSystem, container, condition, childWriter);
            }
            else
            {
                throw new StyleWriterException("There is no writer for condition " + condition.GetType().Name);
            }
        }
示例#2
0
        /// <summary>
        /// Add a condition to the collection. The method checks if the condition is applicable, through the IsApplicable method. If not, it throws exception.
        /// The method checks if the condition is already present in the collection. If yes, it throws an exeception.
        /// The condition is registered among the other conditions having the same Type.
        /// </summary>
        /// <param name="condition"></param>
        public void AddCondition(ICondition condition)
        {
            string            str;
            List <ICondition> list;

            if (condition == null)
            {
                throw new ArgumentNullException("condition");
            }
            if (!condition.IsApplicable(out str))
            {
                throw new Exception(str);
            }
            System.Type key = condition.GetType();
            if (!this._conditions.TryGetValue(key, out list))
            {
                list = new List <ICondition> {
                    condition
                };
                this._conditions.Add(key, list);
            }
            else
            {
                if (list.Contains(condition))
                {
                    throw new Exception("The conditions' set already contains this condition");
                }
                list.Add(condition);
            }
        }
        public CommandWindow(ICondition condition)
        {
            InitializeComponent();
            Condition = condition;

            Title = new LocalizationConverter().Convert(Condition, null, null, null) as string;

            Initialize(condition, condition.GetType());
        }
        private string CompileCondition(ICondition condition)
        {
            switch (condition)
            {
            case EqualCondition equalCondition:
                return(this.GetEqualCamlCondition(equalCondition));

            default:
                throw new ArgumentException($"Not supported condition type: {condition.GetType()}", nameof(condition));
            }
        }
        private static bool IsAnyConditionNull(ICondition condition, string conditionName = "")
        {
            if (condition == null)
            {
                BH.Engine.Reflection.Compute.RecordError($"The condition is null. Please specify a valid condition.");
                return(true);
            }

            // Collect all sub-properties of type Condition from the condition and check if any is null
            bool isAnyNull     = false;
            var  subConditions = condition.GetType().GetProperties().Where(p => p.PropertyType is ICondition);

            foreach (var subCond in subConditions)
            {
                if (subCond.GetValue(condition) == null)
                {
                    BH.Engine.Reflection.Compute.RecordError($"The condition `{condition.GetType().Name}.{subCond.Name}` is null. Please specify a valid condition.");
                    isAnyNull = true;
                }
            }

            return(isAnyNull);
        }
示例#6
0
        //--------------------------------------------------
        // Link with exit code and condition
        //--------------------------------------------------

        /// <summary>
        /// 用退出码和条件和路径连接两个状态,当起点状态按指定退出码退出并满足条件时按路径迁移到终点状态。
        /// </summary>
        /// <param name="from">起点状态。</param>
        /// <param name="to">终点状态。</param>
        /// <param name="exitCode">退出码。</param>
        /// <param name="condition">条件类的实例。</param>
        /// <param name="path">起点和终点状态之间的过渡路径。</param>
        protected void Link(FsmState from, FsmState to, int exitCode, ICondition condition, bool inverse,
                            params FsmState[] path)
        {
            Dictionary <int, Dictionary <ICondition, ToAndList> > connections;
            Dictionary <ICondition, ToAndList> subConnections;

            condition = GetCondition(condition, inverse);

            if (!graphExitConditionConnections.TryGetValue(from, out connections))
            {
                connections    = new Dictionary <int, Dictionary <ICondition, ToAndList> >();
                subConnections = new Dictionary <ICondition, ToAndList>();
                subConnections.Add(condition, new ToAndList(to, path));
                connections.Add(exitCode, subConnections);
                graphExitConditionConnections.Add(from, connections);
                return;
            }

            if (!connections.TryGetValue(exitCode, out subConnections))
            {
                subConnections = new Dictionary <ICondition, ToAndList>();
                subConnections.Add(condition, new ToAndList(to, path));
                connections.Add(exitCode, subConnections);
                return;
            }

            ToAndList toAndList;

            if (!subConnections.TryGetValue(condition, out toAndList))
            {
                toAndList = new ToAndList(to, path);
                subConnections.Add(condition, toAndList);
                return;
            }

            throw new Exception(string.Format(
                                    "Try to override exist exit+condition connection:" +
                                    "\n{0} --> {2} : {1}\n{0} --> {3} : exit({4}) + {1}\n",
                                    from.GetType().Name,
                                    condition.GetType().Name,
                                    toAndList.To.GetType().Name,
                                    to.GetType().Name,
                                    exitCode));
        }
示例#7
0
        public static IExpression Where(this IStatement statement, ICondition criteria)
        {
            if (criteria == null)
            {
                return(null);
            }

            if (criteria is Condition c)
            {
                return(GetConditionExpression(statement, c));
            }

            if (criteria is ConditionCollection cc)
            {
                return(GetConditionExpression(statement, cc));
            }

            throw new NotSupportedException($"The '{criteria.GetType().FullName}' type is an unsupported condition type.");
        }
示例#8
0
        public virtual EntityExpression <TEntity> Where(ICondition condition, string oprand = "and")
        {
            if (condition != null)
            {
                switch (condition.GetType().Name)
                {
                case "ExpressionCondition`1":
                    HandleCondition(oprand, (ExpressionCondition <TEntity>)condition);
                    break;

                //case "CombinCondition`1":
                //    HandleCondition(oprand, (CombinCondition<TEntity>)condition);
                //    break;
                default:
                    break;
                }
            }
            return(this);
        }
示例#9
0
        public static IExpression Where(this IStatement statment, ICondition criteria)
        {
            if (criteria == null)
            {
                return(null);
            }

            if (criteria is Condition c)
            {
                return(ConditionExtension.ToExpression(c, field => From(statment, field, out var property).CreateField(property), parameter => statment.Parameters.Add(parameter)));
            }

            if (criteria is ConditionCollection cc)
            {
                return(ConditionExtension.ToExpression(cc, field => From(statment, field, out var property).CreateField(property), parameter => statment.Parameters.Add(parameter)));
            }

            throw new NotSupportedException($"The '{criteria.GetType().FullName}' type is an unsupported condition type.");
        }
示例#10
0
        public IEnumerator Condition()
        {
            // Given a training which has a step with a condition
            ICourse training1 = new LinearTrainingBuilder("Training")
                                .AddChapter(new LinearChapterBuilder("Chapter")
                                            .AddStep(new BasicStepBuilder("Step")
                                                     .AddCondition(new TimeoutCondition(2.5f))))
                                .Build();

            // When we serialize and deserialize it
            ICourse training2 = JsonTrainingSerializer.Deserialize((JsonTrainingSerializer.Serialize(training1)));

            // Then that condition's name should not change.
            ICondition condition1 = training1.Data.FirstChapter.Data.FirstStep.Data.Transitions.Data.Transitions.First().Data.Conditions.First();
            ICondition condition2 = training2.Data.FirstChapter.Data.FirstStep.Data.Transitions.Data.Transitions.First().Data.Conditions.First();

            Assert.AreEqual(condition1.GetType(), condition2.GetType());

            return(null);
        }
示例#11
0
 private void ValidateCondition(ValidationContext context, ICondition condition)
 {
     context.AssertNotNull(condition, "Condition");
     if (condition is IBinaryCondition <string> strCondition)
     {
         ValidateBinaryCondition(context, strCondition);
     }
     else if (condition is IBinaryCondition binCondition)
     {
         ValidateBinaryCondition(context, binCondition);
     }
     else if (condition is INaryCondition iNaryCondition)
     {
         ValidateNAryCondition(context, iNaryCondition);
     }
     else if (condition is NotCondition notCondition)
     {
         ValidateCondition(context, notCondition.Condition);
     }
     else if (condition != null)
     {
         throw new ValidationException("Unsupported condition type: " + condition.GetType());
     }
 }
示例#12
0
 public static MethodInfo CreateMethod(this ICondition condition)
 {
     return(GenerateDynamicMethod(condition.GetType(), condition.Name, "IsValid"));
 }
示例#13
0
 public static Type GetMethodType(this ICondition condition)
 {
     return(GenerateGenericDelegate(condition.GetType()));
 }
        private ConditionControlBase GetControlForCondition(ICondition c, ConditionControlBase parent)
        {
            ConditionControlBase control = null;

            if (c == null)
            {
                ConditionPlaceholderControl cpc = new ConditionPlaceholderControl();
                cpc.ParentConditionControl = parent;
                cpc.InsertCondition += new EventHandler<InsertConditionEventArgs>(InsertCondition);
                Controls.Add(cpc);
                control = cpc;
            }
            else if (c.GetType() == typeof(ResponseStatusCodeEqualToCondition))
            {
                ResponseStatusEqualToControl ctl = new ResponseStatusEqualToControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(ResponseStatusCodeEqualToNotCondition))
            {
                ResponseStatusNotEqualToControl ctl = new ResponseStatusNotEqualToControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(ResponseBodyContainsCondition))
            {
                ResponseBodyContainsControl ctl = new ResponseBodyContainsControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(ResponseBodyContainsNotCondition))
            {
                ResponseBodyContainsNotControl ctl = new ResponseBodyContainsNotControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(ResponseBodyRegexMatchCondition))
            {
                ResponseBodyContainsRegexControl ctl = new ResponseBodyContainsRegexControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(ResponseBodyRegexMatchNotCondition))
            {
                ResponseBodyContainsRegexNotControl ctl = new ResponseBodyContainsRegexNotControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(AndCondition) || c.GetType() == typeof(OrCondition))
            {
                BinaryCondition bc = c as BinaryCondition;
                BinaryConditionControl ctl = (c.GetType() == typeof(AndCondition) ? (BinaryConditionControl)new AndControl() : (BinaryConditionControl)new OrControl());
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;

                ctl.SubconditionControls.Add(GetControlForCondition(bc.Condition2 as ICondition, ctl));

                ctl.SubconditionControls.Add(GetControlForCondition(bc.Condition1 as ICondition, ctl));
            }

            control.ParentConditionControl = parent;

            //if (parent != null)
            //    parent.SubconditionControls.Add(control);

            control.DeleteCondition += new EventHandler<DeleteConditionEventArgs>(DeleteCondition);

            return control;
        }
示例#15
0
        private ConditionControlBase GetControlForCondition(ICondition c, ConditionControlBase parent)
        {
            ConditionControlBase control = null;

            if (c == null)
            {
                ConditionPlaceholderControl cpc = new ConditionPlaceholderControl();
                cpc.ParentConditionControl = parent;
                cpc.InsertCondition       += new EventHandler <InsertConditionEventArgs>(InsertCondition);
                Controls.Add(cpc);
                control = cpc;
            }
            else if (c.GetType() == typeof(ResponseStatusCodeEqualToCondition))
            {
                ResponseStatusEqualToControl ctl = new ResponseStatusEqualToControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(ResponseStatusCodeEqualToNotCondition))
            {
                ResponseStatusNotEqualToControl ctl = new ResponseStatusNotEqualToControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(ResponseBodyContainsCondition))
            {
                ResponseBodyContainsControl ctl = new ResponseBodyContainsControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(ResponseBodyContainsNotCondition))
            {
                ResponseBodyContainsNotControl ctl = new ResponseBodyContainsNotControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(ResponseBodyRegexMatchCondition))
            {
                ResponseBodyContainsRegexControl ctl = new ResponseBodyContainsRegexControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(ResponseBodyRegexMatchNotCondition))
            {
                ResponseBodyContainsRegexNotControl ctl = new ResponseBodyContainsRegexNotControl();
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;
            }
            else if (c.GetType() == typeof(AndCondition) || c.GetType() == typeof(OrCondition))
            {
                BinaryCondition        bc  = c as BinaryCondition;
                BinaryConditionControl ctl = (c.GetType() == typeof(AndCondition) ? (BinaryConditionControl) new AndControl() : (BinaryConditionControl) new OrControl());
                ctl.Condition = c;
                Controls.Add(ctl);
                control = ctl;

                ctl.SubconditionControls.Add(GetControlForCondition(bc.Condition2 as ICondition, ctl));

                ctl.SubconditionControls.Add(GetControlForCondition(bc.Condition1 as ICondition, ctl));
            }

            control.ParentConditionControl = parent;

            //if (parent != null)
            //    parent.SubconditionControls.Add(control);

            control.DeleteCondition += new EventHandler <DeleteConditionEventArgs>(DeleteCondition);

            return(control);
        }
示例#16
0
		public static IExpression Where(this IStatement statement, ICondition criteria)
		{
			if(criteria == null)
				return null;

			if(criteria is Condition c)
				return ConditionExtension.ToExpression(c,
					field => GetField(statement, field),
					parameter => statement.Parameters.Add(parameter));

			if(criteria is ConditionCollection cc)
				return ConditionExtension.ToExpression(cc,
					field => GetField(statement, field),
					parameter => statement.Parameters.Add(parameter));

			throw new NotSupportedException($"The '{criteria.GetType().FullName}' type is an unsupported condition type.");

			FieldIdentifier GetField(IStatement host, Condition condition)
			{
				var source = From(statement, condition.Name, (src, complex) => CreateSubquery(host, src, complex, condition.Value as ICondition), out var property);

				if(property.IsSimplex)
					return source.CreateField(property);

				if(condition.Operator == ConditionOperator.Exists || condition.Operator == ConditionOperator.NotExists)
				{
					condition.Value = source;
					return null;
				}

				throw new DataException($"The specified '{condition.Name}' condition is associated with a one-to-many composite(navigation) property and does not support the {condition.Operator} operation.");
			}

			ISource CreateSubquery(IStatement host, ISource source, IDataEntityComplexProperty complex, ICondition condition)
			{
				var subquery = host.Subquery(complex.Foreign);
				var where = ConditionExpression.And();

				foreach(var link in complex.Links)
				{
					subquery.Select.Members.Add(subquery.Table.CreateField(link.Foreign));

					where.Add(Expression.Equal(
						subquery.Table.CreateField(link.Foreign),
						source.CreateField(link.Principal)
					));
				}

				if(complex.HasConstraints())
				{
					foreach(var constraint in complex.Constraints)
					{
						where.Add(Expression.Equal(
							subquery.Table.CreateField(constraint.Name),
							complex.GetConstraintValue(constraint)
						));
					}
				}

				if(condition != null)
					where.Add(Where(subquery, condition));

				subquery.Where = where;
				return subquery;
			}
		}
示例#17
0
        /***************************************************/

        //Fallback
        private static ConditionResult VerifyCondition(List <object> objects, ICondition condition)
        {
            BH.Engine.Reflection.Compute.RecordError($"Could not apply {condition.GetType().Name}. No method found.");
            return(null);
        }
        public static ICondition ExtendedConvertToCondition(this ConditionModel model, IEntityMetadata metaData, IEntityRegistry registry, IServiceProvider services)
        {
            if (((IEnumerable <object>)metaData.Type.GetCustomAttributes(typeof(ObsoleteAttribute), false)).Any <object>())
            {
                return((ICondition)null);
            }
            ICondition instance1 = ActivatorUtilities.CreateInstance(services, metaData.Type, Array.Empty <object>()) as ICondition;

            if (instance1 == null)
            {
                return((ICondition)null);
            }
            PropertyInfo[] properties = instance1.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
            if (((IEnumerable <PropertyInfo>)properties).Any <PropertyInfo>((Func <PropertyInfo, bool>)(p => ModelExtensions.IsBinaryOperator(p.PropertyType))))
            {
                PropertyInfo  propertyInfo          = ((IEnumerable <PropertyInfo>)properties).FirstOrDefault <PropertyInfo>((Func <PropertyInfo, bool>)(p => ModelExtensions.IsBinaryOperator(p.PropertyType)));
                PropertyModel operatorModelProperty = model.Properties.FirstOrDefault <PropertyModel>((Func <PropertyModel, bool>)(x => x.IsOperator));
                if (operatorModelProperty != null)
                {
                    IEntityMetadata entityMetadata = registry.GetOperators().FirstOrDefault <IEntityMetadata>((Func <IEntityMetadata, bool>)(m => m.Type.FullName.Equals(operatorModelProperty.Value, StringComparison.OrdinalIgnoreCase)));
                    object          instance2      = ActivatorUtilities.CreateInstance(services, entityMetadata?.Type, Array.Empty <object>());
                    if ((object)propertyInfo != null)
                    {
                        propertyInfo.SetValue((object)instance1, instance2);
                    }
                }
            }
            foreach (PropertyModel property1 in (IEnumerable <PropertyModel>)model.Properties)
            {
                if (!property1.IsOperator)
                {
                    PropertyInfo property2 = instance1.GetType().GetProperty(property1.Name, BindingFlags.Instance | BindingFlags.Public);
                    Type         type      = (!property2.PropertyType.IsGenericType ? 0 : (typeof(IRuleValue <>).IsAssignableFrom(property2.PropertyType.GetGenericTypeDefinition()) ? 1 : 0)) != 0 ? ((IEnumerable <Type>)property2.PropertyType.GetGenericArguments()).FirstOrDefault <Type>() : property2.PropertyType;
                    if (!(type == (Type)null))
                    {
                        string fullName = type.FullName;
                        if (!(fullName == "System.DateTime"))
                        {
                            if (!(fullName == "System.DateTimeOffSet"))
                            {
                                if (!(fullName == "System.Int32"))
                                {
                                    if (!(fullName == "System.Boolean")) //our extended boolean condition
                                    {
                                        if (fullName == "System.Decimal")
                                        {
                                            Decimal result;
                                            Decimal.TryParse(property1.Value, out result);
                                            LiteralRuleValue <Decimal> literalRuleValue = new LiteralRuleValue <Decimal>()
                                            {
                                                Value = result
                                            };
                                            property2.SetValue((object)instance1, (object)literalRuleValue, (object[])null);
                                        }
                                        else
                                        {
                                            LiteralRuleValue <string> literalRuleValue = new LiteralRuleValue <string>()
                                            {
                                                Value = property1.Value
                                            };
                                            property2.SetValue((object)instance1, (object)literalRuleValue, (object[])null);
                                        }
                                    }
                                    else
                                    {
                                        bool result;
                                        bool.TryParse(property1.Value, out result);
                                        LiteralRuleValue <bool> literalRuleValue = new LiteralRuleValue <bool>()
                                        {
                                            Value = result
                                        };
                                        property2.SetValue((object)instance1, (object)literalRuleValue, (object[])null);
                                    }
                                }
                                else
                                {
                                    int result;
                                    int.TryParse(property1.Value, out result);
                                    LiteralRuleValue <int> literalRuleValue = new LiteralRuleValue <int>()
                                    {
                                        Value = result
                                    };
                                    property2.SetValue((object)instance1, (object)literalRuleValue, (object[])null);
                                }
                            }
                            else
                            {
                                DateTimeOffset result;
                                DateTimeOffset.TryParse(property1.Value, out result);
                                LiteralRuleValue <DateTimeOffset> literalRuleValue = new LiteralRuleValue <DateTimeOffset>()
                                {
                                    Value = result
                                };
                                property2.SetValue((object)instance1, (object)literalRuleValue, (object[])null);
                            }
                        }
                        else
                        {
                            DateTime result;
                            DateTime.TryParse(property1.Value, out result);
                            LiteralRuleValue <DateTime> literalRuleValue = new LiteralRuleValue <DateTime>()
                            {
                                Value = result
                            };
                            property2.SetValue((object)instance1, (object)literalRuleValue, (object[])null);
                        }
                    }
                }
            }
            return(instance1);
        }