Skip to content

Commit c6d06f4

Browse files
committed
Mark JdkMapAdapterStringMap as frozen if map is immutable
This PR marks `StringMap`s generated from Java `Map`s as frozen if the wrapped map is immutable. Fixes #2098
1 parent 0dc0102 commit c6d06f4

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

Diff for: log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java

+20
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.apache.logging.log4j.core.impl;
1818

19+
import static org.assertj.core.api.Assertions.assertThat;
1920
import static org.junit.jupiter.api.Assertions.assertEquals;
2021
import static org.junit.jupiter.api.Assertions.assertFalse;
2122
import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@ -24,11 +25,16 @@
2425
import static org.junit.jupiter.api.Assertions.assertTrue;
2526
import static org.junit.jupiter.api.Assertions.fail;
2627

28+
import java.util.Collections;
2729
import java.util.HashMap;
2830
import java.util.Map;
31+
import java.util.stream.Stream;
2932
import org.apache.logging.log4j.util.BiConsumer;
3033
import org.apache.logging.log4j.util.TriConsumer;
3134
import org.junit.jupiter.api.Test;
35+
import org.junit.jupiter.params.ParameterizedTest;
36+
import org.junit.jupiter.params.provider.Arguments;
37+
import org.junit.jupiter.params.provider.MethodSource;
3238

3339
/**
3440
* Tests the JdkMapAdapterStringMap class.
@@ -812,4 +818,18 @@ public void testForEachTriConsumer() throws Exception {
812818
original.forEach(COUNTER, state);
813819
assertEquals(state.count, original.size());
814820
}
821+
822+
static Stream<Arguments> testImmutability() {
823+
return Stream.of(
824+
Arguments.of(new HashMap<>(), false),
825+
Arguments.of(Map.of(), true),
826+
Arguments.of(Collections.emptyMap(), true),
827+
Arguments.of(Collections.unmodifiableMap(new HashMap<>()), true));
828+
}
829+
830+
@ParameterizedTest
831+
@MethodSource
832+
void testImmutability(final Map<String, String> map, final boolean frozen) {
833+
assertThat(new JdkMapAdapterStringMap(map).isFrozen()).as("Frozen").isEqualTo(frozen);
834+
}
815835
}

Diff for: log4j-core/src/main/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMap.java

+5
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ public JdkMapAdapterStringMap() {
5252

5353
public JdkMapAdapterStringMap(final Map<String, String> map) {
5454
this.map = Objects.requireNonNull(map, "map");
55+
try {
56+
map.replace(Strings.EMPTY, Strings.EMPTY, Strings.EMPTY);
57+
} catch (final UnsupportedOperationException ignored) {
58+
immutable = true;
59+
}
5560
}
5661

5762
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://logging.apache.org/log4j/changelog"
4+
xsi:schemaLocation="http://logging.apache.org/log4j/changelog https://logging.apache.org/log4j/changelog-0.1.2.xsd"
5+
type="fixed">
6+
<issue id="2098" link="https://github.com/apache/logging-log4j2/issues/2098"/>
7+
<description format="asciidoc">
8+
Mark `JdkMapAdapterStringMap` as frozen if map is immutable.
9+
</description>
10+
</entry>

0 commit comments

Comments
 (0)