This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 68b8c2981f634843ce854c1f6bacd1cbbbc6a494 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Tue Sep 27 22:13:35 2022 +0200 When unwrapping an exception, unwrap also the suppressed exceptions. --- .../main/java/org/apache/sis/util/Exceptions.java | 24 ++++++++++++++-------- .../sis/util/collection/BackingStoreException.java | 3 ++- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/Exceptions.java b/core/sis-utility/src/main/java/org/apache/sis/util/Exceptions.java index e38fde2cef..e9a223dba6 100644 --- a/core/sis-utility/src/main/java/org/apache/sis/util/Exceptions.java +++ b/core/sis-utility/src/main/java/org/apache/sis/util/Exceptions.java @@ -202,8 +202,8 @@ public final class Exceptions extends Static { * because it is used in very specific contexts. Furthermore classes related to security manager are deprecated * since Java 17.</div> * - * This method uses only the exception class and the absence of {@linkplain Exception#getSuppressed() suppressed - * exceptions} as criterion; it does not verify if the exception messages are the same. + * This method uses only the exception class as criterion; + * it does not verify if the exception messages are the same. * * @param exception the exception to unwrap (may be {@code null}. * @return the unwrapped exception (may be the given argument itself). @@ -212,24 +212,32 @@ public final class Exceptions extends Static { */ public static Exception unwrap(Exception exception) { if (exception != null) { - while (exception.getSuppressed().length == 0 && - (exception instanceof InvocationTargetException || + while (exception instanceof InvocationTargetException || exception instanceof ExecutionException || exception instanceof BackingStoreException || exception instanceof UncheckedIOException || - exception instanceof DirectoryIteratorException)) + exception instanceof DirectoryIteratorException) { final Throwable cause = exception.getCause(); if (!(cause instanceof Exception)) break; + copySuppressed(exception, cause); exception = (Exception) cause; } Throwable cause; - while (exception.getSuppressed().length == 0 && - exception.getClass().isInstance(cause = exception.getCause())) - { + while (exception.getClass().isInstance(cause = exception.getCause())) { + copySuppressed(exception, cause); exception = (Exception) cause; // Should never fail because of isInstance(…) check. } } return exception; } + + /** + * Unwraps and copies suppressed exceptions from the given source to the given target. + */ + private static void copySuppressed(final Exception source, final Throwable target) { + for (final Throwable suppressed : source.getSuppressed()) { + target.addSuppressed(suppressed instanceof Exception ? unwrap((Exception) suppressed) : suppressed); + } + } } diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/collection/BackingStoreException.java b/core/sis-utility/src/main/java/org/apache/sis/util/collection/BackingStoreException.java index 7ecefbbb90..a57b3d3472 100644 --- a/core/sis-utility/src/main/java/org/apache/sis/util/collection/BackingStoreException.java +++ b/core/sis-utility/src/main/java/org/apache/sis/util/collection/BackingStoreException.java @@ -18,6 +18,7 @@ package org.apache.sis.util.collection; import java.io.IOException; import java.sql.SQLException; +import org.apache.sis.util.Exceptions; /** @@ -153,7 +154,7 @@ public class BackingStoreException extends RuntimeException { */ private void copySuppressed(final Throwable cause) { for (final Throwable s : getSuppressed()) { - cause.addSuppressed(s); + cause.addSuppressed(s instanceof Exception ? Exceptions.unwrap((Exception) s) : s); } } }