コード例 #1
0
        public override void Process(StartTrackingArgs args)
        {
            if (!Tracker.IsActive || String.IsNullOrEmpty(RulesItemId))
                return;

            VisitorDataSet.VisitsRow currentVisit = Tracker.Visitor.GetCurrentVisit();

            if (currentVisit == null || currentVisit.HasGeoIpData)
                return;

            Item rulesItem = Sitecore.Context.Database.GetItem(RulesItemId);

            if (rulesItem == null)
                return;

            RuleList<RuleContext> ruleList = RuleFactory.GetRules<RuleContext>(rulesItem, "Rule");

            if (ruleList == null)
                return;

            RuleContext ruleContext = new RuleContext();

            if (SatisfiesConditions(ruleList, ruleContext))
                currentVisit.UpdateGeoIpData();

            ruleContext.Abort();
        }
コード例 #2
0
        public static bool ValidateRule(RuleList<RuleContext> rules, Item ruleItem, Item checkItem)
        {
            var ruleContext = new RuleContext { Item = checkItem };
            var result = false;
            using (
                new LongRunningOperationWatcher(Settings.Profiling.RenderFieldThreshold, "Long running rule set: {0}",
                    new string[1]
                    {
                        ruleItem.Name ?? string.Empty
                    }))
            {
                foreach (var rule in rules.Rules)
                {
                    if (rule.Condition == null)
                        continue;

                    var stack = new RuleStack();

                    try
                    {
                        rule.Condition.Evaluate(ruleContext, stack);
                    }
                    catch (Exception ex)
                    {
                        Log.Error(
                            string.Format("Evaluation of condition failed. Rule item ID: {0}, condition item ID: {1}",
                                rule.UniqueId != (ID)null ? rule.UniqueId.ToString() : "Unknown",
                                rule.Condition.UniqueId != ID.Null.ToString()
                                    ? rule.Condition.UniqueId
                                    : "Unknown"), ex, typeof(RuleProcessor));
                        ruleContext.Abort();
                    }

                    if (ruleContext.IsAborted)
                        break;

                    if (stack.Count != 0 && (bool)stack.Pop())
                        result = true;
                    else
                    {
                        result = false;
                        break;
                    }
                }
            }

            return result;
        }