예제 #1
0
        public static bool Evaluate(Restriction restriction, IRuleEvaluationContext context)
        {
            if (restriction == null)
            {
                context.TraceDebug <string>("Empty restriction evaluated to true in rule {0}", context.CurrentRule.Name);
                return(true);
            }
            Restriction.ResType type = restriction.Type;
            switch (type)
            {
            case Restriction.ResType.And:
                return(RestrictionEvaluator.EvaluateAndRestriction((Restriction.AndRestriction)restriction, context));

            case Restriction.ResType.Or:
                return(RestrictionEvaluator.EvaluateOrRestriction((Restriction.OrRestriction)restriction, context));

            case Restriction.ResType.Not:
                return(RestrictionEvaluator.EvaluateNotRestriction((Restriction.NotRestriction)restriction, context));

            case Restriction.ResType.Content:
                return(RestrictionEvaluator.EvaluateContentRestriction((Restriction.ContentRestriction)restriction, context));

            case Restriction.ResType.Property:
                return(RestrictionEvaluator.EvaluatePropertyRestriction((Restriction.PropertyRestriction)restriction, context));

            case Restriction.ResType.CompareProps:
                return(RestrictionEvaluator.EvaluateComparePropertyRestriction((Restriction.ComparePropertyRestriction)restriction, context));

            case Restriction.ResType.BitMask:
                return(RestrictionEvaluator.EvaluateBitMaskRestriction((Restriction.BitMaskRestriction)restriction, context));

            case Restriction.ResType.Size:
                return(RestrictionEvaluator.EvaluateSizeRestriction((Restriction.SizeRestriction)restriction, context));

            case Restriction.ResType.Exist:
                return(RestrictionEvaluator.EvaluateExistRestriction((Restriction.ExistRestriction)restriction, context));

            case Restriction.ResType.SubRestriction:
                if (restriction is Restriction.AttachmentRestriction)
                {
                    return(RestrictionEvaluator.EvaluateAttachmentRestriction((Restriction.AttachmentRestriction)restriction, context));
                }
                if (restriction is Restriction.RecipientRestriction)
                {
                    return(RestrictionEvaluator.EvaluateRecipientRestriction((Restriction.RecipientRestriction)restriction, context));
                }
                throw new InvalidRuleException(string.Format("SubRestriction Type {0} is not supported!", restriction.GetType()));

            case Restriction.ResType.Comment:
                return(RestrictionEvaluator.EvaluateCommentRestriction((Restriction.CommentRestriction)restriction, context));

            case Restriction.ResType.Count:
                return(RestrictionEvaluator.EvaluateCountRestriction((Restriction.CountRestriction)restriction, context));

            default:
                switch (type)
                {
                case Restriction.ResType.True:
                    context.TraceFunction("True Restriction");
                    return(true);

                case Restriction.ResType.False:
                    context.TraceFunction("False Restriction");
                    return(false);

                default:
                    throw new InvalidRuleException(string.Format("Restriction Type {0} is not supported!", restriction.Type));
                }
                break;
            }
        }