Skip to content

Commit 80cda33

Browse files
Make CharCollection return the merged result
Since this is the way it's been previously, we cannot change the behaviour of this. Unfortunately due to how the config binding works, we have to make sure it returns null the very first time it's called by the framework to ensure that overrides actually gets registered.
1 parent 6147375 commit 80cda33

File tree

3 files changed

+36
-15
lines changed

3 files changed

+36
-15
lines changed

src/Umbraco.Core/Configuration/Models/RequestHandlerSettings.cs

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,32 +75,53 @@ public class RequestHandlerSettings
7575
[DefaultValue(StaticEnableDefaultCharReplacements)]
7676
public bool EnableDefaultCharReplacements { get; set; } = StaticEnableDefaultCharReplacements;
7777

78+
private IEnumerable<CharItem> _charCollection;
79+
7880
/// <summary>
7981
/// Add additional character replacements, or override defaults
8082
/// </summary>
81-
public IEnumerable<CharItem> CharCollection { get; set; }
83+
public IEnumerable<CharItem> CharCollection
84+
{
85+
get
86+
{
87+
// This is pretty ugly, but necessary.
88+
// Essentially the config binding will only run properly if we return null the first time this is invoked.
89+
// Otherwise whatever we return will just be used and user specific bindings won't overwrite the existing ones.
90+
// However the next time this get is invoked, for instance in DefaultShortStringHelper we want to actually run the GetCharReplacements
91+
// To make sure that the default bindings is used if configured to do so.
92+
// Therefore we set _charCollection to be something, and still return null, to trick dotnet to actually read the config.
93+
if (_charCollection is null)
94+
{
95+
_charCollection = Enumerable.Empty<CharItem>();
96+
return null;
97+
}
98+
99+
return GetCharReplacements();
100+
}
101+
102+
set => _charCollection = value;
103+
}
82104

83105
/// <summary>
84106
/// Get concatenated user and default character replacements
85107
/// taking into account <see cref="EnableDefaultCharReplacements"/>
86108
/// </summary>
87-
public IEnumerable<CharItem> GetCharReplacements()
109+
private IEnumerable<CharItem> GetCharReplacements()
88110
{
89111
// TODO We need to special handle ":", as this character is special in keys
90-
91112
if (!EnableDefaultCharReplacements)
92113
{
93-
return CharCollection;
114+
return _charCollection ?? Enumerable.Empty<CharItem>();
94115
}
95116

96-
if (CharCollection == null || !CharCollection.Any())
117+
if (_charCollection == null || !_charCollection.Any())
97118
{
98119
return DefaultCharCollection;
99120
}
100121

101-
foreach (var defaultReplacement in DefaultCharCollection)
122+
foreach (CharItem defaultReplacement in DefaultCharCollection)
102123
{
103-
foreach (var userReplacement in CharCollection)
124+
foreach (CharItem userReplacement in _charCollection)
104125
{
105126
if (userReplacement.Char == defaultReplacement.Char)
106127
{
@@ -109,7 +130,7 @@ public IEnumerable<CharItem> GetCharReplacements()
109130
}
110131
}
111132

112-
var mergedCollections = DefaultCharCollection.Union<CharItem>(CharCollection, new CharacterReplacementEqualityComparer());
133+
IEnumerable<CharItem> mergedCollections = DefaultCharCollection.Union<CharItem>(_charCollection, new CharacterReplacementEqualityComparer());
113134

114135
return mergedCollections;
115136
}

src/Umbraco.Core/Strings/DefaultShortStringHelperConfig.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public DefaultShortStringHelperConfig WithConfig(string culture, CleanStringType
6060
/// <returns>The short string helper.</returns>
6161
public DefaultShortStringHelperConfig WithDefault(RequestHandlerSettings requestHandlerSettings)
6262
{
63-
UrlReplaceCharacters = requestHandlerSettings.GetCharReplacements()
63+
UrlReplaceCharacters = requestHandlerSettings.CharCollection
6464
.Where(x => string.IsNullOrEmpty(x.Char) == false)
6565
.ToDictionary(x => x.Char, x => x.Replacement);
6666

tests/Umbraco.Tests.UnitTests/Umbraco.Core/Configuration/Models/RequestHandlerSettingsTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ public void Given_CharCollection_With_DefaultEnabled_MergesCollection()
1313
{
1414
var userCollection = new CharItem[]
1515
{
16-
new() { Char = "test", Replacement = "replace" },
17-
new() { Char = "test2", Replacement = "replace2" }
16+
new () { Char = "test", Replacement = "replace" },
17+
new () { Char = "test2", Replacement = "replace2" }
1818
};
1919

2020

2121
var settings = new RequestHandlerSettings { CharCollection = userCollection };
22-
var actual = settings.GetCharReplacements().ToList();
22+
var actual = settings.CharCollection.ToList();
2323

2424
var expectedCollection = RequestHandlerSettings.DefaultCharCollection.ToList();
2525
expectedCollection.AddRange(userCollection);
@@ -38,7 +38,7 @@ public void Given_CharCollection_With_DefaultDisabled_ReturnsUserCollection()
3838
};
3939

4040
var settings = new RequestHandlerSettings { CharCollection = userCollection, EnableDefaultCharReplacements = false };
41-
var actual = settings.GetCharReplacements().ToList();
41+
var actual = settings.CharCollection.ToList();
4242

4343
Assert.AreEqual(userCollection.Length, actual.Count);
4444
Assert.That(actual, Is.EquivalentTo(userCollection));
@@ -54,7 +54,7 @@ public void Given_CharCollection_That_OverridesDefaultValues_ReturnsReplacements
5454
};
5555

5656
var settings = new RequestHandlerSettings { CharCollection = userCollection };
57-
var actual = settings.GetCharReplacements().ToList();
57+
var actual = settings.CharCollection.ToList();
5858

5959
Assert.AreEqual(RequestHandlerSettings.DefaultCharCollection.Length, actual.Count);
6060

@@ -75,7 +75,7 @@ public void Given_CharCollection_That_OverridesDefaultValues_And_ContainsNew_Ret
7575
};
7676

7777
var settings = new RequestHandlerSettings { CharCollection = userCollection };
78-
var actual = settings.GetCharReplacements().ToList();
78+
var actual = settings.CharCollection.ToList();
7979

8080
// Add 1 to the length, because we're expecting to only add one new one
8181
Assert.AreEqual(RequestHandlerSettings.DefaultCharCollection.Length + 1, actual.Count);

0 commit comments

Comments
 (0)