This is an automated email from the ASF dual-hosted git repository.

michaelo pushed a commit to branch maven-3.8.x
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/maven-3.8.x by this push:
     new ca3b34622 [MNG-7778] - Include suppressed exceptions when logging 
failures (#1103)
ca3b34622 is described below

commit ca3b3462278de057ab602fe9b277934c14962249
Author: Tamas Cservenak <[email protected]>
AuthorDate: Fri May 5 17:22:21 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.
    
    Back ported 56674cdc90ee45dc807b44850be5918d1cb3085b
    
    ---
    
    https://issues.apache.org/jira/browse/MNG-7778
---
 .../java/org/slf4j/impl/MavenSimpleLogger.java     | 53 ++++++++++++--------
 .../java/org/slf4j/impl/MavenSimpleLoggerTest.java | 57 ++++++++++++++++++++++
 2 files changed, 90 insertions(+), 20 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 9366687ed..45949407f 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
@@ -71,29 +71,42 @@ public class MavenSimpleLogger
         }
         stream.println();
 
-        while ( t != null )
+        printStackTrace( t, stream, "" );
+    }
+
+    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 )
         {
-            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();
-            }
+            writeThrowable( cause, stream, "Caused by", prefix );
+        }
+    }
 
-            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 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 )
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..4d12b77ec
--- /dev/null
+++ 
b/maven-slf4j-provider/src/test/java/org/slf4j/impl/MavenSimpleLoggerTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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 static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+
+public class MavenSimpleLoggerTest {
+
+    public void 
testIncludesCauseAndSuppressedExceptionsWhenWritingThrowables() 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));
+
+        List<String> actual = 
Arrays.asList(output.toString(UTF_8.name()).split(System.lineSeparator()));
+
+        List<String> expectedLines = Arrays.asList(
+                "java.lang.RuntimeException: top-level",
+                "Caused by: java.lang.IllegalArgumentException: cause",
+                "    Suppressed: java.lang.IllegalStateException: suppressed",
+                "        Suppressed: java.lang.IllegalArgumentException: 
suppressed suppressed",
+                "        Caused by: java.lang.ArrayIndexOutOfBoundsException: 
suppressed suppressed cause",
+                "    Caused by: java.util.NoSuchElementException: cause of 
suppressed");
+
+        assertEquals(expectedLines, actual);
+    }
+}

Reply via email to