From 890d7d8ce32e1e527294b215d66a195c1d1fc8bf Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 16 Apr 2019 16:25:10 +0200 Subject: [PATCH] Refactor IPublishedContent.Name() --- .../PublishedContent/IPublishedContent.cs | 8 +-- .../PublishedContentWrapped.cs | 2 +- .../PublishedContent/PublishedCultureInfos.cs | 2 +- .../PublishedMediaCacheTests.cs | 2 +- .../DictionaryPublishedContent.cs | 2 +- .../XmlPublishedContent.cs | 9 +-- .../Published/NestedContentTests.cs | 2 +- .../PublishedContent/NuCacheTests.cs | 20 +++---- .../PublishedContentDataTableTests.cs | 7 ++- .../PublishedContentLanguageVariantTests.cs | 6 +- .../PublishedContentMoreTests.cs | 59 ++++++++++--------- .../PublishedContent/PublishedMediaTests.cs | 2 +- .../PublishedContent/PublishedRouterTests.cs | 2 +- .../SolidPublishedSnapshot.cs | 7 ++- src/Umbraco.Tests/Runtimes/StandaloneTests.cs | 6 +- .../Scoping/ScopedNuCacheTests.cs | 6 +- .../TestHelpers/Stubs/TestPublishedContent.cs | 5 +- .../Editors/TemplateQueryController.cs | 10 ++-- .../PublishedContentHashtableConverter.cs | 6 +- .../Models/PublishedContentBase.cs | 2 +- .../NuCache/Navigable/NavigableContent.cs | 2 +- .../NuCache/PublishedContent.cs | 19 +++--- .../PublishedCache/PublishedMember.cs | 6 +- src/Umbraco.Web/PublishedContentExtensions.cs | 2 +- .../Routing/UrlProviderExtensions.cs | 2 +- 25 files changed, 102 insertions(+), 94 deletions(-) diff --git a/src/Umbraco.Core/Models/PublishedContent/IPublishedContent.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedContent.cs index d38c8eb721..95b943d751 100644 --- a/src/Umbraco.Core/Models/PublishedContent/IPublishedContent.cs +++ b/src/Umbraco.Core/Models/PublishedContent/IPublishedContent.cs @@ -29,11 +29,9 @@ namespace Umbraco.Core.Models.PublishedContent /// /// Gets the name of the content item. /// - /// - /// The value of this property is contextual. When the content type is multi-lingual, - /// this is the name for the 'current' culture. Otherwise, it is the invariant name. - /// - string Name { get; } + /// The specific culture to filter for. If null is used the current culture is used. (Default is null) + /// The name of the content. + string Name(string culture = null); /// /// Gets the url segment of the content item. diff --git a/src/Umbraco.Core/Models/PublishedContent/PublishedContentWrapped.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedContentWrapped.cs index 7f3f38f629..753f75c3cb 100644 --- a/src/Umbraco.Core/Models/PublishedContent/PublishedContentWrapped.cs +++ b/src/Umbraco.Core/Models/PublishedContent/PublishedContentWrapped.cs @@ -58,7 +58,7 @@ namespace Umbraco.Core.Models.PublishedContent public virtual int Id => _content.Id; /// - public virtual string Name => _content.Name; + public virtual string Name(string culture = null) => _content.Name(culture); /// public virtual string UrlSegment => _content.UrlSegment; diff --git a/src/Umbraco.Core/Models/PublishedContent/PublishedCultureInfos.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedCultureInfos.cs index 749b37a41a..9c5977e8a6 100644 --- a/src/Umbraco.Core/Models/PublishedContent/PublishedCultureInfos.cs +++ b/src/Umbraco.Core/Models/PublishedContent/PublishedCultureInfos.cs @@ -30,7 +30,7 @@ namespace Umbraco.Core.Models.PublishedContent /// /// Gets the name of the item. /// - public string Name { get; } + internal string Name { get; } /// /// Gets the url segment of the item. diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs index 08eeb8ef4d..8dd5cf3890 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs @@ -108,7 +108,7 @@ namespace Umbraco.Tests.Cache.PublishedCache Assert.AreEqual(mRoot.ContentType.Alias, publishedMedia.ContentType.Alias); Assert.AreEqual(mRoot.ContentType.Id, publishedMedia.ContentType.Id); Assert.AreEqual(mRoot.Level, publishedMedia.Level); - Assert.AreEqual(mRoot.Name, publishedMedia.Name); + Assert.AreEqual(mRoot.Name, publishedMedia.Name()); Assert.AreEqual(mRoot.Path, publishedMedia.Path); Assert.AreEqual(mRoot.SortOrder, publishedMedia.SortOrder); Assert.IsNull(publishedMedia.Parent); diff --git a/src/Umbraco.Tests/LegacyXmlPublishedCache/DictionaryPublishedContent.cs b/src/Umbraco.Tests/LegacyXmlPublishedCache/DictionaryPublishedContent.cs index e472de85dd..c6c16a2466 100644 --- a/src/Umbraco.Tests/LegacyXmlPublishedCache/DictionaryPublishedContent.cs +++ b/src/Umbraco.Tests/LegacyXmlPublishedCache/DictionaryPublishedContent.cs @@ -156,7 +156,7 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache public override int SortOrder => _sortOrder; - public override string Name => _name; + public override string Name(string culture = null) => _name; public override PublishedCultureInfo GetCulture(string culture = null) => null; diff --git a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs index 43c47ec569..c547512ba8 100644 --- a/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs +++ b/src/Umbraco.Tests/LegacyXmlPublishedCache/XmlPublishedContent.cs @@ -138,13 +138,10 @@ namespace Umbraco.Tests.LegacyXmlPublishedCache } } - public override string Name + public override string Name(string culture = null) { - get - { - EnsureNodeInitialized(); - return _name; - } + EnsureNodeInitialized(); + return _name; } public override PublishedCultureInfo GetCulture(string culture = null) => null; diff --git a/src/Umbraco.Tests/Published/NestedContentTests.cs b/src/Umbraco.Tests/Published/NestedContentTests.cs index 09c63dcf06..35288c1f75 100644 --- a/src/Umbraco.Tests/Published/NestedContentTests.cs +++ b/src/Umbraco.Tests/Published/NestedContentTests.cs @@ -284,7 +284,7 @@ namespace Umbraco.Tests.Published public override int Id { get; } public override int? TemplateId { get; } public override int SortOrder { get; } - public override string Name { get; } + public override string Name(string culture = null) => default; public override PublishedCultureInfo GetCulture(string culture = ".") => throw new NotSupportedException(); public override IReadOnlyDictionary Cultures => throw new NotSupportedException(); public override string UrlSegment { get; } diff --git a/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs b/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs index ad2b0220bb..89c2458f18 100644 --- a/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs +++ b/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs @@ -202,35 +202,33 @@ namespace Umbraco.Tests.PublishedContent var publishedContent = snapshot.Content.GetById(1); Assert.IsNotNull(publishedContent); - Assert.AreEqual("It Works1!", publishedContent.Name); Assert.AreEqual("val1", publishedContent.Value("prop")); Assert.AreEqual("val-fr1", publishedContent.Value("prop", "fr-FR")); Assert.AreEqual("val-uk1", publishedContent.Value("prop", "en-UK")); - Assert.AreEqual("name-fr1", publishedContent.GetCulture("fr-FR").Name); - Assert.AreEqual("name-uk1", publishedContent.GetCulture("en-UK").Name); + Assert.IsNull(publishedContent.Name()); // no invariant name for varying content + Assert.AreEqual("name-fr1", publishedContent.Name("fr-FR")); + Assert.AreEqual("name-uk1", publishedContent.Name("en-UK")); var draftContent = snapshot.Content.GetById(true, 1); - Assert.AreEqual("It Works2!", draftContent.Name); Assert.AreEqual("val2", draftContent.Value("prop")); Assert.AreEqual("val-fr2", draftContent.Value("prop", "fr-FR")); Assert.AreEqual("val-uk2", draftContent.Value("prop", "en-UK")); - Assert.AreEqual("name-fr2", draftContent.GetCulture("fr-FR").Name); - Assert.AreEqual("name-uk2", draftContent.GetCulture("en-UK").Name); + Assert.IsNull(draftContent.Name()); // no invariant name for varying content + Assert.AreEqual("name-fr2", draftContent.Name("fr-FR")); + Assert.AreEqual("name-uk2", draftContent.Name("en-UK")); // now french is default _variationAccesor.VariationContext = new VariationContext("fr-FR"); Assert.AreEqual("val-fr1", publishedContent.Value("prop")); - Assert.AreEqual("name-fr1", publishedContent.GetCulture().Name); - Assert.AreEqual("name-fr1", publishedContent.Name); + Assert.AreEqual("name-fr1", publishedContent.Name()); Assert.AreEqual(new DateTime(2018, 01, 01, 01, 00, 00), publishedContent.GetCulture().Date); // now uk is default _variationAccesor.VariationContext = new VariationContext("en-UK"); Assert.AreEqual("val-uk1", publishedContent.Value("prop")); - Assert.AreEqual("name-uk1", publishedContent.GetCulture().Name); - Assert.AreEqual("name-uk1", publishedContent.Name); + Assert.AreEqual("name-uk1", publishedContent.Name()); Assert.AreEqual(new DateTime(2018, 01, 02, 01, 00, 00), publishedContent.GetCulture().Date); // invariant needs to be retrieved explicitly, when it's not default @@ -251,7 +249,7 @@ namespace Umbraco.Tests.PublishedContent Assert.AreEqual(ContentVariation.Nothing, againContent.ContentType.GetPropertyType("prop").Variations); // now, "no culture" means "invariant" - Assert.AreEqual("It Works1!", againContent.Name); + Assert.IsNull(againContent.Name()); // no invariant name for varying content Assert.AreEqual("val1", againContent.Value("prop")); } diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs index 74b9619845..220909e237 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentDataTableTests.cs @@ -140,7 +140,6 @@ namespace Umbraco.Tests.PublishedContent UpdateDate = DateTime.Now, Path = "-1,3", UrlSegment = "home-page", - Name = "Page" + Guid.NewGuid().ToString(), Version = Guid.NewGuid(), WriterId = 1, WriterName = "Shannon", @@ -148,6 +147,7 @@ namespace Umbraco.Tests.PublishedContent Level = 1, Children = new List() }; + d.SetName("Page" + Guid.NewGuid()); d.Properties = new Collection(new List { new RawValueProperty(factory.CreatePropertyType("property1", 1), d, "value" + indexVals), @@ -183,6 +183,8 @@ namespace Umbraco.Tests.PublishedContent // l8tr... private class TestPublishedContent : IPublishedContent { + private readonly Dictionary _names = new Dictionary(); + public string Url { get; set; } public string GetUrl(string culture = null) => throw new NotSupportedException(); @@ -203,7 +205,8 @@ namespace Umbraco.Tests.PublishedContent public Guid Key { get; set; } public int? TemplateId { get; set; } public int SortOrder { get; set; } - public string Name { get; set; } + public string Name(string culture = null) => _names.TryGetValue(culture ?? "", out var name) ? name : null; + public void SetName(string name, string culture = null) => _names[culture ?? ""] = name; public PublishedCultureInfo GetCulture(string culture = null) => throw new NotSupportedException(); public IReadOnlyDictionary Cultures => throw new NotSupportedException(); public string UrlSegment { get; set; } diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentLanguageVariantTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentLanguageVariantTests.cs index 5c28b98de7..9cec962a38 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentLanguageVariantTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentLanguageVariantTests.cs @@ -122,7 +122,6 @@ namespace Umbraco.Tests.PublishedContent { Id = 1, SortOrder = 0, - Name = "Content 1", UrlSegment = "content-1", Path = "/1", Level = 1, @@ -134,12 +133,12 @@ namespace Umbraco.Tests.PublishedContent prop1, prop2, noprop } }; + item1.SetName("Content 1"); var item2 = new SolidPublishedContent(contentType1) { Id = 2, SortOrder = 0, - Name = "Content 2", UrlSegment = "content-2", Path = "/1/2", Level = 2, @@ -151,6 +150,7 @@ namespace Umbraco.Tests.PublishedContent prop3 } }; + item2.SetName("Content 2"); var prop4 = new SolidPublishedPropertyWithLanguageVariants { @@ -164,7 +164,6 @@ namespace Umbraco.Tests.PublishedContent { Id = 3, SortOrder = 0, - Name = "Content 3", UrlSegment = "content-3", Path = "/1/2/3", Level = 3, @@ -176,6 +175,7 @@ namespace Umbraco.Tests.PublishedContent prop4 } }; + item3.SetName("Content 3"); item1.Children = new List { item2 }; item2.Parent = item1; diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs index 48ad4aa464..ffe88f5d13 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentMoreTests.cs @@ -25,11 +25,10 @@ namespace Umbraco.Tests.PublishedContent var contentType2 = factory.CreateContentType(2, "ContentType2", Enumerable.Empty(), CreatePropertyTypes); var contentType2Sub = factory.CreateContentType(3, "ContentType2Sub", Enumerable.Empty(), CreatePropertyTypes); - cache.Add(new SolidPublishedContent(contentType1) + var content = new SolidPublishedContent(contentType1) { Id = 1, SortOrder = 0, - Name = "Content 1", UrlSegment = "content-1", Path = "/1", Level = 1, @@ -37,22 +36,23 @@ namespace Umbraco.Tests.PublishedContent ParentId = -1, ChildIds = new int[] { }, Properties = new Collection + { + new SolidPublishedProperty { - new SolidPublishedProperty - { - Alias = "prop1", - SolidHasValue = true, - SolidValue = 1234, - SolidSourceValue = "1234" - } + Alias = "prop1", + SolidHasValue = true, + SolidValue = 1234, + SolidSourceValue = "1234" } - }); + } + }; + content.SetName("Content 1"); + cache.Add(content); - cache.Add(new SolidPublishedContent(contentType2) + content = new SolidPublishedContent(contentType2) { Id = 2, SortOrder = 1, - Name = "Content 2", UrlSegment = "content-2", Path = "/2", Level = 1, @@ -60,22 +60,23 @@ namespace Umbraco.Tests.PublishedContent ParentId = -1, ChildIds = new int[] { }, Properties = new Collection + { + new SolidPublishedProperty { - new SolidPublishedProperty - { - Alias = "prop1", - SolidHasValue = true, - SolidValue = 1234, - SolidSourceValue = "1234" - } + Alias = "prop1", + SolidHasValue = true, + SolidValue = 1234, + SolidSourceValue = "1234" } - }); + } + }; + content.SetName("Content 2"); + cache.Add(content); - cache.Add(new SolidPublishedContent(contentType2Sub) + content = new SolidPublishedContent(contentType2Sub) { Id = 3, SortOrder = 2, - Name = "Content 2Sub", UrlSegment = "content-2sub", Path = "/3", Level = 1, @@ -92,14 +93,16 @@ namespace Umbraco.Tests.PublishedContent SolidSourceValue = "1234" } } - }); + }; + content.SetName("Content 2Sub"); + cache.Add(content); } [Test] public void First() { var content = Current.UmbracoContext.ContentCache.GetAtRoot().First(); - Assert.AreEqual("Content 1", content.Name); + Assert.AreEqual("Content 1", content.Name()); } [Test] @@ -111,17 +114,17 @@ namespace Umbraco.Tests.PublishedContent .ToIndexedArray(); var item = items[0]; - Assert.AreEqual("Content 1", item.Content.Name); + Assert.AreEqual("Content 1", item.Content.Name()); Assert.IsTrue(item.IsFirst()); Assert.IsFalse(item.IsLast()); item = items[1]; - Assert.AreEqual("Content 2", item.Content.Name); + Assert.AreEqual("Content 2", item.Content.Name()); Assert.IsFalse(item.IsFirst()); Assert.IsFalse(item.IsLast()); item = items[2]; - Assert.AreEqual("Content 2Sub", item.Content.Name); + Assert.AreEqual("Content 2Sub", item.Content.Name()); Assert.IsFalse(item.IsFirst()); Assert.IsTrue(item.IsLast()); } @@ -154,7 +157,7 @@ namespace Umbraco.Tests.PublishedContent var content = Current.UmbracoContext.ContentCache.GetAtRoot() .OfType() .First(x => x.Prop1 == 1234); - Assert.AreEqual("Content 2", content.Name); + Assert.AreEqual("Content 2", content.Name()); Assert.AreEqual(1234, content.Prop1); } diff --git a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs index f801d02c5b..b789eb0ef8 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs @@ -495,7 +495,7 @@ namespace Umbraco.Tests.PublishedContent Assert.AreEqual(nodeId, converted.Id); Assert.AreEqual(3, converted.Level); Assert.AreEqual(1, converted.SortOrder); - Assert.AreEqual("Sam's Umbraco Image", converted.Name); + Assert.AreEqual("Sam's Umbraco Image", converted.Name()); Assert.AreEqual("-1,1111,2222,2112", converted.Path); } diff --git a/src/Umbraco.Tests/PublishedContent/PublishedRouterTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedRouterTests.cs index d8dbabb569..19944a2cd4 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedRouterTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedRouterTests.cs @@ -58,7 +58,7 @@ namespace Umbraco.Tests.PublishedContent { var pc = new Mock(); pc.Setup(content => content.Id).Returns(1); - pc.Setup(content => content.Name).Returns("test"); + pc.Setup(content => content.Name(It.IsAny())).Returns("test"); pc.Setup(content => content.WriterName).Returns("admin"); pc.Setup(content => content.CreatorName).Returns("admin"); pc.Setup(content => content.CreateDate).Returns(DateTime.Now); diff --git a/src/Umbraco.Tests/PublishedContent/SolidPublishedSnapshot.cs b/src/Umbraco.Tests/PublishedContent/SolidPublishedSnapshot.cs index f7d016f725..a25faea07a 100644 --- a/src/Umbraco.Tests/PublishedContent/SolidPublishedSnapshot.cs +++ b/src/Umbraco.Tests/PublishedContent/SolidPublishedSnapshot.cs @@ -153,8 +153,10 @@ namespace Umbraco.Tests.PublishedContent } } - class SolidPublishedContent : IPublishedContent + internal class SolidPublishedContent : IPublishedContent { + private readonly Dictionary _names = new Dictionary(); + #region Constructor public SolidPublishedContent(IPublishedContentType contentType) @@ -177,7 +179,8 @@ namespace Umbraco.Tests.PublishedContent public Guid Key { get; set; } public int? TemplateId { get; set; } public int SortOrder { get; set; } - public string Name { get; set; } + public string Name(string culture = null) => _names.TryGetValue(culture ?? "", out var name) ? name : null; + public void SetName(string name, string culture = null) => _names[culture ?? ""] = name; public PublishedCultureInfo GetCulture(string culture = null) => throw new NotSupportedException(); public IReadOnlyDictionary Cultures => throw new NotSupportedException(); public string UrlSegment { get; set; } diff --git a/src/Umbraco.Tests/Runtimes/StandaloneTests.cs b/src/Umbraco.Tests/Runtimes/StandaloneTests.cs index 0f99b6b884..e07ae576e6 100644 --- a/src/Umbraco.Tests/Runtimes/StandaloneTests.cs +++ b/src/Umbraco.Tests/Runtimes/StandaloneTests.cs @@ -190,7 +190,7 @@ namespace Umbraco.Tests.Runtimes // but a draft document pcontent = umbracoContext.ContentCache.GetById(true, content.Id); Assert.IsNotNull(pcontent); - Assert.AreEqual("test", pcontent.Name); + Assert.AreEqual("test", pcontent.Name()); Assert.IsTrue(pcontent.IsDraft()); // no published url @@ -204,7 +204,7 @@ namespace Umbraco.Tests.Runtimes // assert that snapshot has been updated and there is now a published document pcontent = umbracoContext.ContentCache.GetById(content.Id); Assert.IsNotNull(pcontent); - Assert.AreEqual("test", pcontent.Name); + Assert.AreEqual("test", pcontent.Name()); Assert.IsFalse(pcontent.IsDraft()); // but the url is the published one - no draft url @@ -213,7 +213,7 @@ namespace Umbraco.Tests.Runtimes // and also an updated draft document pcontent = umbracoContext.ContentCache.GetById(true, content.Id); Assert.IsNotNull(pcontent); - Assert.AreEqual("testx", pcontent.Name); + Assert.AreEqual("testx", pcontent.Name()); Assert.IsTrue(pcontent.IsDraft()); // and the published document has a url diff --git a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs index 1dcc928141..f0efffc2cc 100644 --- a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs @@ -152,7 +152,7 @@ namespace Umbraco.Tests.Scoping // during events, due to LiveSnapshot, we see the changes Assert.IsNotNull(e); - Assert.AreEqual("changed", e.Name); + Assert.AreEqual("changed", e.Name()); }; using (var scope = ScopeProvider.CreateScope()) @@ -164,7 +164,7 @@ namespace Umbraco.Tests.Scoping // been created var x = umbracoContext.ContentCache.GetById(item.Id); Assert.IsNotNull(x); - Assert.AreEqual("name", x.Name); + Assert.AreEqual("name", x.Name()); ContentService.Published += OnPublishedAssert; @@ -186,7 +186,7 @@ namespace Umbraco.Tests.Scoping // else changes have been rolled back x = umbracoContext.ContentCache.GetById(item.Id); Assert.IsNotNull(x); - Assert.AreEqual(complete ? "changed" : "name", x.Name); + Assert.AreEqual(complete ? "changed" : "name", x.Name()); } } } diff --git a/src/Umbraco.Tests/TestHelpers/Stubs/TestPublishedContent.cs b/src/Umbraco.Tests/TestHelpers/Stubs/TestPublishedContent.cs index 206660b904..81319a619c 100644 --- a/src/Umbraco.Tests/TestHelpers/Stubs/TestPublishedContent.cs +++ b/src/Umbraco.Tests/TestHelpers/Stubs/TestPublishedContent.cs @@ -7,6 +7,8 @@ namespace Umbraco.Tests.TestHelpers.Stubs { internal class TestPublishedContent : PublishedElement, IPublishedContent { + private readonly Dictionary _names = new Dictionary(); + public TestPublishedContent(IPublishedContentType contentType, int id, Guid key, Dictionary values, bool previewing, Dictionary cultures = null) : base(contentType, key, values, previewing) { @@ -17,7 +19,8 @@ namespace Umbraco.Tests.TestHelpers.Stubs public int Id { get; } public int? TemplateId { get; set; } public int SortOrder { get; set; } - public string Name { get; set; } + public string Name(string culture = null) => _names.TryGetValue(culture ?? "", out var name) ? name : null; + public void SetName(string name, string culture = null) => _names[culture ?? ""] = name; public IVariationContextAccessor VariationContextAccessor { get; set; } public PublishedCultureInfo GetCulture(string culture = null) { diff --git a/src/Umbraco.Web/Editors/TemplateQueryController.cs b/src/Umbraco.Web/Editors/TemplateQueryController.cs index ed737e7749..b252f51fae 100644 --- a/src/Umbraco.Web/Editors/TemplateQueryController.cs +++ b/src/Umbraco.Web/Editors/TemplateQueryController.cs @@ -71,7 +71,7 @@ namespace Umbraco.Web.Editors QueryExpression = queryExpression.ToString(), ResultCount = results.Count, ExecutionTime = timer.ElapsedMilliseconds, - SampleResults = results.Take(20).Select(x => new TemplateQueryResult { Icon = "icon-file", Name = x.Name }) + SampleResults = results.Take(20).Select(x => new TemplateQueryResult { Icon = "icon-file", Name = x.Name() }) }; } @@ -186,12 +186,12 @@ namespace Umbraco.Web.Editors : contents.OrderByDescending(x => x.UpdateDate); case "name": return sortExpression.Direction == "ascending" - ? contents.OrderBy(x => x.Name) - : contents.OrderByDescending(x => x.Name); + ? contents.OrderBy(x => x.Name()) + : contents.OrderByDescending(x => x.Name()); default: return sortExpression.Direction == "ascending" - ? contents.OrderBy(x => x.Name) - : contents.OrderByDescending(x => x.Name); + ? contents.OrderBy(x => x.Name()) + : contents.OrderByDescending(x => x.Name()); } } diff --git a/src/Umbraco.Web/Macros/PublishedContentHashtableConverter.cs b/src/Umbraco.Web/Macros/PublishedContentHashtableConverter.cs index 978bbbcecb..f516aca080 100644 --- a/src/Umbraco.Web/Macros/PublishedContentHashtableConverter.cs +++ b/src/Umbraco.Web/Macros/PublishedContentHashtableConverter.cs @@ -35,7 +35,7 @@ namespace Umbraco.Web.Macros throw new ArgumentException("Document request has no node.", nameof(frequest)); PopulatePageData(frequest.PublishedContent.Id, - frequest.PublishedContent.Name, frequest.PublishedContent.ContentType.Id, frequest.PublishedContent.ContentType.Alias, + frequest.PublishedContent.Name(), frequest.PublishedContent.ContentType.Id, frequest.PublishedContent.ContentType.Alias, frequest.PublishedContent.WriterName, frequest.PublishedContent.CreatorName, frequest.PublishedContent.CreateDate, frequest.PublishedContent.UpdateDate, frequest.PublishedContent.Path, frequest.PublishedContent.Parent?.Id ?? -1); @@ -57,7 +57,7 @@ namespace Umbraco.Web.Macros if (doc == null) throw new ArgumentNullException(nameof(doc)); PopulatePageData(doc.Id, - doc.Name, doc.ContentType.Id, doc.ContentType.Alias, + doc.Name(), doc.ContentType.Id, doc.ContentType.Alias, doc.WriterName, doc.CreatorName, doc.CreateDate, doc.UpdateDate, doc.Path, doc.Parent?.Id ?? -1); @@ -228,7 +228,7 @@ namespace Umbraco.Web.Macros public int SortOrder => _inner.SortOrder; - public string Name => _inner.Name; + public string Name(string culture = null) => _inner.GetCultureName(culture); public PublishedCultureInfo GetCulture(string culture = null) { diff --git a/src/Umbraco.Web/Models/PublishedContentBase.cs b/src/Umbraco.Web/Models/PublishedContentBase.cs index d62b8c6665..04b5a64d07 100644 --- a/src/Umbraco.Web/Models/PublishedContentBase.cs +++ b/src/Umbraco.Web/Models/PublishedContentBase.cs @@ -41,7 +41,7 @@ namespace Umbraco.Web.Models public abstract int Id { get; } /// - public abstract string Name { get; } + public abstract string Name(string culture = null); /// public abstract string UrlSegment { get; } diff --git a/src/Umbraco.Web/PublishedCache/NuCache/Navigable/NavigableContent.cs b/src/Umbraco.Web/PublishedCache/NuCache/Navigable/NavigableContent.cs index 51badc8b9a..bd6ad97d32 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/Navigable/NavigableContent.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/Navigable/NavigableContent.cs @@ -18,7 +18,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.Navigable var i = 0; _builtInValues = new [] { - XmlString(i++, _content.Name), + XmlString(i++, _content.Name()), XmlString(i++, _content.ParentId), XmlString(i++, _content.CreateDate), XmlString(i++, _content.UpdateDate), diff --git a/src/Umbraco.Web/PublishedCache/NuCache/PublishedContent.cs b/src/Umbraco.Web/PublishedCache/NuCache/PublishedContent.cs index 5712d55973..f208061c18 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/PublishedContent.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/PublishedContent.cs @@ -185,19 +185,18 @@ namespace Umbraco.Web.PublishedCache.NuCache public override int Id => _contentNode.Id; /// - public override string Name + public override string Name(string culture = null) { - get - { - if (!ContentType.VariesByCulture()) - return ContentData.Name; + // handle context culture + if (culture == null) + culture = VariationContextAccessor?.VariationContext?.Culture ?? ""; - var culture = VariationContextAccessor?.VariationContext?.Culture ?? ""; - if (culture == "") - return ContentData.Name; + // invariant culture + if (culture == "") + return ContentType.VariesByCulture() ? null : ContentData.Name; - return Cultures.TryGetValue(culture, out var cultureInfos) ? cultureInfos.Name : null; - } + // explicit culture + return Cultures.TryGetValue(culture, out var cultureInfos) ? cultureInfos.Name : null; } /// diff --git a/src/Umbraco.Web/PublishedCache/PublishedMember.cs b/src/Umbraco.Web/PublishedCache/PublishedMember.cs index d954411f5e..d87d75059e 100644 --- a/src/Umbraco.Web/PublishedCache/PublishedMember.cs +++ b/src/Umbraco.Web/PublishedCache/PublishedMember.cs @@ -136,7 +136,11 @@ namespace Umbraco.Web.PublishedCache public override int SortOrder => 0; - public override string Name => _member.Name; + public override string Name(string culture = null) + { + // member name does not vary, ignore culture + return _member.Name; + } public override PublishedCultureInfo GetCulture(string culture = null) => throw new NotSupportedException(); diff --git a/src/Umbraco.Web/PublishedContentExtensions.cs b/src/Umbraco.Web/PublishedContentExtensions.cs index 54afb7abbd..29f32c1316 100644 --- a/src/Umbraco.Web/PublishedContentExtensions.cs +++ b/src/Umbraco.Web/PublishedContentExtensions.cs @@ -1077,7 +1077,7 @@ namespace Umbraco.Web var standardVals = new Dictionary { { "Id", n.Id }, - { "NodeName", n.Name }, + { "NodeName", n.Name() }, { "NodeTypeAlias", n.ContentType.Alias }, { "CreateDate", n.CreateDate }, { "UpdateDate", n.UpdateDate }, diff --git a/src/Umbraco.Web/Routing/UrlProviderExtensions.cs b/src/Umbraco.Web/Routing/UrlProviderExtensions.cs index 2a840828b6..0a4f033bd2 100644 --- a/src/Umbraco.Web/Routing/UrlProviderExtensions.cs +++ b/src/Umbraco.Web/Routing/UrlProviderExtensions.cs @@ -187,7 +187,7 @@ namespace Umbraco.Web.Routing var l = new List(); while (o != null) { - l.Add(o.Name); + l.Add(o.Name()); o = o.Parent; } l.Reverse();