Skip to content

Commit 261efb5

Browse files
Merge pull request #180 from snakefoot/master
NLogMessageParameterList - Refactor validation of parameterList
2 parents fa60f06 + 2879acb commit 261efb5

File tree

1 file changed

+57
-27
lines changed

1 file changed

+57
-27
lines changed

src/NLog.Extensions.Logging/NLogMessageParameterList.cs

Lines changed: 57 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4-
using System.Linq;
5-
using System.Text;
6-
using System.Threading.Tasks;
7-
84

95
namespace NLog.Extensions.Logging
106
{
@@ -14,34 +10,66 @@ namespace NLog.Extensions.Logging
1410
/// </summary>
1511
internal class NLogMessageParameterList : IList<NLog.MessageTemplates.MessageTemplateParameter>
1612
{
17-
private IReadOnlyList<KeyValuePair<string, object>> _parameterList;
13+
private readonly IReadOnlyList<KeyValuePair<string, object>> _parameterList;
1814

1915
public NLogMessageParameterList(IReadOnlyList<KeyValuePair<string, object>> parameterList, bool includesOriginalMessage)
2016
{
21-
var validParameterList = includesOriginalMessage ? null : new List<KeyValuePair<string, object>>();
17+
if (!includesOriginalMessage || !IsValidParameterList(parameterList))
18+
{
19+
_parameterList = CreateValidParameterList(parameterList);
20+
}
21+
else
22+
{
23+
_parameterList = parameterList;
24+
}
25+
}
26+
27+
/// <summary>
28+
/// Verify that the input parameterList contains non-empty key-values and the orignal-format-property at the end
29+
/// </summary>
30+
private bool IsValidParameterList(IReadOnlyList<KeyValuePair<string, object>> parameterList)
31+
{
32+
int parameterCount = parameterList.Count - 1;
33+
for (int i = 0; i <= parameterCount; ++i)
34+
{
35+
var paramPair = parameterList[i];
36+
if (!ValidParameterKey(paramPair.Key, i == parameterCount))
37+
return false;
38+
}
39+
40+
return true;
41+
}
42+
43+
/// <summary>
44+
/// Extract all valid properties from the input parameterList, and return them in a newly allocated list
45+
/// </summary>
46+
private IReadOnlyList<KeyValuePair<string, object>> CreateValidParameterList(IReadOnlyList<KeyValuePair<string, object>> parameterList)
47+
{
48+
var validParameterList = new List<KeyValuePair<string, object>>(parameterList.Count + 1);
2249
for (int i = 0; i < parameterList.Count; ++i)
2350
{
2451
var paramPair = parameterList[i];
25-
bool isNonOriginalFormatName;
26-
if (!string.IsNullOrEmpty(paramPair.Key) && ((isNonOriginalFormatName = paramPair.Key != NLogLogger.OriginalFormatPropertyName) || i == parameterList.Count - 1))
27-
{
28-
if (validParameterList != null && isNonOriginalFormatName)
29-
{
30-
validParameterList.Add(paramPair);
31-
}
32-
}
33-
else
34-
{
35-
if (validParameterList == null)
36-
{
37-
validParameterList = new List<KeyValuePair<string, object>>();
38-
for (int j = 0; j < i; ++i)
39-
validParameterList.Add(parameterList[j]);
40-
}
41-
}
52+
if (!ValidParameterKey(paramPair.Key, false))
53+
continue;
54+
55+
validParameterList.Add(parameterList[i]);
4256
}
43-
validParameterList?.Add(new KeyValuePair<string, object>());
44-
_parameterList = validParameterList ?? parameterList;
57+
validParameterList.Add(new KeyValuePair<string, object>()); // Simulate NLogLogger.OriginalFormatPropertyName
58+
return validParameterList;
59+
}
60+
61+
private bool ValidParameterKey(string keyValue, bool lastKey)
62+
{
63+
if (string.IsNullOrEmpty(keyValue))
64+
return false; // Non-empty string not allowed
65+
66+
if (keyValue == NLogLogger.OriginalFormatPropertyName)
67+
return lastKey; // Original format message, must be last parameter
68+
69+
if (lastKey)
70+
return false; // Original format message, must be last parameter
71+
72+
return true;
4573
}
4674

4775
public NLog.MessageTemplates.MessageTemplateParameter this[int index]
@@ -94,12 +122,14 @@ public bool Contains(NLog.MessageTemplates.MessageTemplateParameter item)
94122

95123
public void CopyTo(NLog.MessageTemplates.MessageTemplateParameter[] array, int arrayIndex)
96124
{
97-
throw new NotSupportedException();
125+
for (int i = 0; i < Count; ++i)
126+
array[i + arrayIndex] = this[i];
98127
}
99128

100129
public IEnumerator<NLog.MessageTemplates.MessageTemplateParameter> GetEnumerator()
101130
{
102-
return _parameterList.Take(_parameterList.Count - 1).Select(p => new NLog.MessageTemplates.MessageTemplateParameter(p.Key, p.Value, null)).GetEnumerator();
131+
for (int i = 0; i < Count; ++i)
132+
yield return this[i];
103133
}
104134

105135
public int IndexOf(NLog.MessageTemplates.MessageTemplateParameter item)

0 commit comments

Comments
 (0)