From 8f13fa3ae522d6dea645645a93a7ea0e3bfcc7bc Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 27 Apr 2018 17:36:50 +0200 Subject: [PATCH] ISystemDefaultCultureProvider --- .../Implement/LanguageRepository.cs | 4 ---- .../PublishedContentCacheTests.cs | 2 +- .../Scoping/ScopedNuCacheTests.cs | 4 +++- .../TestHelpers/TestWithDatabaseBase.cs | 7 ++++++ .../TestSystemDefaultCultureProvider.cs | 9 +++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 5 ++-- .../Web/Mvc/UmbracoViewPageTests.cs | 4 +++- .../ISystemDefaultCultureProvider.cs | 13 ++++++++++ .../NuCache/PublishedSnapshotService.cs | 5 +++- .../SystemDefaultCultureProvider.cs | 24 +++++++++++++++++++ .../XmlPublishedCache/DomainCache.cs | 4 ++-- .../PublishedSnapshotService.cs | 11 ++++++--- .../XmlPublishedCache/XmlCacheComponent.cs | 1 + .../Runtime/WebRuntimeComponent.cs | 3 +++ src/Umbraco.Web/Umbraco.Web.csproj | 2 ++ 15 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 src/Umbraco.Tests/Testing/Objects/AccessorsAndProviders/TestSystemDefaultCultureProvider.cs create mode 100644 src/Umbraco.Web/PublishedCache/ISystemDefaultCultureProvider.cs create mode 100644 src/Umbraco.Web/PublishedCache/SystemDefaultCultureProvider.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs index 8e42ee460b..1ca91d8774 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs @@ -256,10 +256,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement // do NOT leak that language, it's not deep-cloned! private ILanguage GetDefault() { - // FIXME - var temp = SqlContext.Sql(); - if (temp == null) return null; - // get all cached, non-cloned var all = TypedCachePolicy.GetAllCached(PerformGetAll); diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs index 234b31d5a0..8212243e26 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs @@ -62,7 +62,7 @@ namespace Umbraco.Tests.Cache.PublishedCache _xml.LoadXml(GetXml()); var xmlStore = new XmlStore(() => _xml, null, null, null); var cacheProvider = new StaticCacheProvider(); - var domainCache = new DomainCache(ServiceContext.DomainService, ServiceContext.LocalizationService); + var domainCache = new DomainCache(ServiceContext.DomainService, SystemDefaultCultureProvider); var publishedShapshot = new Umbraco.Web.PublishedCache.XmlPublishedCache.PublishedSnapshot( new PublishedContentCache(xmlStore, domainCache, cacheProvider, globalSettings, new SiteDomainHelper(), ContentTypesCache, null, null), new PublishedMediaCache(xmlStore, ServiceContext.MediaService, ServiceContext.UserService, cacheProvider, ContentTypesCache), diff --git a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs index 06c13b2733..cc9813cdbd 100644 --- a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs @@ -90,7 +90,9 @@ namespace Umbraco.Tests.Scoping publishedSnapshotAccessor, Logger, ScopeProvider, - documentRepository, mediaRepository, memberRepository, Container.GetInstance(), new SiteDomainHelper()); + documentRepository, mediaRepository, memberRepository, + SystemDefaultCultureProvider, + Container.GetInstance(), new SiteDomainHelper()); } protected UmbracoContext GetUmbracoContextNu(string url, int templateId = 1234, RouteData routeData = null, bool setSingleton = false, IUmbracoSettingsSection umbracoSettings = null, IEnumerable urlProviders = null) diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index 070166eaff..0fcd3c9295 100644 --- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -32,6 +32,7 @@ using LightInject; using Umbraco.Core.Migrations.Install; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence.Repositories; +using Umbraco.Tests.Testing.Objects.AccessorsAndProviders; namespace Umbraco.Tests.TestHelpers { @@ -77,6 +78,7 @@ namespace Umbraco.Tests.TestHelpers Container.Register(); Container.Register(factory => PublishedSnapshotService); + Container.Register(factory => SystemDefaultCultureProvider); Container.GetInstance() .Clear() @@ -229,12 +231,16 @@ namespace Umbraco.Tests.TestHelpers } } + protected ISystemDefaultCultureProvider SystemDefaultCultureProvider { get; set; } + protected IPublishedSnapshotService PublishedSnapshotService { get; set; } protected override void Initialize() // fixme - should NOT be here! { base.Initialize(); + SystemDefaultCultureProvider = new TestSystemDefaultCultureProvider(); + CreateAndInitializeDatabase(); // ensure we have a PublishedSnapshotService @@ -264,6 +270,7 @@ namespace Umbraco.Tests.TestHelpers ScopeProvider, cache, publishedSnapshotAccessor, Container.GetInstance(), Container.GetInstance(), Container.GetInstance(), + SystemDefaultCultureProvider, Logger, Container.GetInstance(), new SiteDomainHelper(), ContentTypesCache, diff --git a/src/Umbraco.Tests/Testing/Objects/AccessorsAndProviders/TestSystemDefaultCultureProvider.cs b/src/Umbraco.Tests/Testing/Objects/AccessorsAndProviders/TestSystemDefaultCultureProvider.cs new file mode 100644 index 0000000000..f7e5484500 --- /dev/null +++ b/src/Umbraco.Tests/Testing/Objects/AccessorsAndProviders/TestSystemDefaultCultureProvider.cs @@ -0,0 +1,9 @@ +using Umbraco.Web.PublishedCache; + +namespace Umbraco.Tests.Testing.Objects.AccessorsAndProviders +{ + public class TestSystemDefaultCultureProvider : ISystemDefaultCultureProvider + { + public string DefaultCulture { get; set; } + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index eaec8a24ff..20bc181017 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -180,6 +180,7 @@ + @@ -595,9 +596,7 @@ - - - + diff --git a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs index afc461c6de..295f42fee2 100644 --- a/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs @@ -19,6 +19,7 @@ using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; +using Umbraco.Tests.Testing.Objects.AccessorsAndProviders; using Umbraco.Web; using Umbraco.Web.Models; using Umbraco.Web.Mvc; @@ -424,7 +425,8 @@ namespace Umbraco.Tests.Web.Mvc var scopeProvider = TestObjects.GetScopeProvider(Mock.Of()); var factory = Mock.Of(); _service = new PublishedSnapshotService(svcCtx, factory, scopeProvider, cache, Enumerable.Empty(), null, - null, null, null, + null, null, null, + new TestSystemDefaultCultureProvider(), Current.Logger, TestObjects.GetGlobalSettings(), new SiteDomainHelper(), null, true, false); // no events var http = GetHttpContextFactory(url, routeData).HttpContext; diff --git a/src/Umbraco.Web/PublishedCache/ISystemDefaultCultureProvider.cs b/src/Umbraco.Web/PublishedCache/ISystemDefaultCultureProvider.cs new file mode 100644 index 0000000000..022b6d3e25 --- /dev/null +++ b/src/Umbraco.Web/PublishedCache/ISystemDefaultCultureProvider.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Web.PublishedCache +{ + /// + /// Provides the system default culture. + /// + public interface ISystemDefaultCultureProvider + { + /// + /// Gets the system default culture. + /// + string DefaultCulture { get; } + } +} diff --git a/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs b/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs index 923502bea2..b498a1a42b 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/PublishedSnapshotService.cs @@ -44,6 +44,7 @@ namespace Umbraco.Web.PublishedCache.NuCache private readonly IMemberRepository _memberRepository; private readonly IGlobalSettings _globalSettings; private readonly ISiteDomainHelper _siteDomainHelper; + private readonly ISystemDefaultCultureProvider _systemDefaultCultureProvider; // volatile because we read it with no lock private volatile bool _isReady; @@ -83,6 +84,7 @@ namespace Umbraco.Web.PublishedCache.NuCache ServiceContext serviceContext, IPublishedContentTypeFactory publishedContentTypeFactory, IdkMap idkMap, IPublishedSnapshotAccessor publishedSnapshotAccessor, ILogger logger, IScopeProvider scopeProvider, IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, + ISystemDefaultCultureProvider systemDefaultCultureProvider, IGlobalSettings globalSettings, ISiteDomainHelper siteDomainHelper) : base(publishedSnapshotAccessor) { @@ -97,6 +99,7 @@ namespace Umbraco.Web.PublishedCache.NuCache _documentRepository = documentRepository; _mediaRepository = mediaRepository; _memberRepository = memberRepository; + _systemDefaultCultureProvider = systemDefaultCultureProvider; _globalSettings = globalSettings; _siteDomainHelper = siteDomainHelper; @@ -1014,7 +1017,7 @@ namespace Umbraco.Web.PublishedCache.NuCache var memberTypeCache = new PublishedContentTypeCache(null, null, _serviceContext.MemberTypeService, _publishedContentTypeFactory, _logger); - var defaultCulture = _serviceContext.LocalizationService.GetDefaultLanguageIsoCode(); // capture - fast + var defaultCulture = _systemDefaultCultureProvider.DefaultCulture; var domainCache = new DomainCache(domainSnap, defaultCulture); var domainHelper = new DomainHelper(domainCache, _siteDomainHelper); diff --git a/src/Umbraco.Web/PublishedCache/SystemDefaultCultureProvider.cs b/src/Umbraco.Web/PublishedCache/SystemDefaultCultureProvider.cs new file mode 100644 index 0000000000..6838d483b0 --- /dev/null +++ b/src/Umbraco.Web/PublishedCache/SystemDefaultCultureProvider.cs @@ -0,0 +1,24 @@ +using Umbraco.Core.Services; + +namespace Umbraco.Web.PublishedCache +{ + /// + /// Provides the default implementation of . + /// + public class SystemDefaultCultureProvider : ISystemDefaultCultureProvider + { + private readonly ILocalizationService _localizationService; + + /// + /// Initializes a new instance of the class. + /// + /// + public SystemDefaultCultureProvider(ILocalizationService localizationService) + { + _localizationService = localizationService; + } + + /// + public string DefaultCulture => _localizationService.GetDefaultLanguageIsoCode(); // capture - fast + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/DomainCache.cs b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/DomainCache.cs index 64c1d80852..9a82840024 100644 --- a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/DomainCache.cs +++ b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/DomainCache.cs @@ -11,10 +11,10 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache { private readonly IDomainService _domainService; - public DomainCache(IDomainService domainService, ILocalizationService localizationService) + public DomainCache(IDomainService domainService, ISystemDefaultCultureProvider systemDefaultCultureProvider) { _domainService = domainService; - DefaultCulture = localizationService.GetDefaultLanguageIsoCode(); // capture - fast + DefaultCulture = systemDefaultCultureProvider.DefaultCulture; } public IEnumerable GetAll(bool includeWildcards) diff --git a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedSnapshotService.cs b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedSnapshotService.cs index 1f327f4cd3..3b9a97d8cc 100644 --- a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedSnapshotService.cs +++ b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedSnapshotService.cs @@ -32,7 +32,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache private readonly IUserService _userService; private readonly ICacheProvider _requestCache; private readonly IGlobalSettings _globalSettings; - private readonly ILocalizationService _localizationService; + private readonly ISystemDefaultCultureProvider _systemDefaultCultureProvider; private readonly ISiteDomainHelper _siteDomainHelper; #region Constructors @@ -45,6 +45,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache IEnumerable segmentProviders, IPublishedSnapshotAccessor publishedSnapshotAccessor, IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, + ISystemDefaultCultureProvider systemDefaultCultureProvider, ILogger logger, IGlobalSettings globalSettings, ISiteDomainHelper siteDomainHelper, @@ -52,6 +53,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache bool testing = false, bool enableRepositoryEvents = true) : this(serviceContext, publishedContentTypeFactory, scopeProvider, requestCache, segmentProviders, publishedSnapshotAccessor, documentRepository, mediaRepository, memberRepository, + systemDefaultCultureProvider, logger, globalSettings, siteDomainHelper, null, mainDom, testing, enableRepositoryEvents) { } @@ -62,6 +64,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache ICacheProvider requestCache, IPublishedSnapshotAccessor publishedSnapshotAccessor, IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, + ISystemDefaultCultureProvider systemDefaultCultureProvider, ILogger logger, IGlobalSettings globalSettings, ISiteDomainHelper siteDomainHelper, @@ -70,6 +73,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache bool testing, bool enableRepositoryEvents) : this(serviceContext, publishedContentTypeFactory, scopeProvider, requestCache, Enumerable.Empty(), publishedSnapshotAccessor, documentRepository, mediaRepository, memberRepository, + systemDefaultCultureProvider, logger, globalSettings, siteDomainHelper, contentTypeCache, mainDom, testing, enableRepositoryEvents) { } @@ -80,6 +84,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache IEnumerable segmentProviders, IPublishedSnapshotAccessor publishedSnapshotAccessor, IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, + ISystemDefaultCultureProvider systemDefaultCultureProvider, ILogger logger, IGlobalSettings globalSettings, ISiteDomainHelper siteDomainHelper, @@ -101,7 +106,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache _memberService = serviceContext.MemberService; _mediaService = serviceContext.MediaService; _userService = serviceContext.UserService; - _localizationService = serviceContext.LocalizationService; + _systemDefaultCultureProvider = systemDefaultCultureProvider; _requestCache = requestCache; _globalSettings = globalSettings; @@ -146,7 +151,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache // the current caches, but that would mean creating an extra cache (StaticCache // probably) so better use RequestCache. - var domainCache = new DomainCache(_domainService, _localizationService); + var domainCache = new DomainCache(_domainService, _systemDefaultCultureProvider); return new PublishedSnapshot( new PublishedContentCache(_xmlStore, domainCache, _requestCache, _globalSettings, _siteDomainHelper, _contentTypeCache, _routesCache, previewToken), diff --git a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheComponent.cs b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheComponent.cs index 37f29cc1d6..c9794eb99a 100644 --- a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheComponent.cs +++ b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheComponent.cs @@ -32,6 +32,7 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), + factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), diff --git a/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs b/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs index a0c482075a..54afd0ad75 100644 --- a/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs +++ b/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs @@ -69,6 +69,9 @@ namespace Umbraco.Web.Runtime //it still needs to use the install controller so we can't do that composition.Container.RegisterFrom(); + // register the system culture provider + composition.Container.RegisterSingleton(); + var typeLoader = composition.Container.GetInstance(); var logger = composition.Container.GetInstance(); var proflog = composition.Container.GetInstance(); diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 1339166185..a39495430b 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -343,6 +343,7 @@ + @@ -387,6 +388,7 @@ +