This is an automated email from the ASF dual-hosted git repository.
cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/master by this push:
new 56674cdc9 [MNG-7778] - Include suppressed exceptions when logging
failures (#1103)
56674cdc9 is described below
commit 56674cdc90ee45dc807b44850be5918d1cb3085b
Author: Marc Philipp <[email protected]>
AuthorDate: Fri May 5 17:21:16 2023 +0200
[MNG-7778] - Include suppressed exceptions when logging failures (#1103)
Instead of only including causes, suppressed exceptions are now included
as well. A similar indentation strategy as in
`Throwable.printStackTrace` is used.
---
https://issues.apache.org/jira/browse/MNG-7778
---
.../java/org/slf4j/impl/MavenSimpleLogger.java | 45 ++++++++-----
.../java/org/slf4j/impl/MavenSimpleLoggerTest.java | 78 ++++++++++++++++++++++
2 files changed, 106 insertions(+), 17 deletions(-)
diff --git
a/maven-slf4j-provider/src/main/java/org/slf4j/impl/MavenSimpleLogger.java
b/maven-slf4j-provider/src/main/java/org/slf4j/impl/MavenSimpleLogger.java
index 9fc049fb0..7ab8eabfc 100644
--- a/maven-slf4j-provider/src/main/java/org/slf4j/impl/MavenSimpleLogger.java
+++ b/maven-slf4j-provider/src/main/java/org/slf4j/impl/MavenSimpleLogger.java
@@ -63,27 +63,38 @@ public class MavenSimpleLogger extends SimpleLogger {
}
stream.println();
- while (t != null) {
- for (StackTraceElement e : t.getStackTrace()) {
- stream.print(" ");
- stream.print(buffer().strong("at"));
- stream.print(" " + e.getClassName() + "." + e.getMethodName());
- stream.print(buffer().a(" (").strong(getLocation(e)).a(")"));
- stream.println();
- }
+ printStackTrace(t, stream, "");
+ }
- t = t.getCause();
- if (t != null) {
- stream.print(buffer().strong("Caused by").a(":
").a(t.getClass().getName()));
- if (t.getMessage() != null) {
- stream.print(": ");
- stream.print(buffer().failure(t.getMessage()));
- }
- stream.println();
- }
+ private void printStackTrace(Throwable t, PrintStream stream, String
prefix) {
+ for (StackTraceElement e : t.getStackTrace()) {
+ stream.print(prefix);
+ stream.print(" ");
+ stream.print(buffer().strong("at"));
+ stream.print(" " + e.getClassName() + "." + e.getMethodName());
+ stream.print(buffer().a(" (").strong(getLocation(e)).a(")"));
+ stream.println();
+ }
+ for (Throwable se : t.getSuppressed()) {
+ writeThrowable(se, stream, "Suppressed", prefix + " ");
+ }
+ Throwable cause = t.getCause();
+ if (cause != null) {
+ writeThrowable(cause, stream, "Caused by", prefix);
}
}
+ private void writeThrowable(Throwable t, PrintStream stream, String
caption, String prefix) {
+ stream.print(buffer().a(prefix).strong(caption).a(":
").a(t.getClass().getName()));
+ if (t.getMessage() != null) {
+ stream.print(": ");
+ stream.print(buffer().failure(t.getMessage()));
+ }
+ stream.println();
+
+ printStackTrace(t, stream, prefix);
+ }
+
protected String getLocation(final StackTraceElement e) {
assert e != null;
diff --git
a/maven-slf4j-provider/src/test/java/org/slf4j/impl/MavenSimpleLoggerTest.java
b/maven-slf4j-provider/src/test/java/org/slf4j/impl/MavenSimpleLoggerTest.java
new file mode 100644
index 000000000..da2d0b041
--- /dev/null
+++
b/maven-slf4j-provider/src/test/java/org/slf4j/impl/MavenSimpleLoggerTest.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.slf4j.impl;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.Arrays;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.jupiter.api.Assertions.assertLinesMatch;
+
+class MavenSimpleLoggerTest {
+
+ @Test
+ void includesCauseAndSuppressedExceptionsWhenWritingThrowables(TestInfo
testInfo) throws Exception {
+ Exception causeOfSuppressed = new NoSuchElementException("cause of
suppressed");
+ Exception suppressed = new IllegalStateException("suppressed",
causeOfSuppressed);
+ suppressed.addSuppressed(new IllegalArgumentException(
+ "suppressed suppressed", new
ArrayIndexOutOfBoundsException("suppressed suppressed cause")));
+ Exception cause = new IllegalArgumentException("cause");
+ cause.addSuppressed(suppressed);
+ Exception throwable = new RuntimeException("top-level", cause);
+
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+
+ new MavenSimpleLogger("logger").writeThrowable(throwable, new
PrintStream(output));
+
+ String actual = output.toString(UTF_8.name());
+ List<String> actualLines =
Arrays.asList(actual.split(System.lineSeparator()));
+
+ Class<?> testClass = testInfo.getTestClass().get();
+ String testMethodName = testInfo.getTestMethod().get().getName();
+ String testClassStackTraceLinePattern = "at " + testClass.getName() +
"." + testMethodName + " \\("
+ + testClass.getSimpleName() + ".java:\\d+\\)";
+ List<String> expectedLines = Arrays.asList(
+ "java.lang.RuntimeException: top-level",
+ " " + testClassStackTraceLinePattern,
+ ">> stacktrace >>",
+ "Caused by: java.lang.IllegalArgumentException: cause",
+ " " + testClassStackTraceLinePattern,
+ ">> stacktrace >>",
+ " Suppressed: java.lang.IllegalStateException: suppressed",
+ " " + testClassStackTraceLinePattern,
+ ">> stacktrace >>",
+ " Suppressed: java.lang.IllegalArgumentException:
suppressed suppressed",
+ " " + testClassStackTraceLinePattern,
+ ">> stacktrace >>",
+ " Caused by: java.lang.ArrayIndexOutOfBoundsException:
suppressed suppressed cause",
+ " " + testClassStackTraceLinePattern,
+ ">> stacktrace >>",
+ " Caused by: java.util.NoSuchElementException: cause of
suppressed",
+ " " + testClassStackTraceLinePattern,
+ ">> stacktrace >>");
+
+ assertLinesMatch(expectedLines, actualLines);
+ }
+}