From 9fffb5b6647cdefeb6542744828d5fb3f196860f Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Mon, 9 Dec 2024 13:17:40 -0500 Subject: [PATCH] GH-9702: Add `CheckedCallable.uncheckedCallable` Fixes: #9702 Issue link: https://github.com/spring-projects/spring-integration/issues/9702 The current `CheckedCallable.unchecked()` returns `Runnable`, which is not an expectation. * Deprecate `CheckedCallable.unchecked()` in favor of newly introduced `CheckedCallable.uncheckedCallable()`. We cannot call it `unchecked()` as well, since `Callable` after erasure becomes similar to class signature as `Runnable`. (cherry picked from commit 8c22bf64305c80aae1f4621e74396963e53836cb) --- .../integration/util/CheckedCallable.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/util/CheckedCallable.java b/spring-integration-core/src/main/java/org/springframework/integration/util/CheckedCallable.java index cb6200926f..3ade7c766d 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/util/CheckedCallable.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/util/CheckedCallable.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ package org.springframework.integration.util; +import java.util.concurrent.Callable; + /** * A Callable-like interface which allows throwing any Throwable. * Checked exceptions are wrapped in an IllegalStateException. @@ -32,10 +34,29 @@ public interface CheckedCallable { T call() throws E; + /** + * Wrap the {@link #call()} into unchecked {@link Runnable} (by mistake). + * Re-throw its exception wrapped with a {@link IllegalStateException}. + * @return the Runnable (by mistake). + * @deprecated since 6.3.7 in favor of {@link #uncheckedCallable()}. + * Will be restored back, but with a proper {@link Callable} return type. + */ + @Deprecated default Runnable unchecked() { + return this::uncheckedCallable; + } + + /** + * Wrap the {@link #call()} into unchecked {@link Callable}. + * Re-throw its exception wrapped with a {@link IllegalStateException}. + * Will be replaced with a proper {@link #unchecked()} implementation in 6.5. + * @return the unchecked {@link Callable}. + * @since 6.3.7 + */ + default Callable uncheckedCallable() { return () -> { try { - call(); + return call(); } catch (Throwable t) { // NOSONAR if (t instanceof RuntimeException runtimeException) { // NOSONAR