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);
+    }
+}

Reply via email to