예제 #1
0
        public void RunGlobalRules <T>(Item rulesFolder, T context) where T : EnhancedRuleContext
        {
            if (rulesFolder == null)
            {
                Log.SingleError("Rules folder not found:\r\n" + Environment.StackTrace, this);
                return;
            }

            foreach (var ruleItem in rulesFolder.Axes.GetDescendants())
            {
                var ruleXml = ruleItem["Rule"];
                if (string.IsNullOrWhiteSpace(ruleXml) || ruleItem["Disabled"] == "1")
                {
                    continue;
                }

                var rules = new EnhancedRuleList <T>(RuleFactory.ParseRules <T>(ruleItem.Database, ruleXml).Rules);

                rules.Run(context);

                if (context.IsAborted)
                {
                    break;
                }
                if (context.StopProcessingAfterThisRuleset)
                {
                    context.StopProcessingAfterThisRuleset = false;
                    break;
                }
            }
        }
예제 #2
0
        // GET: ResortLocator
        public ActionResult ResortSection()
        {
            DebugUtils.StartLogEvent("ResortController.ResortSection");
            var model = GetLayoutItem <ResortSections>();

            foreach (Models.Resort.Section section in model.AllSections)
            {
                bool showUsingRules = true;


                if (section.InnerItem.Fields["{85B5A4F7-0974-4455-85FA-B33FFAF397E0}"] != null)
                {
                    String rule = section.InnerItem.Fields["{85B5A4F7-0974-4455-85FA-B33FFAF397E0}"].Value;
                    if (!string.IsNullOrEmpty(rule))
                    {
                        var rules       = RuleFactory.ParseRules <RuleContext>(section.InnerItem.Database, XElement.Parse(rule));
                        var ruleContext = new RuleContext()
                        {
                            Item = section.InnerItem
                        };

                        if (rule.Any() && rules.Rules.Count() > 0)
                        {
                            showUsingRules = rules.Rules.First().Evaluate(ruleContext);
                        }
                    }
                }
                section.HideSection = !showUsingRules;
                DebugUtils.EndLogEvent("ResortController.ResortSection");
            }

            return(View(model));
        }
예제 #3
0
        public ActionResult OwnerProxySection()
        {
            var model = GetLayoutItem <OwnerProxySections>();

            // var isValidVotingPeriod = Components.DBManager.isValidVotingPeriod();


            //TODO mode this code in central place to evaluate rules
            foreach (OwnerProxySection section in model.AllSections)
            {
                bool showUsingRules = true;

                if (section.InnerItem.Fields["{85B5A4F7-0974-4455-85FA-B33FFAF397E0}"] != null)
                {
                    string rule = section.InnerItem.Fields["{85B5A4F7-0974-4455-85FA-B33FFAF397E0}"].Value;
                    if (!string.IsNullOrEmpty(rule))
                    {
                        var rules       = RuleFactory.ParseRules <RuleContext>(section.InnerItem.Database, XElement.Parse(rule));
                        var ruleContext = new RuleContext()
                        {
                            Item = section.InnerItem
                        };

                        if (rule.Any() && rules.Rules.Count() > 0)
                        {
                            showUsingRules = rules.Rules.First().Evaluate(ruleContext);
                        }
                    }
                }
                section.HideSection = !showUsingRules;
            }

            return(View(model));
        }
예제 #4
0
        public ActionResult RewardsSection()
        {
            var model = GetLayoutItem <RewardsSections>();

            //TODO make it as Rule at later time
            CheckForTravelerPlusMembershipAndRedirect(model);

            //TODO mode this code in central place to evaluate rules
            foreach (Models.Reward.Section section in model.AllSections)
            {
                bool showUsingRules = true;


                if (section.InnerItem.Fields[BaseComponent.RestrictionRuleId] != null)
                {
                    string rule = section.InnerItem.Fields[BaseComponent.RestrictionRuleId].Value;
                    if (!string.IsNullOrEmpty(rule))
                    {
                        var rules       = RuleFactory.ParseRules <RuleContext>(section.InnerItem.Database, XElement.Parse(rule));
                        var ruleContext = new RuleContext()
                        {
                            Item = section.InnerItem
                        };

                        if (rule.Any() && rules.Rules.Count() > 0)
                        {
                            showUsingRules = rules.Rules.First().Evaluate(ruleContext);
                        }
                    }
                }
                section.HideSection = !showUsingRules;

                //Evaluate Rules For any rich text If Any
                if (section.AllRichText != null && section.AllRichText.Any())
                {
                    List <RichText> allRichTextItems = section.AllRichText.Select(x => x).ToList();
                    section.AllRichText = FilterRichTextBasedOnRules(allRichTextItems);
                }

                // Evaluate Rules For any Section Gallery Items If Any
                if (section.AllImages != null && section.AllImages.Any())
                {
                    List <FeaturedItem> allGalleryImages = section.AllImages.Select(x => x).ToList();
                    section.AllImages = RemoveUnwantedImagesBasedOnRules(allGalleryImages);
                }

                // Evaluate Rules For any Section Featured Folder Items If Any
                if (section.FolderWithFeaturedItems != null && section.FolderWithFeaturedItems.AllFeaturedItems.Any())
                {
                    List <FeaturedItem> allFeaturedItems = section.FolderWithFeaturedItems.AllFeaturedItems.Select(x => x).ToList();
                    section.FolderWithFeaturedItems.AllFeaturedItems = RemoveUnwantedImagesBasedOnRules(allFeaturedItems);
                }
            }

            return(View(model));
        }
예제 #5
0
        public ActionResult RedeemSection()
        {
            BlueGreenContext bgContext = new BlueGreenContext();

            //Just make it Null always when page loads
            if (Session["ConfirmedRewards"] != null)
            {
                Session["ConfirmedRewards"] = null;
            }

            var model = GetLayoutItem <RewardsSections>();

            if (model != null)
            {
                model.cartItemsList = GetAllCartItems();
                var encoreAvailRewards = (bgContext != null && bgContext.bxgOwner != null && bgContext.bxgOwner.EncoreBenefits != null) ? bgContext.bxgOwner.EncoreBenefits.DividendsBalance : 0;
                model.CartTotal = new CartTotal()
                {
                    AvailableRewards   = encoreAvailRewards,
                    TotalRewardsinCart = (model.cartItemsList.Count > 0) ? model.cartItemsList.Select(t => t.SubTotal).Sum() : 0,
                    AvailablePoints    = encoreAvailRewards - ((model.cartItemsList.Count > 0) ? model.cartItemsList.Select(t => t.SubTotal).Sum() : 0)
                };
            }

            //TODO mode this code in central place to evaluate rules
            foreach (Models.Reward.Section section in model.AllSections)
            {
                bool showUsingRules = true;
                if (bgContext.bxgOwner != null)
                {
                    section.MaintenanceFee = string.Format("{0:c}", bgContext.bxgOwner.PaymentBalance);
                    section.BalanceDue     = string.Format("{0:c}", bgContext.bxgOwner.PaymentBalance);
                }

                if (section.InnerItem.Fields[BaseComponent.RestrictionRuleId] != null)
                {
                    string rule = section.InnerItem.Fields[BaseComponent.RestrictionRuleId].Value;
                    if (!string.IsNullOrEmpty(rule))
                    {
                        var rules       = RuleFactory.ParseRules <RuleContext>(section.InnerItem.Database, XElement.Parse(rule));
                        var ruleContext = new RuleContext()
                        {
                            Item = section.InnerItem
                        };

                        if (rule.Any() && rules.Rules.Count() > 0)
                        {
                            showUsingRules = rules.Rules.First().Evaluate(ruleContext);
                        }
                    }
                }
                section.HideSection = !showUsingRules;
            }

            return(View(model));
        }
예제 #6
0
        public static bool EvaluateRules(string strRules, RuleContext ruleContext, bool failEmpty = false)
        {
            if (string.IsNullOrEmpty(strRules) || strRules.Length < 70)
            {
                return(!failEmpty);
            }
            // hacking the rules xml
            var rules = RuleFactory.ParseRules <RuleContext>(Factory.GetDatabase(ApplicationSettings.RulesDb), strRules);

            return(!rules.Rules.Any() || rules.Rules.Any(rule => rule.Evaluate(ruleContext)));
        }
        /// <summary>
        /// Invoke global device resolution rules.
        /// </summary>
        /// <returns>True if a global device resolution rule applied.</returns>
        protected bool InvokeGlobalRules()
        {
            Sitecore.Data.Items.Item ruleRoot = Sitecore.Context.Database.GetItem(
                "/sitecore/system/Settings/Rules/Determine Context Device/Rules");

            if (ruleRoot == null)
            {
                return(false);
            }

            // TODO: use descendants instead of children
            // for each possible global rule definition item
            foreach (Sitecore.Data.Items.Item child in ruleRoot.Children)
            {
                string ruleXml = child["Rule"];

                if (String.IsNullOrEmpty(ruleXml) || child["Disabled"] == "1")
                {
                    continue;
                }

                // parse the rule XML
                RuleList <RuleContext> rules = new RuleList <RuleContext>();
                rules.Name = child.Paths.Path;
                RuleList <RuleContext> parsed = RuleFactory.ParseRules <RuleContext>(
                    Sitecore.Context.Database,
                    ruleXml);
                rules.AddRange(parsed.Rules);

                if (rules == null || rules.Count < 1)
                {
                    continue;
                }

                // invoke the rule
                RuleContext ruleContext = new RuleContext();
                ruleContext.Item = Sitecore.Context.Item;
                rules.Run(ruleContext);

                // rule applied
                if (ruleContext.IsAborted)
                {
                    return(true);
                }
            }

            return(false);
        }
예제 #8
0
        private void Execute(XmlTextWriter output, string databaseName, string itemId, string rules)
        {
            var database = Factory.GetDatabase(databaseName);

            if (database == null)
            {
                output.WriteElementString("entry", "Database not found.");
                return;
            }

            var item = database.GetItem(itemId);

            if (item == null)
            {
                output.WriteElementString("entry", "Source item not found.");
                return;
            }

            XElement root;

            try
            {
                var doc = XDocument.Parse(rules);
                root = doc.Root;
            }
            catch
            {
                output.WriteElementString("entry", "Rules Xml is not welformed.");
                return;
            }

            if (root == null)
            {
                output.WriteElementString("entry", "There are no rules defined.");
                return;
            }

            var ruleList = RuleFactory.ParseRules <RuleContext>(database, rules);

            if (!ruleList.Rules.Any())
            {
                output.WriteElementString("entry", "There are no rules defined.");
                return;
            }

            Evaluate(output, item, root, ruleList);
        }
예제 #9
0
        /// <summary>
        /// Overrides the base class implementation and adds execution of rules to determine allowed renderings.
        /// </summary>
        protected override List <Sitecore.Data.Items.Item> GetRenderings(Sitecore.Data.Items.Item placeholderItem, out bool allowedControlsSpecified)
        {
            // Get the initial list of renderings from the base implementation.
            var list = base.GetRenderings(placeholderItem, out allowedControlsSpecified);

            // Get the rules from the placeholder item.
            string rulesXml = placeholderItem[Constants.RulesFieldId];

            if (string.IsNullOrWhiteSpace(rulesXml))
            {
                return(list);
            }

            // Parse the rules.
            var parsedRules = RuleFactory.ParseRules <PlaceholderSettingsRuleContext>(placeholderItem.Database, rulesXml);

            // Construct the context.
            PlaceholderSettingsRuleContext context = new PlaceholderSettingsRuleContext();

            context.Item = placeholderItem;
            context.AllowedRenderingItems = list;
            context.DeviceId         = DeviceId;
            context.PlaceholderKey   = PlaceholderKey;
            context.ContentDatabase  = ContentDatabase;
            context.LayoutDefinition = LayoutDefinition;

            // Execute the rules.
            RuleList <PlaceholderSettingsRuleContext> rules = new RuleList <PlaceholderSettingsRuleContext>();

            rules.Name = placeholderItem.Paths.Path;
            rules.AddRange(parsedRules.Rules);
            rules.Run(context);

            // Did the rules specify if the selection tree should be displayed?
            if (context.DisplaySelectionTree.HasValue)
            {
                allowedControlsSpecified = !context.DisplaySelectionTree.Value;
            }
            // If not, only display the tree if there are no allowed renderings.
            else
            {
                allowedControlsSpecified = context.AllowedRenderingItems.Count > 0;
            }

            // Return the list.
            return(context.AllowedRenderingItems);
        }
예제 #10
0
        protected override void BeginProcessing()
        {
            Item currentItem = InputObject.BaseObject() as Item;

            string ruleDatabaseName = RuleDatabase;

            if (!string.IsNullOrEmpty(ruleDatabaseName))
            {
                ruleDatabaseName = currentItem != null
                    ? currentItem.Database.Name
                    : ApplicationSettings.RulesDb;
            }

            Database ruleDatabase = Factory.GetDatabase(ruleDatabaseName);

            rules = RuleFactory.ParseRules <RuleContext>(ruleDatabase, Rule);
        }
예제 #11
0
        public virtual Item GetRulesBasedSnippetDataSource(Item rulesBasedSnippetSnippetItem, Item contextItem)
        {
            var rulesValue = rulesBasedSnippetSnippetItem[Templates.RulesBasedSnippetSnippet.Fields.SnippetRules];

            if (string.IsNullOrWhiteSpace(rulesValue))
            {
                return(null);
            }

            var commerceContextItem = siteContext.CurrentCatalogItem ?? contextItem;
            var rules       = RuleFactory.ParseRules <RuleContext>(contextItem.Database, XElement.Parse(rulesValue));
            var ruleContext = new RuleContext()
            {
                Item = commerceContextItem
            };

            if (rules.Rules.Any())
            {
                foreach (var rule in rules.Rules)
                {
                    if (rule.Condition != null)
                    {
                        var stack = new RuleStack();
                        rule.Condition.Evaluate(ruleContext, stack);

                        if (ruleContext.IsAborted)
                        {
                            continue;
                        }
                        if ((stack.Count != 0) && ((bool)stack.Pop()))
                        {
                            rule.Execute(ruleContext);
                            var action    = rule.Actions.FirstOrDefault();
                            var snippetId = action is SelectSnippet <RuleContext>?((SelectSnippet <RuleContext>)action)?.SnippetId : string.Empty;
                            return(!string.IsNullOrEmpty(snippetId) ? contextItem.Database.GetItem(ID.Parse(snippetId)) : null);
                        }
                    }
                    else
                    {
                        rule.Execute(ruleContext);
                    }
                }
            }

            return(null);
        }
예제 #12
0
        public static bool EvaluateRulesForView(string strRules, RuleContext ruleContext, bool failNonSpecific = false)
        {
            if (string.IsNullOrEmpty(strRules) || strRules.Length < 70)
            {
                return(!failNonSpecific);
            }
            var viewName = ruleContext.Parameters["ViewName"];

            if (failNonSpecific &&
                (!"ValidViewName".IsSubstringOf(strRules) || !$"\"{viewName}\"".IsSubstringOf(strRules)))
            {
                return(false);
            }

            var rules = RuleFactory.ParseRules <RuleContext>(Factory.GetDatabase(ApplicationSettings.RulesDb), strRules);

            return(!rules.Rules.Any() || rules.Rules.Any(rule => rule.Evaluate(ruleContext)));
        }
        protected bool ApplyDeviceRules()
        {
            // for each device
            foreach (DeviceItem device in
                     Sitecore.Context.Database.Resources.Devices.GetAll())
            {
                // for each field of the device
                foreach (Field field in device.InnerItem.Fields)
                {
                    // ignore empty fields and fields of type other than rules.
                    if (field.TypeKey != "rules" || String.IsNullOrEmpty(field.Value))
                    {
                        continue;
                    }

                    // parse the rule definition XML in the field.
                    RuleList <SetContextDeviceRuleContext> rules =
                        new RuleList <SetContextDeviceRuleContext>();
                    rules.Name = field.Item.Paths.Path;
                    RuleList <SetContextDeviceRuleContext> parsed =
                        RuleFactory.ParseRules <SetContextDeviceRuleContext>(field.Database, field.Value);
                    rules.AddRange(parsed.Rules);

                    if (rules == null || rules.Count < 1)
                    {
                        continue;
                    }

                    // invoke the rule.
                    SetContextDeviceRuleContext ruleContext = new SetContextDeviceRuleContext(
                        device);
                    rules.Run(ruleContext);

                    // rule applied.
                    if (ruleContext.IsAborted)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
예제 #14
0
        protected virtual IEnumerable <string> GetDataSoursesForLayout(Item pageItem, ID layoutFieldId)
        {
            if (pageItem == null)
            {
                return(Enumerable.Empty <string>());
            }

            var datasourses = new List <string>();

            var renderings = pageItem
                             .GetLayoutDefinition(layoutFieldId)?
                             .Devices?
                             .ToArray()?
                             .Select(x => (DeviceDefinition)x)?
                             .SelectMany(d => d.Renderings.Cast <RenderingDefinition>())?
                             .ToArray()
                             ?? new RenderingDefinition[0];

            foreach (var rendering in renderings)
            {
                datasourses.Add(rendering.Datasource);

                if (rendering.Rules != null && rendering.Rules.HasElements)
                {
                    var rules   = RuleFactory.ParseRules <ConditionalRenderingsRuleContext>(pageItem.Database, rendering.Rules);
                    var actions = rules.Rules?
                                  .SelectMany(x => x.Actions)
                                  .Select(x => x as SetDataSourceAction <ConditionalRenderingsRuleContext>)
                                  .Where(x => x != null)
                                  .ToArray();

                    foreach (var action in actions ?? Enumerable.Empty <SetDataSourceAction <ConditionalRenderingsRuleContext> >())
                    {
                        datasourses.Add(action.DataSource);
                    }
                }
            }

            return(datasourses
                   .Where(x => !string.IsNullOrWhiteSpace(x))
                   .Distinct()
                   .ToList());
        }
        public bool Evaluate(ISerializableItem item)
        {
            var scDatabase = item.Database as ScDatabase;

            if (scDatabase == null)
            {
                return(false);
            }
            if (!Enabled)
            {
                return(true);
            }
            var rules   = RuleFactory.ParseRules <SerializationRuleContext>(scDatabase.InnerDatabase, Filter);
            var context = new SerializationRuleContext {
                SerializationDefinition = this
            };

            item.InitializeSerializationRuleContext(context);
            return(rules.Rules.All(rule => rule.Evaluate(context)));
        }
예제 #16
0
        public static List <SearchRule <TContext> > ParseRules(ISitecoreService db, string p_RulesXml)
        {
            List <SearchRule <TContext> > list = new List <SearchRule <TContext> >();

            if (!string.IsNullOrEmpty(p_RulesXml))
            {
                Dictionary <string, string> dictionary = ParseRuleNames(p_RulesXml);
                foreach (Rule <TContext> rule in RuleFactory.ParseRules <TContext>(db.Database, p_RulesXml).Rules)
                {
                    if (rule.Condition != null)
                    {
                        var    p_Condition = SearchConditionFactory.GetCondition(rule.Condition);
                        string p_Id        = rule.UniqueId.ToString();
                        list.Add(new SearchRule <TContext>(p_Id, dictionary[p_Id], p_Condition, rule.Actions));
                    }
                }
            }

            return(list);
        }
예제 #17
0
        public ActionResult GetRightPanel()
        {
            var rightPanel = GetLayoutItem <RightPanel>();

            foreach (RightSection section in rightPanel.RightSections)
            {
                bool showUsingRules = true;
                if (section.InnerItem.Fields[BaseComponent.RestrictionRuleId] != null)
                {
                    string rule = section.InnerItem.Fields[BaseComponent.RestrictionRuleId].Value;
                    if (!string.IsNullOrEmpty(rule))
                    {
                        var rules       = RuleFactory.ParseRules <RuleContext>(section.InnerItem.Database, XElement.Parse(rule));
                        var ruleContext = new RuleContext()
                        {
                            Item = section.InnerItem
                        };

                        if (rule.Any() && rules.Rules.Count() > 0)
                        {
                            showUsingRules = rules.Rules.First().Evaluate(ruleContext);
                        }
                    }
                }
                section.HideSection = !showUsingRules;
                if (showUsingRules)
                {
                    BlueGreenContext bgContext = new BlueGreenContext();
                    if (bgContext != null && bgContext.bxgOwner != null && bgContext.IsAuthenticated)
                    {
                        int cartItemsQuantityCount = DBManager.GetAllCartItems(bgContext.bxgOwner.Arvact).AsEnumerable().Sum(x => x.Field <int>("Quantity"));
                        rightPanel.RewardCartItemCount = cartItemsQuantityCount;
                    }
                    else
                    {
                        rightPanel.RewardCartItemCount = 0;
                    }
                }
            }
            return(View(rightPanel));
        }
        private IEnumerable <object> GetRules(XElement rules)
        {
            if (rules == null)
            {
                return(null);
            }

            var ruleList = RuleFactory.ParseRules <RuleContext>(database, rules);
            var result   = new List <object>();

            foreach (var rule in ruleList.Rules)
            {
                result.Add(new
                {
                    name     = rule.Name,
                    uniqueId = rule.UniqueId.Guid
                });
            }

            return(result);
        }
예제 #19
0
        public bool RunRule(Item outcomeItem)
        {
            if (outcomeItem == null)
            {
                return(false);
            }

            string ruleXml = outcomeItem[RulesField];

            if (String.IsNullOrEmpty(ruleXml))
            {
                return(false);
            }

            RuleList <RuleContext> rules = new RuleList <RuleContext> {
                Name = outcomeItem.Paths.Path
            };
            RuleList <RuleContext> parsed = RuleFactory.ParseRules <RuleContext>(
                Context.Database,
                ruleXml);

            rules.AddRange(parsed.Rules);

            if (rules.Count < 1)
            {
                return(false);
            }

            RuleContext ruleContext = new RuleContext {
                Item = Context.Item
            };

            ruleContext.Parameters.Add("DefinitionItem", outcomeItem);

            rules.Run(ruleContext);
            return(ruleContext.IsAborted);
        }