From 34ddbbd371a0ed52765373ed4b36daf24778cd62 Mon Sep 17 00:00:00 2001 From: Skrypt Date: Sun, 14 Jun 2015 21:18:57 -0400 Subject: [PATCH] Adding lazy update of patterns. Code optimizations. Commented out the migration patterns upgrade code. --- .../Drivers/AutoroutePartDriver.cs | 26 ++++++++---- .../Modules/Orchard.Autoroute/Migrations.cs | 16 ++++---- .../Services/AutorouteService.cs | 22 ++++++++-- .../Settings/AutorouteSettings.cs | 5 ++- .../Settings/AutorouteSettingsEvents.cs | 41 ++++++++++--------- .../AutorouteSettings.cshtml | 15 +------ 6 files changed, 68 insertions(+), 57 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs index f6ccfe672..647dd7ca2 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs @@ -70,33 +70,41 @@ namespace Orchard.Autoroute.Drivers { if (settings.UseCulturePattern) { //if we are creating from a form post we use the form value for culture HttpContextBase context = _httpContextAccessor.Current(); - if (context.Request.Form["Localization.SelectedCulture"] != null) { + if (!String.IsNullOrEmpty(context.Request.Form["Localization.SelectedCulture"])) { itemCulture = context.Request.Form["Localization.SelectedCulture"].ToString(); } } //we update the settings assuming that when - //pattern culture = null it means culture = default website culture + //pattern culture = null or "" it means culture = default website culture //for patterns that we migrated - foreach (RoutePattern pattern in settings.Patterns.Where(x => String.IsNullOrEmpty(x.Culture))) { + foreach (RoutePattern pattern in settings.Patterns.Where(x => String.IsNullOrWhiteSpace(x.Culture))) { pattern.Culture = _cultureManager.GetSiteCulture(); ; } //we do the same for default patterns - foreach (DefaultPattern pattern in settings.DefaultPatterns.Where(x => String.IsNullOrEmpty(x.Culture))) { + foreach (DefaultPattern pattern in settings.DefaultPatterns.Where(x => String.IsNullOrWhiteSpace(x.Culture))) { pattern.Culture = _cultureManager.GetSiteCulture(); } // if the content type has no pattern for autoroute, then use a default one - if (!settings.Patterns.Any(x => x.Culture == itemCulture)) { - settings.AllowCustomPattern = true; - settings.AutomaticAdjustmentOnEdit = false; + if (!settings.Patterns.Any(x => String.Equals(x.Culture, itemCulture, StringComparison.OrdinalIgnoreCase))) { settings.Patterns = new List { new RoutePattern { Name = "Title", Description = "my-title", Pattern = "{Content.Slug}", Culture = itemCulture } }; } // if the content type has no defaultPattern for autoroute, then use a default one - if (!settings.DefaultPatterns.Any(x => x.Culture == itemCulture)) { - settings.DefaultPatterns = new List { new DefaultPattern { PatternIndex = "0", Culture = itemCulture } }; + if (!settings.DefaultPatterns.Any(x => String.Equals(x.Culture, itemCulture, StringComparison.OrdinalIgnoreCase))) { + //if we are in the default culture check the old setting + if (String.Equals(itemCulture, _cultureManager.GetSiteCulture(), StringComparison.OrdinalIgnoreCase)) { + if (!String.IsNullOrEmpty(part.TypePartDefinition.Settings["AutorouteSettings.DefaultPatternIndex"])) { + string patternIndex = part.TypePartDefinition.Settings["AutorouteSettings.DefaultPatternIndex"]; + settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = patternIndex, Culture = itemCulture }); + } else { + settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = "0", Culture = itemCulture }); + } + } else { + settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = "0", Culture = itemCulture }); + } } var viewModel = new AutoroutePartEditViewModel { diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Migrations.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Migrations.cs index 67d697b0e..980e47ba6 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Migrations.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Migrations.cs @@ -54,15 +54,15 @@ namespace Orchard.Autoroute { ); //we set the default pattern index from the deprecated setting - foreach (ContentTypeDefinition contentTypeDefinition in ContentDefinitionManager.ListTypeDefinitions()) { - foreach (ContentTypePartDefinition contentTypePartDefinition in contentTypeDefinition.Parts.Where(x => x.PartDefinition.Name == "AutoroutePart")) { - var settings = contentTypePartDefinition.Settings.GetModel(); - string patternIndex = contentTypePartDefinition.Settings["AutorouteSettings.DefaultPatternIndex"]; - settings.DefaultPatterns = new List { new DefaultPattern { PatternIndex = patternIndex } }; + //foreach (ContentTypeDefinition contentTypeDefinition in ContentDefinitionManager.ListTypeDefinitions()) { + // foreach (ContentTypePartDefinition contentTypePartDefinition in contentTypeDefinition.Parts.Where(x => x.PartDefinition.Name == "AutoroutePart")) { + // var settings = contentTypePartDefinition.Settings.GetModel(); + // string patternIndex = contentTypePartDefinition.Settings["AutorouteSettings.DefaultPatternIndex"]; + // settings.DefaultPatterns = new List { new DefaultPattern { PatternIndex = patternIndex } }; - ContentDefinitionManager.AlterTypeDefinition(contentTypeDefinition.Name, builder => builder.WithPart("AutoroutePart", settings.Build)); - } - } + // ContentDefinitionManager.AlterTypeDefinition(contentTypeDefinition.Name, builder => builder.WithPart("AutoroutePart", settings.Build)); + // } + //} return 4; } diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs index b2aee69bd..13c102dbe 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Services/AutorouteService.cs @@ -69,7 +69,7 @@ namespace Orchard.Autoroute.Services { if (settings.UseCulturePattern) { //if we are creating from a form post we use the form value for culture HttpContextBase context = _httpContextAccessor.Current(); - if (context.Request.Form["Localization.SelectedCulture"] != null) { + if (!String.IsNullOrEmpty(context.Request.Form["Localization.SelectedCulture"])) { itemCulture = context.Request.Form["Localization.SelectedCulture"].ToString(); } } @@ -139,13 +139,27 @@ namespace Orchard.Autoroute.Services { public RoutePattern GetDefaultPattern(string contentType, string culture) { var settings = GetTypePartSettings(contentType).GetModel(); + if (!settings.DefaultPatterns.Any(x => String.Equals(x.Culture, culture, StringComparison.OrdinalIgnoreCase))) { + ContentTypeDefinition definition = _contentDefinitionManager.GetTypeDefinition(contentType); + var patternIndex = definition.Parts.Where(x => x.PartDefinition.Name == "AutoroutePart").FirstOrDefault().Settings["AutorouteSettings.DefaultPatternIndex"]; + //lazy updating from old setting + if (String.Equals(culture, _cultureManager.GetSiteCulture(), StringComparison.OrdinalIgnoreCase) && !String.IsNullOrWhiteSpace(patternIndex)) { + settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = patternIndex, Culture = culture }); + return settings.Patterns.Where(x => x.Culture == null).ElementAt(Convert.ToInt32(settings.DefaultPatterns.Where(x => x.Culture == culture).FirstOrDefault().PatternIndex)); + } else { + settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = "0", Culture = culture }); + return new RoutePattern { Name = "Title", Description = "my-title", Pattern = "{Content.Slug}", Culture = culture }; + } + } + // return a default pattern if set - var patternCultureSearch = settings.Patterns.Any(x => x.Culture == culture) ? culture : null; - var defaultPatternCultureSearch = settings.DefaultPatterns.Any(x => x.Culture == culture) ? culture : null; + var patternCultureSearch = settings.Patterns.Any(x => String.Equals(x.Culture, culture, StringComparison.OrdinalIgnoreCase)) ? culture : null; + var defaultPatternCultureSearch = settings.DefaultPatterns.Any(x => String.Equals(x.Culture, culture, StringComparison.OrdinalIgnoreCase)) ? culture : null; + if (settings.Patterns.Any()) { if (settings.Patterns.Where(x => x.Culture == patternCultureSearch).ElementAt(Convert.ToInt32(settings.DefaultPatterns.Where(x => x.Culture == defaultPatternCultureSearch).FirstOrDefault().PatternIndex)) != null) { return settings.Patterns.Where(x => x.Culture == patternCultureSearch).ElementAt(Convert.ToInt32(settings.DefaultPatterns.Where(x => x.Culture == defaultPatternCultureSearch).FirstOrDefault().PatternIndex)); - } + }; } // return a default pattern if none is defined diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Settings/AutorouteSettings.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Settings/AutorouteSettings.cs index c0f7314e6..b3263425e 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Settings/AutorouteSettings.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Settings/AutorouteSettings.cs @@ -3,6 +3,7 @@ using System.Globalization; using System.Linq; using Orchard.ContentManagement.MetaData.Builders; using Orchard.Services; +using System; namespace Orchard.Autoroute.Settings { @@ -65,7 +66,7 @@ namespace Orchard.Autoroute.Settings { //We split the values from the radio button returned values int i = 0; foreach (DefaultPattern defaultPattern in _defaultPatterns) { - if (defaultPattern.Culture != null) { + if (!String.IsNullOrWhiteSpace(defaultPattern.Culture)) { if (defaultPattern.Culture.Split('|').Count() > 1) { _defaultPatterns[i].PatternIndex = defaultPattern.Culture.Split('|').Last(); _defaultPatterns[i].Culture = defaultPattern.Culture.Split('|').First(); @@ -82,7 +83,7 @@ namespace Orchard.Autoroute.Settings { //We split the values from the radio button returned values int i = 0; foreach (DefaultPattern defaultPattern in _defaultPatterns) { - if (defaultPattern.Culture != null) { + if (!String.IsNullOrWhiteSpace(defaultPattern.Culture)) { if (defaultPattern.Culture.Split('|').Count() > 1) { _defaultPatterns[i].PatternIndex = defaultPattern.Culture.Split('|').Last(); _defaultPatterns[i].Culture = defaultPattern.Culture.Split('|').First(); diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Settings/AutorouteSettingsEvents.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Settings/AutorouteSettingsEvents.cs index 18a970916..609cf7b09 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Settings/AutorouteSettingsEvents.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Settings/AutorouteSettingsEvents.cs @@ -33,10 +33,9 @@ namespace Orchard.Autoroute.Settings { //get default site culture settings.DefaultSiteCulture = _cultureManager.GetSiteCulture(); - //if a culture is not set on the token we set it to the default site culture for backward compatibility - //NOT SURE ABOUT THIS - if (!settings.Patterns.Any(x => x.Culture == settings.DefaultSiteCulture)) { - foreach (RoutePattern pattern in settings.Patterns.Where(x => x.Culture == null)) { + //if a culture is not set on the pattern we set it to the default site culture for backward compatibility + if (!settings.Patterns.Any(x => String.Equals(x.Culture, settings.DefaultSiteCulture, StringComparison.OrdinalIgnoreCase))) { + foreach (RoutePattern pattern in settings.Patterns.Where(x => String.IsNullOrWhiteSpace(x.Culture))) { settings.Patterns.Where(x => x.GetHashCode() == pattern.GetHashCode()).FirstOrDefault().Culture = settings.DefaultSiteCulture; } } @@ -45,8 +44,8 @@ namespace Orchard.Autoroute.Settings { List newPatterns = new List(); int current = 0; foreach (string culture in settings.SiteCultures) { - foreach (RoutePattern routePattern in settings.Patterns.Where(x => x.Culture == culture)) { - if (settings.Patterns.Any(x => x.Culture == culture)) { + foreach (RoutePattern routePattern in settings.Patterns.Where(x => String.Equals(x.Culture, culture, StringComparison.OrdinalIgnoreCase))) { + if (settings.Patterns.Any(x => String.Equals(x.Culture, culture, StringComparison.OrdinalIgnoreCase))) { newPatterns.Add(settings.Patterns[current]); } else { newPatterns.Add(new RoutePattern { @@ -60,24 +59,26 @@ namespace Orchard.Autoroute.Settings { } //We add a pattern for each culture if there is none - if (!settings.Patterns.Where(x => x.Culture == culture).Any()) { - //We add the default pattern from migrations - if (settings.Patterns.Where(x => String.IsNullOrEmpty(x.Culture)).Any()) { - //we add the RoutePattern and we set the culture since there is none defined - RoutePattern migrationRoutePattern = settings.Patterns.Where(x => String.IsNullOrEmpty(x.Culture)).First(); - newPatterns.Add(new RoutePattern { Culture = culture, Name = migrationRoutePattern.Name, Description = migrationRoutePattern.Description, Pattern = migrationRoutePattern.Pattern }); - } else { - //we add the default pattern for custom content types or modules that don't define it in their migration - newPatterns.Add(new RoutePattern { Culture = culture, Name = "Title", Description = "my-title", Pattern = "{Content.Slug}" }); - } + if (!settings.Patterns.Where(x => String.Equals(x.Culture, culture, StringComparison.OrdinalIgnoreCase)).Any()) { + newPatterns.Add(new RoutePattern { Culture = culture, Name = "Title", Description = "my-title", Pattern = "{Content.Slug}" }); } //we add a new empty line for each culture newPatterns.Add(new RoutePattern { Culture = culture, Name = null, Description = null, Pattern = null }); - // if the content type has no defaultPattern for autoroute, then assign a the first one we just created - if (!settings.DefaultPatterns.Any(x => x.Culture == culture)) { - settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = "0", Culture = culture }); + // if the content type has no defaultPattern for autoroute, then assign one + if (!settings.DefaultPatterns.Any(x => String.Equals(x.Culture, culture, StringComparison.OrdinalIgnoreCase))) { + //if we are in the default culture check the old setting + if (String.Equals(culture, _cultureManager.GetSiteCulture(), StringComparison.OrdinalIgnoreCase)) { + if (!String.IsNullOrEmpty(definition.Settings["AutorouteSettings.DefaultPatternIndex"])) { + string patternIndex = definition.Settings["AutorouteSettings.DefaultPatternIndex"]; + settings.DefaultPatterns.Add(new DefaultPattern { Culture = settings.DefaultSiteCulture, PatternIndex = patternIndex }); + } else { + settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = "0", Culture = culture }); + } + } else { + settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = "0", Culture = culture }); + } } } @@ -108,7 +109,7 @@ namespace Orchard.Autoroute.Settings { int current = 0; foreach (string culture in settings.SiteCultures) { if (settings.Patterns.Any(x => String.Equals(x.Culture, culture, StringComparison.OrdinalIgnoreCase))) { - foreach (RoutePattern routePattern in settings.Patterns.Where(x => x.Culture == culture)) { + foreach (RoutePattern routePattern in settings.Patterns.Where(x => String.Equals(x.Culture, culture, StringComparison.OrdinalIgnoreCase))) { newPatterns.Add(settings.Patterns[current]); current++; } diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Views/DefinitionTemplates/AutorouteSettings.cshtml b/src/Orchard.Web/Modules/Orchard.Autoroute/Views/DefinitionTemplates/AutorouteSettings.cshtml index 31d91df92..3235d2498 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Views/DefinitionTemplates/AutorouteSettings.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Views/DefinitionTemplates/AutorouteSettings.cshtml @@ -6,7 +6,6 @@ Style.Require("AutorouteSettings"); int patternCount = 0; int patternCultureCount = 0; - int cultureCount = 0; }
@@ -64,7 +63,7 @@ @for (int index = 0; index < Model.Patterns.Where(x => x.Culture == culture).Count(); index++) { - @Html.RadioButtonFor(m => m.DefaultPatterns[cultureCount].Culture, culture + "|" + patternCultureCount, patternCultureCount.ToString() == Model.DefaultPatterns[cultureCount].PatternIndex ? new { @checked = "checked" } : null) + @Html.RadioButtonFor(m => m.DefaultPatterns[Model.SiteCultures.IndexOf(culture)].Culture, culture + "|" + patternCultureCount, patternCultureCount.ToString() == Model.DefaultPatterns[Model.SiteCultures.IndexOf(culture)].PatternIndex ? new { @checked = "checked" } : null) @Html.TextBoxFor(m => m.Patterns[patternCount].Name, new { @class = "text" }) @Html.TextBoxFor(m => m.Patterns[patternCount].Pattern, new { @class = "tokenized text" }) @Html.TextBoxFor(m => m.Patterns[patternCount].Description, new { @class = "text" }) @@ -76,20 +75,8 @@
- cultureCount++; } - - - - - - - - - - - @Display.TokenHint()