Skip to content

Commit 752590c

Browse files
committed
Optimize ContextPairs nested name splitting
Signed-off-by: aalsanie <ahmad.alsanie@hotmail.com>
1 parent 8774d92 commit 752590c

File tree

2 files changed

+49
-10
lines changed

2 files changed

+49
-10
lines changed

core/spring-boot/src/main/java/org/springframework/boot/logging/structured/ContextPairs.java

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,24 +193,50 @@ void nested(T item, BiConsumer<String, Object> pairs) {
193193
LinkedHashMap<String, Object> result = new LinkedHashMap<>();
194194
this.addedPairs.forEach((addedPair) -> {
195195
addedPair.accept(item, joining((name, value) -> {
196-
List<String> nameParts = List.of(name.split("\\."));
197196
Map<String, Object> destination = result;
198-
for (int i = 0; i < nameParts.size() - 1; i++) {
199-
Object existing = destination.computeIfAbsent(nameParts.get(i), (key) -> new LinkedHashMap<>());
197+
198+
int end = trimTrailingDelimiters(name);
199+
if (end == 0) {
200+
return;
201+
}
202+
203+
int start = 0;
204+
while (true) {
205+
int dot = name.indexOf('.', start);
206+
if (dot == -1 || dot >= end) {
207+
break;
208+
}
209+
210+
String part = name.substring(start, dot);
211+
212+
Object existing = destination.computeIfAbsent(part, (key) -> new LinkedHashMap<>());
200213
if (!(existing instanceof Map)) {
201-
String common = String.join(".", nameParts.subList(0, i + 1));
214+
String common = name.substring(0, dot);
202215
throw new IllegalStateException(
203216
"Duplicate nested pairs added under '%s'".formatted(common));
204217
}
218+
205219
destination = (Map<String, Object>) existing;
220+
start = dot + 1;
206221
}
207-
Object previous = destination.put(nameParts.get(nameParts.size() - 1), value);
208-
Assert.state(previous == null, () -> "Duplicate nested pairs added under '%s'".formatted(name));
222+
223+
String leaf = name.substring(start, end);
224+
Object previous = destination.put(leaf, value);
225+
Assert.state(previous == null,
226+
() -> "Duplicate nested pairs added under '%s'".formatted(name));
209227
}));
210228
});
211229
result.forEach(pairs);
212230
}
213231

232+
private int trimTrailingDelimiters(String name) {
233+
int end = name.length();
234+
while (end > 0 && name.charAt(end - 1) == '.') {
235+
end--;
236+
}
237+
return end;
238+
}
239+
214240
private <V> BiConsumer<String, V> joining(BiConsumer<String, V> pairs) {
215241
return (name, value) -> {
216242
name = this.joiner.join(ContextPairs.this.prefix, (name != null) ? name : "");

core/spring-boot/src/test/java/org/springframework/boot/logging/structured/ContextPairsTests.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,28 @@ void nestedExpandsNames() {
120120
assertThat(actual).isEqualTo(expected);
121121
}
122122

123+
@Test
124+
void nestedWhenNameEndsWithDelimiterDropsTrailingDelimiter() {
125+
ContextPairs contextPairs = new ContextPairs(true, null);
126+
Map<String, String> map = new LinkedHashMap<>();
127+
map.put("a1.b1.", "A1B1");
128+
Map<String, Object> actual = apply(contextPairs.nested((pairs) -> pairs.addMapEntries((item) -> map)));
129+
Map<String, Object> expected = new LinkedHashMap<>();
130+
Map<String, Object> a1 = new LinkedHashMap<>();
131+
expected.put("a1", a1);
132+
a1.put("b1", "A1B1");
133+
assertThat(actual).isEqualTo(expected);
134+
}
135+
123136
@Test
124137
void nestedWhenDuplicateInParentThrowsException() {
125138
ContextPairs contextPairs = new ContextPairs(true, null);
126139
Map<String, String> map = new LinkedHashMap<>();
127140
map.put("a1.b1.c1", "A1B1C1");
128141
map.put("a1.b1", "A1B1");
129142
assertThatIllegalStateException()
130-
.isThrownBy(() -> apply(contextPairs.nested((pairs) -> pairs.addMapEntries((item) -> map))))
131-
.withMessage("Duplicate nested pairs added under 'a1.b1'");
143+
.isThrownBy(() -> apply(contextPairs.nested((pairs) -> pairs.addMapEntries((item) -> map))))
144+
.withMessage("Duplicate nested pairs added under 'a1.b1'");
132145
}
133146

134147
@Test
@@ -138,8 +151,8 @@ void nestedWhenDuplicateInLeafThrowsException() {
138151
map.put("a1.b1", "A1B1");
139152
map.put("a1.b1.c1", "A1B1C1");
140153
assertThatIllegalStateException()
141-
.isThrownBy(() -> apply(contextPairs.nested((pairs) -> pairs.addMapEntries((item) -> map))))
142-
.withMessage("Duplicate nested pairs added under 'a1.b1'");
154+
.isThrownBy(() -> apply(contextPairs.nested((pairs) -> pairs.addMapEntries((item) -> map))))
155+
.withMessage("Duplicate nested pairs added under 'a1.b1'");
143156
}
144157

145158
@Test

0 commit comments

Comments
 (0)