Skip to content

Commit a6c1921

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 4e107c0 commit a6c1921

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,30 @@
1616
*/
1717
package org.apache.logging.log4j.core.impl;
1818

19-
import static org.junit.jupiter.api.Assertions.*;
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.junit.jupiter.api.Assertions.assertEquals;
21+
import static org.junit.jupiter.api.Assertions.assertFalse;
22+
import static org.junit.jupiter.api.Assertions.assertNotEquals;
23+
import static org.junit.jupiter.api.Assertions.assertNull;
24+
import static org.junit.jupiter.api.Assertions.assertThrows;
25+
import static org.junit.jupiter.api.Assertions.assertTrue;
26+
import static org.junit.jupiter.api.Assertions.fail;
2027

2128
import java.io.ByteArrayInputStream;
2229
import java.io.ByteArrayOutputStream;
2330
import java.io.IOException;
2431
import java.io.ObjectInputStream;
2532
import java.io.ObjectOutputStream;
33+
import java.util.Collections;
2634
import java.util.HashMap;
2735
import java.util.Map;
36+
import java.util.stream.Stream;
2837
import org.apache.logging.log4j.util.BiConsumer;
2938
import org.apache.logging.log4j.util.TriConsumer;
3039
import org.junit.jupiter.api.Test;
40+
import org.junit.jupiter.params.ParameterizedTest;
41+
import org.junit.jupiter.params.provider.Arguments;
42+
import org.junit.jupiter.params.provider.MethodSource;
3143

3244
/**
3345
* Tests the JdkMapAdapterStringMap class.
@@ -837,4 +849,17 @@ public void testForEachTriConsumer() throws Exception {
837849
original.forEach(COUNTER, state);
838850
assertEquals(state.count, original.size());
839851
}
852+
853+
static Stream<Arguments> testImmutability() {
854+
return Stream.of(
855+
Arguments.of(new HashMap<>(), false),
856+
Arguments.of(Collections.emptyMap(), true),
857+
Arguments.of(Collections.unmodifiableMap(new HashMap<>()), true));
858+
}
859+
860+
@ParameterizedTest
861+
@MethodSource
862+
void testImmutability(final Map<String, String> map, final boolean frozen) {
863+
assertThat(new JdkMapAdapterStringMap(map).isFrozen()).as("Frozen").isEqualTo(frozen);
864+
}
840865
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ public JdkMapAdapterStringMap() {
5353

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

5863
@Override
Lines changed: 10 additions & 0 deletions
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)