Beispiel #1
0
        public static List <OpenContentUrlRule> GetRules(int portalId)
        {
            object padlock = new object();

            lock (padlock)
            {
                List <OpenContentUrlRule> rules = new List <OpenContentUrlRule>();
//#if DEBUG
//                decimal speed;
//                string mess;
//                var stopwatch = new System.Diagnostics.Stopwatch();
//                stopwatch.Start();
//#endif
                var purgeResult    = UrlRulesCaching.PurgeExpiredItems(portalId);
                var portalCacheKey = UrlRulesCaching.GeneratePortalCacheKey(portalId, null);
                var portalRules    = UrlRulesCaching.GetCache(portalId, portalCacheKey, purgeResult.ValidCacheItems);
                if (portalRules != null && portalRules.Count > 0)
                {
//#if DEBUG
//                    stopwatch.Stop();
//                    speed = stopwatch.Elapsed.Milliseconds;
//                    mess = $"PortalId: {portalId}. Time elapsed: {stopwatch.Elapsed.Milliseconds}ms. All Cached. PurgedItems: {purgeResult.PurgedItemCount}. Speed: {speed}";
//                    Log.Logger.Error(mess);
//#endif
                    return(portalRules);
                }

                Dictionary <string, Locale> dicLocales = LocaleController.Instance.GetLocales(portalId);
                var modules = DnnUtils.GetDnnOpenContentModules(portalId).ToList();

                var cachedModules = 0;
                var nonCached     = 0;

                foreach (var module in modules)
                {
                    try
                    {
                        if (module.IsListMode() && module.Settings.Template.Detail != null &&
                            ((!module.Settings.IsOtherModule && module.Settings.DetailTabId <= 0) ||
                             (module.Settings.DetailTabId == module.TabId)
                            )
                            )
                        {
                            var dsContext = OpenContentUtils.CreateDataContext(module);
                            dsContext.Agent = "OpenContentUrlProvider.GetRules()";

                            var cacheKey = UrlRulesCaching.GenerateModuleCacheKey(module.TabId, module.ModuleId, dsContext.ModuleId, null);
                            List <OpenContentUrlRule> moduleRules = UrlRulesCaching.GetCache(portalId, cacheKey, purgeResult.ValidCacheItems);
                            if (moduleRules != null && moduleRules.Count > 0)
                            {
                                rules.AddRange(moduleRules);
                                cachedModules += 1;
                                continue;
                            }
                            nonCached  += 1;
                            moduleRules = new List <OpenContentUrlRule>();
                            IDataSource ds       = DataSourceManager.GetDataSource(module.Settings.Manifest.DataSource);
                            var         dataList = ds.GetAll(dsContext, null).Items.ToList();
                            if (dataList.Count() > 1000)
                            {
                                Log.Logger.Warn($"Module {module.DataModule.ModuleID} (portal/tab {module.DataModule.PortalID}/{module.DataModule.TabID}) has >1000 items. We are not making sluggs for them as this would be too inefficient");
                                continue;
                            }
                            var physicalTemplateFolder = module.Settings.TemplateDir.PhysicalFullDirectory + "\\";
                            HandlebarsEngine hbEngine  = new HandlebarsEngine();
                            if (!string.IsNullOrEmpty(module.Settings.Manifest.DetailUrl))
                            {
                                hbEngine.Compile(module.Settings.Manifest.DetailUrl);
                            }
                            foreach (KeyValuePair <string, Locale> key in dicLocales)
                            {
                                string cultureCode      = key.Value.Code;
                                string ruleCultureCode  = (dicLocales.Count > 1 ? cultureCode : null);
                                ModelFactoryMultiple mf = new ModelFactoryMultiple(dataList, module.Settings.Data, physicalTemplateFolder, module.Settings.Template.Manifest, module.Settings.Template, module.Settings.Template.Main, module, portalId, cultureCode);
                                //dynamic model = mf.GetModelAsDynamic(true);
                                //dynamic items = model.Items;
                                IEnumerable <Dictionary <string, object> > items = mf.GetModelAsDictionaryList();
                                //Log.Logger.Debug("OCUR/" + PortalId + "/" + module.TabID + "/" + MainTabId + "/" + module.ModuleID + "/" + MainModuleId + "/" + CultureCode + "/" + dataList.Count() + "/" + module.ModuleTitle);
                                //foreach (IDataItem content in dataList)
                                foreach (Dictionary <string, object> content in items)
                                {
                                    string id  = (content["Context"] as Dictionary <string, object>)["Id"].ToString();
                                    string url = "content-" + id;
                                    if (!string.IsNullOrEmpty(module.Settings.Manifest.DetailUrl))
                                    {
                                        try
                                        {
                                            //ModelFactory mf = new ModelFactory(content, settings.Data, physicalTemplateFolder, settings.Template.Manifest, settings.Template, settings.Template.Main, module, PortalId, CultureCode, MainTabId, MainModuleId);
                                            //dynamic model = mf.GetModelAsDynamic(true);
                                            url = hbEngine.Execute(content);
                                            url = HttpUtility.HtmlDecode(url).CleanupUrl();
                                        }
                                        catch (Exception ex)
                                        {
                                            Log.Logger.Error("Failed to generate url for opencontent item " + id, ex);
                                        }
                                    }

                                    if (!string.IsNullOrEmpty(url))
                                    {
                                        var rule = new OpenContentUrlRule
                                        {
                                            CultureCode = ruleCultureCode,
                                            TabId       = module.GetDetailTabId(),
                                            Parameters  = "id=" + id,
                                            Url         = url
                                        };
                                        var  reducedRules = rules.Where(r => r.CultureCode == rule.CultureCode && r.TabId == rule.TabId).ToList();
                                        bool ruleExist    = reducedRules.Any(r => r.Parameters == rule.Parameters);
                                        if (!ruleExist)
                                        {
                                            if (reducedRules.Any(r => r.Url == rule.Url))
                                            {
                                                rule.Url = id + "-" + url;
                                            }
                                            rules.Add(rule);
                                            moduleRules.Add(rule);
                                        }
                                    }
                                }
                            }
                            UrlRulesCaching.SetCache(portalId, UrlRulesCaching.GenerateModuleCacheKey(module.TabId, module.ModuleId, dsContext.ModuleId, null), new TimeSpan(1, 0, 0, 0), moduleRules);
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Logger.Error("Failed to generate url for opencontent module " + module.ViewModule.ModuleID, ex);
                    }
                }
                UrlRulesCaching.SetCache(portalId, portalCacheKey, new TimeSpan(1, 0, 0, 0), rules);
//#if DEBUG
//                stopwatch.Stop();
//                speed = (cachedModules + nonCached) == 0 ? -1 : stopwatch.Elapsed.Milliseconds / (cachedModules + nonCached);
//                mess = $"PortalId: {portalId}. Time elapsed: {stopwatch.Elapsed.Milliseconds}ms. Module Count: {modules.Count()}. Relevant Modules: {cachedModules + nonCached}. CachedModules: {cachedModules}. PurgedItems: {purgeResult.PurgedItemCount}. Speed: {speed}";
//                Log.Logger.Error(mess);
//                Console.WriteLine(mess);
//#endif
                return(rules);
            }
        }
        public static List <OpenContentUrlRule> GetRules(int portalId)
        {
            Dictionary <string, Locale> dicLocales = LocaleController.Instance.GetLocales(portalId);
            List <OpenContentUrlRule>   Rules      = new List <OpenContentUrlRule>();
            OpenContentController       occ        = new OpenContentController();
            ModuleController            mc         = new ModuleController();
            ArrayList modules = mc.GetModulesByDefinition(portalId, AppConfig.OPENCONTENT);

            //foreach (ModuleInfo module in modules.OfType<ModuleInfo>().GroupBy(m => m.ModuleID).Select(g => g.First())){
            foreach (ModuleInfo module in modules.OfType <ModuleInfo>())
            {
                try
                {
                    OpenContentSettings settings = new OpenContentSettings(module.ModuleSettings);
                    int mainTabId    = settings.GetMainTabId(module.TabID);
                    int mainModuleId = settings.GetModuleId(module.ModuleID);
                    if (settings.IsListTemplate() && (!settings.IsOtherModule || settings.DetailTabId > 0))
                    {
                        var ds        = DataSourceManager.GetDataSource(settings.Manifest.DataSource);
                        var dsContext = new DataSourceContext()
                        {
                            ModuleId       = mainModuleId,
                            TemplateFolder = settings.TemplateDir.FolderPath,
                            Config         = settings.Manifest.DataSourceConfig,
                            Agent          = "OpenContentUrlProvider.GetRules()"
                        };
                        IEnumerable <IDataItem> dataList = new List <IDataItem>();
                        dataList = ds.GetAll(dsContext, null).Items;
                        if (dataList.Count() > 1000)
                        {
                            continue;
                        }
                        var physicalTemplateFolder = settings.TemplateDir.PhysicalFullDirectory + "\\";
                        HandlebarsEngine hbEngine  = new HandlebarsEngine();
                        if (!string.IsNullOrEmpty(settings.Manifest.DetailUrl))
                        {
                            hbEngine.Compile(settings.Manifest.DetailUrl);
                        }
                        foreach (KeyValuePair <string, Locale> key in dicLocales)
                        {
                            string       cultureCode     = key.Value.Code;
                            string       ruleCultureCode = (dicLocales.Count > 1 ? cultureCode : null);
                            ModelFactory mf = new ModelFactory(dataList, settings.Data, physicalTemplateFolder, settings.Template.Manifest, settings.Template, settings.Template.Main, module, portalId, cultureCode, mainTabId, mainModuleId);
                            //dynamic model = mf.GetModelAsDynamic(true);
                            //dynamic items = model.Items;
                            IEnumerable <dynamic> items = mf.GetModelAsDynamicList();
                            //Log.Logger.Debug("OCUR/" + PortalId + "/" + module.TabID + "/" + MainTabId + "/" + module.ModuleID + "/" + MainModuleId + "/" + CultureCode + "/" + dataList.Count() + "/" + module.ModuleTitle);
                            //foreach (IDataItem content in dataList)
                            foreach (dynamic content in items)
                            {
                                string id  = content.Context.Id;
                                string url = "content-" + id;
                                if (!string.IsNullOrEmpty(settings.Manifest.DetailUrl))
                                {
                                    try
                                    {
                                        //ModelFactory mf = new ModelFactory(content, settings.Data, physicalTemplateFolder, settings.Template.Manifest, settings.Template, settings.Template.Main, module, PortalId, CultureCode, MainTabId, MainModuleId);
                                        //dynamic model = mf.GetModelAsDynamic(true);
                                        url = hbEngine.Execute(content);
                                        url = HttpUtility.HtmlDecode(url);
                                        //title = OpenContentUtils.CleanupUrl(dyn.Title);
                                    }
                                    catch (Exception ex)
                                    {
                                        Log.Logger.Error("Failed to generate url for opencontent item " + content.Id, ex);
                                    }
                                }

                                if (!string.IsNullOrEmpty(url))
                                {
                                    var rule = new OpenContentUrlRule
                                    {
                                        CultureCode = ruleCultureCode,
                                        TabId       = mainTabId,
                                        Parameters  = "id=" + id,
                                        Url         = url
                                    };
                                    var  reducedRules = Rules.Where(r => r.CultureCode == rule.CultureCode && r.TabId == rule.TabId);
                                    bool ruleExist    = reducedRules.Any(r => r.Parameters == rule.Parameters);
                                    if (!ruleExist)
                                    {
                                        if (reducedRules.Any(r => r.Url == rule.Url))
                                        {
                                            rule.Url = id + "-" + url;
                                        }
                                        Rules.Add(rule);
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Logger.Error("Failed to generate url for opencontent module " + module.ModuleID, ex);
                }
            }
            return(Rules);
        }