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