You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2023/09/06 11:16:52 UTC
[logging-log4j2] 01/03: Improve concurrency of ListStatusListener
This is an automated email from the ASF dual-hosted git repository.
pkarwasz pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 16cfa4120518029377424810496cababc2e4b574
Author: Piotr P. Karwasz <pi...@karwasz.org>
AuthorDate: Wed Sep 6 13:14:51 2023 +0200
Improve concurrency of ListStatusListener
ListStatusListener#getStatusData returns a stream that uses a copy of
the data to prevent a ConcurrentModificationException.
---
.../logging/log4j/test/junit/StatusLoggerExtension.java | 17 +++++++++++++----
.../org/apache/logging/log4j/status/StatusData.java | 10 +++++++++-
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java
index b301783e4f..0452d63bd8 100644
--- a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java
+++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.test.junit;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
@@ -89,7 +88,7 @@ class StatusLoggerExtension extends TypeBasedParameterResolver<ListStatusListene
private static class JUnitListStatusListener implements ListStatusListener {
private final ExtensionContext context;
- private final List<StatusData> statusData = Collections.synchronizedList(new ArrayList<StatusData>());
+ private final ArrayList<StatusData> statusData = new ArrayList<>();
public JUnitListStatusListener(final ExtensionContext context) {
this.context = context;
@@ -98,7 +97,9 @@ class StatusLoggerExtension extends TypeBasedParameterResolver<ListStatusListene
@Override
public void log(final StatusData data) {
if (context.equals(ExtensionContextAnchor.getContext())) {
- statusData.add(data);
+ synchronized (statusData) {
+ statusData.add(data);
+ }
}
}
@@ -114,8 +115,16 @@ class StatusLoggerExtension extends TypeBasedParameterResolver<ListStatusListene
@Override
public Stream<StatusData> getStatusData() {
- return statusData.stream();
+ synchronized (statusData) {
+ return ((List<StatusData>) statusData.clone()).stream();
+ }
}
+ @Override
+ public void clear() {
+ synchronized (statusData) {
+ statusData.clear();
+ }
+ }
}
}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java
index 886a0a3b72..a4378900d3 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java
@@ -25,7 +25,7 @@ import java.util.Date;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.message.Message;
-import static org.apache.logging.log4j.util.Chars.*;
+import static org.apache.logging.log4j.util.Chars.SPACE;
/**
* The Status data.
@@ -142,4 +142,12 @@ public class StatusData implements Serializable {
}
return sb.toString();
}
+
+ /**
+ * Used in tests
+ */
+ @Override
+ public String toString() {
+ return getMessage().getFormattedMessage();
+ }
}