From e4395f2f8bd40db7401cac601e4aadd15d1fe4f1 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sun, 31 Jul 2022 14:14:56 +0300 Subject: [PATCH] Clean up warnings and polishing --- .../AsyncExecutionAspectSupport.java | 8 +-- .../ApplicationListenerMethodAdapter.java | 22 +++--- .../AutowiredQualifierFooService.java | 6 +- .../example/scannable/FooServiceImpl.java | 6 +- .../scannable/ScopedProxyTestBean.java | 6 +- .../AnnotationDrivenEventListenerTests.java | 7 +- .../GenericApplicationContextTests.java | 1 + ...AsyncAnnotationBeanPostProcessorTests.java | 9 +-- .../annotation/AsyncExecutionTests.java | 2 +- .../annotation/AsyncResultTests.java | 35 ++++----- .../annotation/EnableAsyncTests.java | 2 + .../AbstractSchedulingTaskExecutorTests.java | 42 ++++++----- .../ConcurrentTaskExecutorTests.java | 6 +- .../DecoratedThreadPoolTaskExecutorTests.java | 6 +- .../ThreadPoolTaskExecutorTests.java | 5 +- .../ThreadPoolTaskSchedulerTests.java | 4 +- .../aot/agent/InstrumentedMethod.java | 13 ++-- .../util/concurrent/FutureAdapterTests.java | 6 +- .../concurrent/ListenableFutureTaskTests.java | 2 +- .../MonoToListenableFutureAdapterTests.java | 5 +- .../SettableListenableFutureTests.java | 3 +- .../AsyncHandlerMethodReturnValueHandler.java | 19 ++--- .../SimpAnnotationMethodMessageHandler.java | 5 +- .../stomp/ConnectionHandlingStompSession.java | 8 +-- .../stomp/ReactorNettyTcpStompClient.java | 14 ++-- .../stomp/StompBrokerRelayMessageHandler.java | 11 --- .../messaging/tcp/TcpConnection.java | 7 +- .../messaging/tcp/TcpOperations.java | 24 ++++--- ...mpAnnotationMethodMessageHandlerTests.java | 11 ++- .../samples/client/standalone/AsyncTests.java | 48 ++++++------- .../samples/standalone/AsyncTests.java | 50 ++++++------- ...eferredResultMethodReturnValueHandler.java | 23 +++--- ...DeferredResultReturnValueHandlerTests.java | 20 +++--- .../client/AbstractWebSocketClient.java | 38 +++++----- .../web/socket/client/WebSocketClient.java | 16 ++--- .../client/jetty/JettyWebSocketClient.java | 8 +-- .../standard/StandardWebSocketClient.java | 8 +-- .../messaging/WebSocketStompClient.java | 34 +++++---- .../client/AbstractClientSockJsSession.java | 9 +-- .../sockjs/client/AbstractXhrTransport.java | 3 +- .../client/DefaultTransportRequest.java | 14 ++-- .../web/socket/sockjs/client/Transport.java | 24 +++---- .../client/WebSocketClientSockJsSession.java | 3 +- .../sockjs/client/XhrClientSockJsSession.java | 13 ++-- .../AbstractWebSocketIntegrationTests.java | 6 +- .../web/socket/WebSocketHandshakeTests.java | 4 +- .../StandardWebSocketClientTests.java | 16 +++-- .../WebSocketConfigurationTests.java | 4 +- .../WebSocketStompClientIntegrationTests.java | 6 +- .../AbstractSockJsIntegrationTests.java | 42 +++++------ .../client/JettySockJsIntegrationTests.java | 8 +-- .../client/RestTemplateXhrTransportTests.java | 18 ++--- .../sockjs/client/SockJsClientTests.java | 72 +++++++++---------- .../UndertowSockJsIntegrationTests.java | 10 +-- .../sockjs/client/XhrTransportTests.java | 16 ++--- 55 files changed, 412 insertions(+), 396 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java index 4a0dd68861..51b76a23b1 100644 --- a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java +++ b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java @@ -35,14 +35,12 @@ import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.EmbeddedValueResolver; -import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.TaskExecutor; import org.springframework.core.task.support.TaskExecutorAdapter; import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; -import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.function.SingletonSupplier; /** @@ -274,14 +272,14 @@ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware { * @param returnType the declared return type (potentially a {@link Future} variant) * @return the execution result (potentially a corresponding {@link Future} handle) */ - @SuppressWarnings("deprecation") @Nullable + @SuppressWarnings("deprecation") protected Object doSubmit(Callable task, AsyncTaskExecutor executor, Class returnType) { if (CompletableFuture.class.isAssignableFrom(returnType)) { return executor.submitCompletable(task); } - else if (ListenableFuture.class.isAssignableFrom(returnType)) { - return ((AsyncListenableTaskExecutor) executor).submitListenable(task); + else if (org.springframework.util.concurrent.ListenableFuture.class.isAssignableFrom(returnType)) { + return ((org.springframework.core.task.AsyncListenableTaskExecutor) executor).submitListenable(task); } else if (Future.class.isAssignableFrom(returnType)) { return executor.submit(task); diff --git a/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java b/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java index 5d329ba148..21d8ac7e87 100644 --- a/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java +++ b/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java @@ -50,7 +50,6 @@ import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; -import org.springframework.util.concurrent.ListenableFuture; /** * {@link GenericApplicationListener} adapter that delegates the processing of @@ -253,8 +252,8 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe } Class declaredEventClass = declaredEventType.toClass(); if (!ApplicationEvent.class.isAssignableFrom(declaredEventClass) && - event instanceof PayloadApplicationEvent) { - Object payload = ((PayloadApplicationEvent) event).getPayload(); + event instanceof PayloadApplicationEvent payloadEvent) { + Object payload = payloadEvent.getPayload(); if (declaredEventClass.isInstance(payload)) { return new Object[] {payload}; } @@ -262,15 +261,15 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe return new Object[] {event}; } - @SuppressWarnings("deprecation") + @SuppressWarnings({ "deprecation", "unchecked" }) protected void handleResult(Object result) { if (reactiveStreamsPresent && new ReactiveResultHandler().subscribeToPublisher(result)) { if (logger.isTraceEnabled()) { logger.trace("Adapted to reactive result: " + result); } } - else if (result instanceof CompletionStage) { - ((CompletionStage) result).whenComplete((event, ex) -> { + else if (result instanceof CompletionStage completionStage) { + completionStage.whenComplete((event, ex) -> { if (ex != null) { handleAsyncError(ex); } @@ -279,8 +278,8 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe } }); } - else if (result instanceof ListenableFuture) { - ((ListenableFuture) result).addCallback(this::publishEvents, this::handleAsyncError); + else if (result instanceof org.springframework.util.concurrent.ListenableFuture listenableFuture) { + listenableFuture.addCallback(this::publishEvents, this::handleAsyncError); } else { publishEvents(result); @@ -353,8 +352,8 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe catch (InvocationTargetException ex) { // Throw underlying exception Throwable targetException = ex.getTargetException(); - if (targetException instanceof RuntimeException) { - throw (RuntimeException) targetException; + if (targetException instanceof RuntimeException runtimeException) { + throw runtimeException; } else { String msg = getInvocationErrorMessage(bean, "Failed to invoke event listener method", args); @@ -441,8 +440,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe @Nullable private ResolvableType getResolvableType(ApplicationEvent event) { ResolvableType payloadType = null; - if (event instanceof PayloadApplicationEvent) { - PayloadApplicationEvent payloadEvent = (PayloadApplicationEvent) event; + if (event instanceof PayloadApplicationEvent payloadEvent) { ResolvableType eventType = payloadEvent.getResolvableType(); if (eventType != null) { payloadType = eventType.as(PayloadApplicationEvent.class).getGeneric(); diff --git a/spring-context/src/test/java/example/scannable/AutowiredQualifierFooService.java b/spring-context/src/test/java/example/scannable/AutowiredQualifierFooService.java index 72232fb831..69f09081dc 100644 --- a/spring-context/src/test/java/example/scannable/AutowiredQualifierFooService.java +++ b/spring-context/src/test/java/example/scannable/AutowiredQualifierFooService.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2022 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. @@ -23,7 +23,6 @@ import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Lazy; -import org.springframework.scheduling.annotation.AsyncResult; /** * @author Mark Fisher @@ -52,8 +51,9 @@ public class AutowiredQualifierFooService implements FooService { } @Override + @SuppressWarnings("deprecation") public Future asyncFoo(int id) { - return new AsyncResult<>(this.fooDao.findFoo(id)); + return new org.springframework.scheduling.annotation.AsyncResult<>(this.fooDao.findFoo(id)); } @Override diff --git a/spring-context/src/test/java/example/scannable/FooServiceImpl.java b/spring-context/src/test/java/example/scannable/FooServiceImpl.java index 3e0f64b740..7a858e5462 100644 --- a/spring-context/src/test/java/example/scannable/FooServiceImpl.java +++ b/spring-context/src/test/java/example/scannable/FooServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -35,7 +35,6 @@ import org.springframework.context.annotation.Lazy; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import org.springframework.util.Assert; @@ -92,10 +91,11 @@ public abstract class FooServiceImpl implements FooService { } @Override + @SuppressWarnings("deprecation") public Future asyncFoo(int id) { System.out.println(Thread.currentThread().getName()); Assert.state(ServiceInvocationCounter.getThreadLocalCount() != null, "Thread-local counter not exposed"); - return new AsyncResult<>(fooDao().findFoo(id)); + return new org.springframework.scheduling.annotation.AsyncResult<>(fooDao().findFoo(id)); } @Override diff --git a/spring-context/src/test/java/example/scannable/ScopedProxyTestBean.java b/spring-context/src/test/java/example/scannable/ScopedProxyTestBean.java index 90ec394ef2..8482919117 100644 --- a/spring-context/src/test/java/example/scannable/ScopedProxyTestBean.java +++ b/spring-context/src/test/java/example/scannable/ScopedProxyTestBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2022 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. @@ -19,7 +19,6 @@ package example.scannable; import java.util.concurrent.Future; import org.springframework.context.annotation.Scope; -import org.springframework.scheduling.annotation.AsyncResult; /** * @author Mark Fisher @@ -34,8 +33,9 @@ public class ScopedProxyTestBean implements FooService { } @Override + @SuppressWarnings("deprecation") public Future asyncFoo(int id) { - return new AsyncResult<>("bar"); + return new org.springframework.scheduling.annotation.AsyncResult<>("bar"); } @Override diff --git a/spring-context/src/test/java/org/springframework/context/event/AnnotationDrivenEventListenerTests.java b/spring-context/src/test/java/org/springframework/context/event/AnnotationDrivenEventListenerTests.java index 9c81b50e22..d64a4d24ce 100644 --- a/spring-context/src/test/java/org/springframework/context/event/AnnotationDrivenEventListenerTests.java +++ b/spring-context/src/test/java/org/springframework/context/event/AnnotationDrivenEventListenerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -66,7 +66,6 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.stereotype.Component; import org.springframework.util.Assert; -import org.springframework.util.concurrent.SettableListenableFuture; import org.springframework.validation.annotation.Validated; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; @@ -267,9 +266,11 @@ class AnnotationDrivenEventListenerTests { } @Test + @SuppressWarnings("deprecation") void listenableFutureReply() { load(TestEventListener.class, ReplyEventListener.class); - SettableListenableFuture future = new SettableListenableFuture<>(); + org.springframework.util.concurrent.SettableListenableFuture future = + new org.springframework.util.concurrent.SettableListenableFuture<>(); future.set("dummy"); AnotherTestEvent event = new AnotherTestEvent(this, future); ReplyEventListener replyEventListener = this.context.getBean(ReplyEventListener.class); diff --git a/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java b/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java index 96cad6c159..d44cf7172b 100644 --- a/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java +++ b/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java @@ -433,6 +433,7 @@ class GenericApplicationContextTests { assertThat(context.getBeanFactory().getMergedBeanDefinition("test") .hasAttribute("mbdppCalled")).isTrue(); assertThat(context.getBean("test")).isEqualTo("42"); + context.close(); } @Test diff --git a/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncAnnotationBeanPostProcessorTests.java b/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncAnnotationBeanPostProcessorTests.java index 2599d1a3ce..aae702ac30 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncAnnotationBeanPostProcessorTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncAnnotationBeanPostProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -40,7 +40,6 @@ import org.springframework.context.support.StaticApplicationContext; import org.springframework.core.io.ClassPathResource; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.util.ReflectionUtils; -import org.springframework.util.concurrent.ListenableFuture; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -276,7 +275,8 @@ public class AsyncAnnotationBeanPostProcessorTests { Future failWithFuture(); - ListenableFuture failWithListenableFuture(); + @SuppressWarnings("deprecation") + org.springframework.util.concurrent.ListenableFuture failWithListenableFuture(); void failWithVoid(); @@ -310,7 +310,8 @@ public class AsyncAnnotationBeanPostProcessorTests { @Async @Override - public ListenableFuture failWithListenableFuture() { + @SuppressWarnings("deprecation") + public org.springframework.util.concurrent.ListenableFuture failWithListenableFuture() { throw new UnsupportedOperationException("failWithListenableFuture"); } diff --git a/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncExecutionTests.java b/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncExecutionTests.java index 70c97851a4..b8dc8bafe3 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncExecutionTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncExecutionTests.java @@ -50,7 +50,7 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; * @author Juergen Hoeller * @author Chris Beams */ -@SuppressWarnings("resource") +@SuppressWarnings({ "resource", "deprecation" }) public class AsyncExecutionTests { private static String originalThreadName; diff --git a/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncResultTests.java b/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncResultTests.java index 6b4f67a0b3..b37eca9eff 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncResultTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/annotation/AsyncResultTests.java @@ -23,9 +23,6 @@ import java.util.concurrent.ExecutionException; import org.junit.jupiter.api.Test; -import org.springframework.util.concurrent.ListenableFuture; -import org.springframework.util.concurrent.ListenableFutureCallback; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -35,11 +32,12 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; public class AsyncResultTests { @Test + @SuppressWarnings("deprecation") public void asyncResultWithCallbackAndValue() throws Exception { String value = "val"; final Set values = new HashSet<>(1); - ListenableFuture future = AsyncResult.forValue(value); - future.addCallback(new ListenableFutureCallback() { + org.springframework.util.concurrent.ListenableFuture future = AsyncResult.forValue(value); + future.addCallback(new org.springframework.util.concurrent.ListenableFutureCallback() { @Override public void onSuccess(String result) { values.add(result); @@ -56,11 +54,12 @@ public class AsyncResultTests { } @Test + @SuppressWarnings("deprecation") public void asyncResultWithCallbackAndException() throws Exception { IOException ex = new IOException(); final Set values = new HashSet<>(1); - ListenableFuture future = AsyncResult.forExecutionException(ex); - future.addCallback(new ListenableFutureCallback() { + org.springframework.util.concurrent.ListenableFuture future = AsyncResult.forExecutionException(ex); + future.addCallback(new org.springframework.util.concurrent.ListenableFutureCallback() { @Override public void onSuccess(String result) { throw new AssertionError("Success callback not expected: " + result); @@ -71,19 +70,20 @@ public class AsyncResultTests { } }); assertThat(values.iterator().next()).isSameAs(ex); - assertThatExceptionOfType(ExecutionException.class).isThrownBy( - future::get) + assertThatExceptionOfType(ExecutionException.class) + .isThrownBy(future::get) .withCause(ex); - assertThatExceptionOfType(ExecutionException.class).isThrownBy( - future.completable()::get) + assertThatExceptionOfType(ExecutionException.class) + .isThrownBy(future.completable()::get) .withCause(ex); } @Test + @SuppressWarnings("deprecation") public void asyncResultWithSeparateCallbacksAndValue() throws Exception { String value = "val"; final Set values = new HashSet<>(1); - ListenableFuture future = AsyncResult.forValue(value); + org.springframework.util.concurrent.ListenableFuture future = AsyncResult.forValue(value); future.addCallback(values::add, ex -> new AssertionError("Failure callback not expected: " + ex)); assertThat(values.iterator().next()).isSameAs(value); assertThat(future.get()).isSameAs(value); @@ -92,17 +92,18 @@ public class AsyncResultTests { } @Test + @SuppressWarnings("deprecation") public void asyncResultWithSeparateCallbacksAndException() throws Exception { IOException ex = new IOException(); final Set values = new HashSet<>(1); - ListenableFuture future = AsyncResult.forExecutionException(ex); + org.springframework.util.concurrent.ListenableFuture future = AsyncResult.forExecutionException(ex); future.addCallback(result -> new AssertionError("Success callback not expected: " + result), values::add); assertThat(values.iterator().next()).isSameAs(ex); - assertThatExceptionOfType(ExecutionException.class).isThrownBy( - future::get) + assertThatExceptionOfType(ExecutionException.class) + .isThrownBy(future::get) .withCause(ex); - assertThatExceptionOfType(ExecutionException.class).isThrownBy( - future.completable()::get) + assertThatExceptionOfType(ExecutionException.class) + .isThrownBy(future.completable()::get) .withCause(ex); } diff --git a/spring-context/src/test/java/org/springframework/scheduling/annotation/EnableAsyncTests.java b/spring-context/src/test/java/org/springframework/scheduling/annotation/EnableAsyncTests.java index 08c182785c..f19c945b08 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/annotation/EnableAsyncTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/annotation/EnableAsyncTests.java @@ -346,6 +346,7 @@ public class EnableAsyncTests { } + @SuppressWarnings("deprecation") static class AsyncBeanWithExecutorQualifiedByName { @Async @@ -369,6 +370,7 @@ public class EnableAsyncTests { } } + @SuppressWarnings("deprecation") static class AsyncBeanWithExecutorQualifiedByExpressionOrPlaceholder { @Async("#{environment['myExecutor']}") diff --git a/spring-context/src/test/java/org/springframework/scheduling/concurrent/AbstractSchedulingTaskExecutorTests.java b/spring-context/src/test/java/org/springframework/scheduling/concurrent/AbstractSchedulingTaskExecutorTests.java index 1ebc5f4f4a..e0e97391c0 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/concurrent/AbstractSchedulingTaskExecutorTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/concurrent/AbstractSchedulingTaskExecutorTests.java @@ -35,9 +35,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; import org.springframework.beans.factory.DisposableBean; -import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.lang.Nullable; -import org.springframework.util.concurrent.ListenableFuture; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -49,7 +47,8 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; */ abstract class AbstractSchedulingTaskExecutorTests { - private AsyncListenableTaskExecutor executor; + @SuppressWarnings("deprecation") + private org.springframework.core.task.AsyncListenableTaskExecutor executor; protected String testName; @@ -65,7 +64,8 @@ abstract class AbstractSchedulingTaskExecutorTests { this.executor = buildExecutor(); } - protected abstract AsyncListenableTaskExecutor buildExecutor(); + @SuppressWarnings("deprecation") + protected abstract org.springframework.core.task.AsyncListenableTaskExecutor buildExecutor(); @AfterEach void shutdownExecutor() throws Exception { @@ -125,10 +125,11 @@ abstract class AbstractSchedulingTaskExecutorTests { } @Test + @SuppressWarnings("deprecation") void submitListenableRunnable() throws Exception { TestTask task = new TestTask(this.testName, 1); // Act - ListenableFuture future = executor.submitListenable(task); + org.springframework.util.concurrent.ListenableFuture future = executor.submitListenable(task); future.addCallback(result -> outcome = result, ex -> outcome = ex); // Assert Awaitility.await() @@ -155,9 +156,10 @@ abstract class AbstractSchedulingTaskExecutorTests { } @Test + @SuppressWarnings("deprecation") void submitFailingListenableRunnable() throws Exception { TestTask task = new TestTask(this.testName, 0); - ListenableFuture future = executor.submitListenable(task); + org.springframework.util.concurrent.ListenableFuture future = executor.submitListenable(task); future.addCallback(result -> outcome = result, ex -> outcome = ex); Awaitility.await() @@ -183,9 +185,10 @@ abstract class AbstractSchedulingTaskExecutorTests { } @Test + @SuppressWarnings("deprecation") void submitListenableRunnableWithGetAfterShutdown() throws Exception { - ListenableFuture future1 = executor.submitListenable(new TestTask(this.testName, -1)); - ListenableFuture future2 = executor.submitListenable(new TestTask(this.testName, -1)); + org.springframework.util.concurrent.ListenableFuture future1 = executor.submitListenable(new TestTask(this.testName, -1)); + org.springframework.util.concurrent.ListenableFuture future2 = executor.submitListenable(new TestTask(this.testName, -1)); shutdownExecutor(); try { @@ -218,8 +221,8 @@ abstract class AbstractSchedulingTaskExecutorTests { .atMost(4, TimeUnit.SECONDS) .pollInterval(10, TimeUnit.MILLISECONDS) .untilAsserted(() -> - assertThatExceptionOfType(TimeoutException.class).isThrownBy(() -> - future2.get(1000, TimeUnit.MILLISECONDS))); + assertThatExceptionOfType(TimeoutException.class) + .isThrownBy(() -> future2.get(1000, TimeUnit.MILLISECONDS))); } @Test @@ -234,8 +237,8 @@ abstract class AbstractSchedulingTaskExecutorTests { void submitFailingCallable() throws Exception { TestCallable task = new TestCallable(this.testName, 0); Future future = executor.submit(task); - assertThatExceptionOfType(ExecutionException.class).isThrownBy(() -> - future.get(1000, TimeUnit.MILLISECONDS)); + assertThatExceptionOfType(ExecutionException.class) + .isThrownBy(() -> future.get(1000, TimeUnit.MILLISECONDS)); assertThat(future.isDone()).isTrue(); } @@ -255,15 +258,16 @@ abstract class AbstractSchedulingTaskExecutorTests { .atMost(4, TimeUnit.SECONDS) .pollInterval(10, TimeUnit.MILLISECONDS) .untilAsserted(() -> - assertThatExceptionOfType(CancellationException.class).isThrownBy(() -> - future2.get(1000, TimeUnit.MILLISECONDS))); + assertThatExceptionOfType(CancellationException.class) + .isThrownBy(() -> future2.get(1000, TimeUnit.MILLISECONDS))); } @Test + @SuppressWarnings("deprecation") void submitListenableCallable() throws Exception { TestCallable task = new TestCallable(this.testName, 1); // Act - ListenableFuture future = executor.submitListenable(task); + org.springframework.util.concurrent.ListenableFuture future = executor.submitListenable(task); future.addCallback(result -> outcome = result, ex -> outcome = ex); // Assert Awaitility.await() @@ -274,10 +278,11 @@ abstract class AbstractSchedulingTaskExecutorTests { } @Test + @SuppressWarnings("deprecation") void submitFailingListenableCallable() throws Exception { TestCallable task = new TestCallable(this.testName, 0); // Act - ListenableFuture future = executor.submitListenable(task); + org.springframework.util.concurrent.ListenableFuture future = executor.submitListenable(task); future.addCallback(result -> outcome = result, ex -> outcome = ex); // Assert Awaitility.await() @@ -289,9 +294,10 @@ abstract class AbstractSchedulingTaskExecutorTests { } @Test + @SuppressWarnings("deprecation") void submitListenableCallableWithGetAfterShutdown() throws Exception { - ListenableFuture future1 = executor.submitListenable(new TestCallable(this.testName, -1)); - ListenableFuture future2 = executor.submitListenable(new TestCallable(this.testName, -1)); + org.springframework.util.concurrent.ListenableFuture future1 = executor.submitListenable(new TestCallable(this.testName, -1)); + org.springframework.util.concurrent.ListenableFuture future2 = executor.submitListenable(new TestCallable(this.testName, -1)); shutdownExecutor(); assertThatExceptionOfType(CancellationException.class).isThrownBy(() -> { future1.get(1000, TimeUnit.MILLISECONDS); diff --git a/spring-context/src/test/java/org/springframework/scheduling/concurrent/ConcurrentTaskExecutorTests.java b/spring-context/src/test/java/org/springframework/scheduling/concurrent/ConcurrentTaskExecutorTests.java index ca4a79d453..70830ce049 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/concurrent/ConcurrentTaskExecutorTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/concurrent/ConcurrentTaskExecutorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 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. @@ -24,7 +24,6 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; -import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.core.task.NoOpRunnable; import static org.assertj.core.api.Assertions.assertThatCode; @@ -40,7 +39,8 @@ class ConcurrentTaskExecutorTests extends AbstractSchedulingTaskExecutorTests { @Override - protected AsyncListenableTaskExecutor buildExecutor() { + @SuppressWarnings("deprecation") + protected org.springframework.core.task.AsyncListenableTaskExecutor buildExecutor() { concurrentExecutor.setThreadFactory(new CustomizableThreadFactory(this.threadNamePrefix)); return new ConcurrentTaskExecutor(concurrentExecutor); } diff --git a/spring-context/src/test/java/org/springframework/scheduling/concurrent/DecoratedThreadPoolTaskExecutorTests.java b/spring-context/src/test/java/org/springframework/scheduling/concurrent/DecoratedThreadPoolTaskExecutorTests.java index 6484b2c0e2..d946ff8bde 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/concurrent/DecoratedThreadPoolTaskExecutorTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/concurrent/DecoratedThreadPoolTaskExecutorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 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,7 +16,6 @@ package org.springframework.scheduling.concurrent; -import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.scheduling.support.DelegatingErrorHandlingRunnable; import org.springframework.scheduling.support.TaskUtils; @@ -27,7 +26,8 @@ import org.springframework.scheduling.support.TaskUtils; class DecoratedThreadPoolTaskExecutorTests extends AbstractSchedulingTaskExecutorTests { @Override - protected AsyncListenableTaskExecutor buildExecutor() { + @SuppressWarnings("deprecation") + protected org.springframework.core.task.AsyncListenableTaskExecutor buildExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setTaskDecorator(runnable -> new DelegatingErrorHandlingRunnable(runnable, TaskUtils.LOG_AND_PROPAGATE_ERROR_HANDLER)); diff --git a/spring-context/src/test/java/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutorTests.java b/spring-context/src/test/java/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutorTests.java index 0723a27abf..ba8430b878 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutorTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutorTests.java @@ -23,8 +23,6 @@ import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; -import org.springframework.core.task.AsyncListenableTaskExecutor; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -43,7 +41,8 @@ class ThreadPoolTaskExecutorTests extends AbstractSchedulingTaskExecutorTests { @Override - protected AsyncListenableTaskExecutor buildExecutor() { + @SuppressWarnings("deprecation") + protected org.springframework.core.task.AsyncListenableTaskExecutor buildExecutor() { executor.setThreadNamePrefix(this.threadNamePrefix); executor.setMaxPoolSize(1); executor.afterPropertiesSet(); diff --git a/spring-context/src/test/java/org/springframework/scheduling/concurrent/ThreadPoolTaskSchedulerTests.java b/spring-context/src/test/java/org/springframework/scheduling/concurrent/ThreadPoolTaskSchedulerTests.java index c86862316c..0bff61ceea 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/concurrent/ThreadPoolTaskSchedulerTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/concurrent/ThreadPoolTaskSchedulerTests.java @@ -27,7 +27,6 @@ import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; -import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.util.ErrorHandler; @@ -46,8 +45,9 @@ class ThreadPoolTaskSchedulerTests extends AbstractSchedulingTaskExecutorTests { private final ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); + @SuppressWarnings("deprecation") @Override - protected AsyncListenableTaskExecutor buildExecutor() { + protected org.springframework.core.task.AsyncListenableTaskExecutor buildExecutor() { scheduler.setThreadNamePrefix(this.threadNamePrefix); scheduler.afterPropertiesSet(); return scheduler; diff --git a/spring-core-test/src/main/java/org/springframework/aot/agent/InstrumentedMethod.java b/spring-core-test/src/main/java/org/springframework/aot/agent/InstrumentedMethod.java index ecded5755d..ab74ca02e6 100644 --- a/spring-core-test/src/main/java/org/springframework/aot/agent/InstrumentedMethod.java +++ b/spring-core-test/src/main/java/org/springframework/aot/agent/InstrumentedMethod.java @@ -33,11 +33,14 @@ import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; /** * Java method that is instrumented by the {@link RuntimeHintsAgent}. - *

All their {@link RecordedInvocation invocations are recorded} by the agent at runtime. - * We can then verify that the {@link RuntimeHints} configuration - * {@link #matcher(RecordedInvocation) is matching} the runtime behavior of the codebase. + * + *

All {@linkplain RecordedInvocation invocations are recorded} by the agent + * at runtime. We can then verify that the {@link RuntimeHints} configuration + * {@linkplain #matcher(RecordedInvocation) matches} the runtime behavior of the + * codebase. * * @author Brian Clozel + * @since 6.0 * @see RuntimeHintsPredicates */ enum InstrumentedMethod { @@ -390,8 +393,4 @@ enum InstrumentedMethod { return this.hintsMatcherGenerator.apply(invocation); } - private static Predicate hasReturnValue(RecordedInvocation invocation) { - return runtimeHints -> invocation.getReturnValue() != null; - } - } diff --git a/spring-core/src/test/java/org/springframework/util/concurrent/FutureAdapterTests.java b/spring-core/src/test/java/org/springframework/util/concurrent/FutureAdapterTests.java index 1ca2678043..a81adaae62 100644 --- a/spring-core/src/test/java/org/springframework/util/concurrent/FutureAdapterTests.java +++ b/spring-core/src/test/java/org/springframework/util/concurrent/FutureAdapterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -30,6 +30,7 @@ import static org.mockito.Mockito.mock; /** * @author Arjen Poutsma */ +@SuppressWarnings("deprecation") class FutureAdapterTests { private FutureAdapter adapter; @@ -50,7 +51,7 @@ class FutureAdapterTests { } @Test - void cancel() throws Exception { + void cancel() { given(adaptee.cancel(true)).willReturn(true); boolean result = adapter.cancel(true); assertThat(result).isTrue(); @@ -84,5 +85,4 @@ class FutureAdapterTests { assertThat(result).isEqualTo("42"); } - } diff --git a/spring-core/src/test/java/org/springframework/util/concurrent/ListenableFutureTaskTests.java b/spring-core/src/test/java/org/springframework/util/concurrent/ListenableFutureTaskTests.java index 469a355c15..75381f18d9 100644 --- a/spring-core/src/test/java/org/springframework/util/concurrent/ListenableFutureTaskTests.java +++ b/spring-core/src/test/java/org/springframework/util/concurrent/ListenableFutureTaskTests.java @@ -33,7 +33,7 @@ import static org.mockito.Mockito.verifyNoInteractions; * @author Arjen Poutsma * @author Sebastien Deleuze */ -@SuppressWarnings("unchecked") +@SuppressWarnings({ "unchecked", "deprecation" }) class ListenableFutureTaskTests { @Test diff --git a/spring-core/src/test/java/org/springframework/util/concurrent/MonoToListenableFutureAdapterTests.java b/spring-core/src/test/java/org/springframework/util/concurrent/MonoToListenableFutureAdapterTests.java index e40e8aa79e..7b527350d7 100644 --- a/spring-core/src/test/java/org/springframework/util/concurrent/MonoToListenableFutureAdapterTests.java +++ b/spring-core/src/test/java/org/springframework/util/concurrent/MonoToListenableFutureAdapterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -27,8 +27,10 @@ import static org.assertj.core.api.Assertions.assertThat; /** * Unit tests for {@link MonoToListenableFutureAdapter}. + * * @author Rossen Stoyanchev */ +@SuppressWarnings("deprecation") class MonoToListenableFutureAdapterTests { @Test @@ -42,6 +44,7 @@ class MonoToListenableFutureAdapterTests { } @Test + @SuppressWarnings("deprecation") void failure() { Throwable expected = new IllegalStateException("oops"); AtomicReference actual = new AtomicReference<>(); diff --git a/spring-core/src/test/java/org/springframework/util/concurrent/SettableListenableFutureTests.java b/spring-core/src/test/java/org/springframework/util/concurrent/SettableListenableFutureTests.java index 5f1c5e0410..300dd6c775 100644 --- a/spring-core/src/test/java/org/springframework/util/concurrent/SettableListenableFutureTests.java +++ b/spring-core/src/test/java/org/springframework/util/concurrent/SettableListenableFutureTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -36,6 +36,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; * @author Mattias Severson * @author Juergen Hoeller */ +@SuppressWarnings("deprecation") class SettableListenableFutureTests { private final SettableListenableFuture settableListenableFuture = new SettableListenableFuture<>(); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AsyncHandlerMethodReturnValueHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AsyncHandlerMethodReturnValueHandler.java index cd9a6abf16..02ff58ed56 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AsyncHandlerMethodReturnValueHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AsyncHandlerMethodReturnValueHandler.java @@ -20,13 +20,12 @@ import java.util.concurrent.CompletableFuture; import org.springframework.core.MethodParameter; import org.springframework.lang.Nullable; -import org.springframework.util.concurrent.CompletableToListenableFutureAdapter; -import org.springframework.util.concurrent.ListenableFuture; /** * An extension of {@link HandlerMethodReturnValueHandler} for handling async, * Future-like return value types that support success and error callbacks. - * Essentially anything that can be adapted to a {@link ListenableFuture}. + * Essentially anything that can be adapted to a + * {@link org.springframework.util.concurrent.ListenableFuture ListenableFuture}. * *

Implementations should consider extending the convenient base class * {@link AbstractAsyncReturnValueHandler}. @@ -52,8 +51,9 @@ public interface AsyncHandlerMethodReturnValueHandler extends HandlerMethodRetur boolean isAsyncReturnValue(Object returnValue, MethodParameter returnType); /** - * Adapt the asynchronous return value to a {@link ListenableFuture}. - * Implementations should consider returning an instance of + * Adapt the asynchronous return value to a + * {@link org.springframework.util.concurrent.ListenableFuture ListenableFuture}. + *

Implementations should consider returning an instance of * {@link org.springframework.util.concurrent.SettableListenableFuture * SettableListenableFuture}. Return value handling will then continue when * the ListenableFuture is completed with either success or error. @@ -69,14 +69,17 @@ public interface AsyncHandlerMethodReturnValueHandler extends HandlerMethodRetur */ @Deprecated @Nullable - default ListenableFuture toListenableFuture(Object returnValue, MethodParameter returnType) { + default org.springframework.util.concurrent.ListenableFuture toListenableFuture( + Object returnValue, MethodParameter returnType) { CompletableFuture result = toCompletableFuture(returnValue, returnType); - return (result != null) ? new CompletableToListenableFutureAdapter<>(result) : null; + return (result != null ? + new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>(result) : + null); } /** * Adapt the asynchronous return value to a {@link CompletableFuture}. - * Return value handling will then continue when + *

Return value handling will then continue when * the CompletableFuture is completed with either success or error. *

Note: this method will only be invoked after * {@link #supportsReturnType(org.springframework.core.MethodParameter)} diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandler.java index d7001f16a6..309c14ca91 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandler.java @@ -59,7 +59,6 @@ import org.springframework.messaging.handler.invocation.CompletableFutureReturnV import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver; import org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandler; import org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandlerComposite; -import org.springframework.messaging.handler.invocation.ListenableFutureReturnValueHandler; import org.springframework.messaging.handler.invocation.ReactiveReturnValueHandler; import org.springframework.messaging.simp.SimpAttributesContextHolder; import org.springframework.messaging.simp.SimpLogging; @@ -326,14 +325,14 @@ public class SimpAnnotationMethodMessageHandler extends AbstractMethodMessageHan return resolvers; } - @SuppressWarnings("deprecation") @Override + @SuppressWarnings("deprecation") protected List initReturnValueHandlers() { List handlers = new ArrayList<>(); // Single-purpose return value types - handlers.add(new ListenableFutureReturnValueHandler()); + handlers.add(new org.springframework.messaging.handler.invocation.ListenableFutureReturnValueHandler()); handlers.add(new CompletableFutureReturnValueHandler()); if (reactorPresent) { handlers.add(new ReactiveReturnValueHandler()); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/ConnectionHandlingStompSession.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/ConnectionHandlingStompSession.java index b1048f9116..750a37d52b 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/ConnectionHandlingStompSession.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/ConnectionHandlingStompSession.java @@ -18,9 +18,6 @@ package org.springframework.messaging.simp.stomp; import java.util.concurrent.CompletableFuture; -import org.springframework.util.concurrent.CompletableToListenableFutureAdapter; -import org.springframework.util.concurrent.ListenableFuture; - /** * A {@link StompSession} that implements * {@link org.springframework.messaging.tcp.TcpConnectionHandler @@ -39,8 +36,9 @@ public interface ConnectionHandlingStompSession extends StompSession, StompTcpCo * @deprecated as of 6.0, in favor of {@link #getSession()} */ @Deprecated - default ListenableFuture getSessionFuture() { - return new CompletableToListenableFutureAdapter<>(getSession()); + default org.springframework.util.concurrent.ListenableFuture getSessionFuture() { + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( + getSession()); } /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/ReactorNettyTcpStompClient.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/ReactorNettyTcpStompClient.java index 1c27d18bf5..5888555f3e 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/ReactorNettyTcpStompClient.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/ReactorNettyTcpStompClient.java @@ -23,8 +23,6 @@ import org.springframework.messaging.simp.SimpLogging; import org.springframework.messaging.tcp.TcpOperations; import org.springframework.messaging.tcp.reactor.ReactorNettyTcpClient; import org.springframework.util.Assert; -import org.springframework.util.concurrent.CompletableToListenableFutureAdapter; -import org.springframework.util.concurrent.ListenableFuture; /** * A STOMP over TCP client that uses {@link ReactorNettyTcpClient}. @@ -77,15 +75,17 @@ public class ReactorNettyTcpStompClient extends StompClientSupport { * @deprecated as of 6.0, in favor of {@link #connectAsync(StompSessionHandler)} */ @Deprecated - public ListenableFuture connect(StompSessionHandler handler) { - return new CompletableToListenableFutureAdapter<>(connectAsync(handler)); + public org.springframework.util.concurrent.ListenableFuture connect( + StompSessionHandler handler) { + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( + connectAsync(handler)); } /** * Connect and notify the given {@link StompSessionHandler} when connected * on the STOMP level. * @param handler the handler for the STOMP session - * @return a ListenableFuture for access to the session when ready for use + * @return a CompletableFuture for access to the session when ready for use * @since 6.0 */ public CompletableFuture connectAsync(StompSessionHandler handler) { @@ -101,7 +101,8 @@ public class ReactorNettyTcpStompClient extends StompClientSupport { * @deprecated as of 6.0, in favor of {@link #connectAsync(StompHeaders, StompSessionHandler)} */ @Deprecated - public ListenableFuture connect(@Nullable StompHeaders connectHeaders, StompSessionHandler handler) { + public org.springframework.util.concurrent.ListenableFuture connect( + @Nullable StompHeaders connectHeaders, StompSessionHandler handler) { ConnectionHandlingStompSession session = createSession(connectHeaders, handler); this.tcpClient.connectAsync(session); return session.getSessionFuture(); @@ -131,4 +132,5 @@ public class ReactorNettyTcpStompClient extends StompClientSupport { public String toString() { return "ReactorNettyTcpStompClient[" + this.tcpClient + "]"; } + } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java index 0ea8c90cb5..f50559e838 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java @@ -21,7 +21,6 @@ import java.time.Duration; import java.util.Collection; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @@ -1110,16 +1109,6 @@ public class StompBrokerRelayMessageHandler extends AbstractBrokerMessageHandler } - - private static class VoidCallable implements Callable { - - @Override - public Void call() { - return null; - } - } - - /** * Contract for access to session counters. * @since 5.2 diff --git a/spring-messaging/src/main/java/org/springframework/messaging/tcp/TcpConnection.java b/spring-messaging/src/main/java/org/springframework/messaging/tcp/TcpConnection.java index 5296e2f518..39790adf23 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/tcp/TcpConnection.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/tcp/TcpConnection.java @@ -20,8 +20,6 @@ import java.io.Closeable; import java.util.concurrent.CompletableFuture; import org.springframework.messaging.Message; -import org.springframework.util.concurrent.CompletableToListenableFutureAdapter; -import org.springframework.util.concurrent.ListenableFuture; /** * A contract for sending messages and managing a TCP connection. @@ -40,8 +38,9 @@ public interface TcpConnection

extends Closeable { * @deprecated as of 6.0, in favor of {@link #sendAsync(Message)} */ @Deprecated - default ListenableFuture send(Message

message) { - return new CompletableToListenableFutureAdapter<>(sendAsync(message)); + default org.springframework.util.concurrent.ListenableFuture send(Message

message) { + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( + sendAsync(message)); } /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/tcp/TcpOperations.java b/spring-messaging/src/main/java/org/springframework/messaging/tcp/TcpOperations.java index 57fd83f8cb..ddbaa3bd01 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/tcp/TcpOperations.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/tcp/TcpOperations.java @@ -18,15 +18,12 @@ package org.springframework.messaging.tcp; import java.util.concurrent.CompletableFuture; -import org.springframework.util.concurrent.CompletableToListenableFutureAdapter; -import org.springframework.util.concurrent.ListenableFuture; - /** * A contract for establishing TCP connections. * * @author Rossen Stoyanchev * @since 4.0 - * @param

the type of payload for in and outbound messages + * @param

the type of payload for inbound and outbound messages */ public interface TcpOperations

{ @@ -38,8 +35,10 @@ public interface TcpOperations

{ * @deprecated as of 6.0, in favor of {@link #connectAsync(TcpConnectionHandler)} */ @Deprecated - default ListenableFuture connect(TcpConnectionHandler

connectionHandler) { - return new CompletableToListenableFutureAdapter<>(connectAsync(connectionHandler)); + default org.springframework.util.concurrent.ListenableFuture connect( + TcpConnectionHandler

connectionHandler) { + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( + connectAsync(connectionHandler)); } /** @@ -60,8 +59,10 @@ public interface TcpOperations

{ * @deprecated as of 6.0, in favor of {@link #connectAsync(TcpConnectionHandler, ReconnectStrategy)} */ @Deprecated - default ListenableFuture connect(TcpConnectionHandler

connectionHandler, ReconnectStrategy reconnectStrategy) { - return new CompletableToListenableFutureAdapter<>(connectAsync(connectionHandler, reconnectStrategy)); + default org.springframework.util.concurrent.ListenableFuture connect( + TcpConnectionHandler

connectionHandler, ReconnectStrategy reconnectStrategy) { + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( + connectAsync(connectionHandler, reconnectStrategy)); } /** @@ -81,13 +82,14 @@ public interface TcpOperations

{ * @deprecated as of 6.0, in favor of {@link #shutdownAsync()} */ @Deprecated - default ListenableFuture shutdown() { - return new CompletableToListenableFutureAdapter<>(shutdownAsync()); + default org.springframework.util.concurrent.ListenableFuture shutdown() { + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( + shutdownAsync()); } /** * Shut down and close any open connections. - * @return a ListenableFuture that can be used to determine when and if the + * @return a CompletableFuture that can be used to determine when and if the * connection is successfully closed * @since 6.0 */ diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandlerTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandlerTests.java index 9e4ab0e3ab..3c607e6b3e 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandlerTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandlerTests.java @@ -61,7 +61,6 @@ import org.springframework.messaging.simp.annotation.SubscribeMapping; import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Controller; import org.springframework.util.AntPathMatcher; -import org.springframework.util.concurrent.ListenableFutureTask; import org.springframework.validation.Errors; import org.springframework.validation.Validator; import org.springframework.validation.annotation.Validated; @@ -538,19 +537,19 @@ public class SimpAnnotationMethodMessageHandlerTests { @SuppressWarnings("deprecation") private static class ListenableFutureController { - private ListenableFutureTask future; + private org.springframework.util.concurrent.ListenableFutureTask future; private boolean exceptionCaught = false; @MessageMapping("success") - public ListenableFutureTask handleListenableFuture() { - this.future = new ListenableFutureTask<>(() -> "foo"); + public org.springframework.util.concurrent.ListenableFutureTask handleListenableFuture() { + this.future = new org.springframework.util.concurrent.ListenableFutureTask<>(() -> "foo"); return this.future; } @MessageMapping("failure") - public ListenableFutureTask handleListenableFutureException() { - this.future = new ListenableFutureTask<>(() -> { + public org.springframework.util.concurrent.ListenableFutureTask handleListenableFutureException() { + this.future = new org.springframework.util.concurrent.ListenableFutureTask<>(() -> { throw new IllegalStateException(); }); return this.future; diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/samples/client/standalone/AsyncTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/samples/client/standalone/AsyncTests.java index 674dc80fa0..0b0022d6c0 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/samples/client/standalone/AsyncTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/samples/client/standalone/AsyncTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -30,8 +30,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.test.web.Person; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.servlet.client.MockMvcWebTestClient; -import org.springframework.util.concurrent.ListenableFuture; -import org.springframework.util.concurrent.ListenableFutureTask; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -46,14 +44,14 @@ import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBo * * @author Rossen Stoyanchev */ -public class AsyncTests { +class AsyncTests { private final WebTestClient testClient = MockMvcWebTestClient.bindToController(new AsyncController()).build(); @Test - public void callable() { + void callable() { this.testClient.get() .uri("/1?callable=true") .exchange() @@ -63,7 +61,7 @@ public class AsyncTests { } @Test - public void streaming() { + void streaming() { this.testClient.get() .uri("/1?streaming=true") .exchange() @@ -72,7 +70,7 @@ public class AsyncTests { } @Test - public void streamingSlow() { + void streamingSlow() { this.testClient.get() .uri("/1?streamingSlow=true") .exchange() @@ -81,7 +79,7 @@ public class AsyncTests { } @Test - public void streamingJson() { + void streamingJson() { this.testClient.get() .uri("/1?streamingJson=true") .exchange() @@ -91,7 +89,7 @@ public class AsyncTests { } @Test - public void deferredResult() { + void deferredResult() { this.testClient.get() .uri("/1?deferredResult=true") .exchange() @@ -101,7 +99,7 @@ public class AsyncTests { } @Test - public void deferredResultWithImmediateValue() { + void deferredResultWithImmediateValue() { this.testClient.get() .uri("/1?deferredResultWithImmediateValue=true") .exchange() @@ -111,7 +109,7 @@ public class AsyncTests { } @Test - public void deferredResultWithDelayedError() { + void deferredResultWithDelayedError() { this.testClient.get() .uri("/1?deferredResultWithDelayedError=true") .exchange() @@ -120,7 +118,7 @@ public class AsyncTests { } @Test - public void listenableFuture() { + void listenableFuture() { this.testClient.get() .uri("/1?listenableFuture=true") .exchange() @@ -130,7 +128,7 @@ public class AsyncTests { } @Test - public void completableFutureWithImmediateValue() throws Exception { + void completableFutureWithImmediateValue() throws Exception { this.testClient.get() .uri("/1?completableFutureWithImmediateValue=true") .exchange() @@ -145,17 +143,17 @@ public class AsyncTests { private static class AsyncController { @GetMapping(params = "callable") - public Callable getCallable() { + Callable getCallable() { return () -> new Person("Joe"); } @GetMapping(params = "streaming") - public StreamingResponseBody getStreaming() { + StreamingResponseBody getStreaming() { return os -> os.write("name=Joe".getBytes(StandardCharsets.UTF_8)); } @GetMapping(params = "streamingSlow") - public StreamingResponseBody getStreamingSlow() { + StreamingResponseBody getStreamingSlow() { return os -> { os.write("name=Joe".getBytes()); try { @@ -169,41 +167,43 @@ public class AsyncTests { } @GetMapping(params = "streamingJson") - public ResponseEntity getStreamingJson() { + ResponseEntity getStreamingJson() { return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON) .body(os -> os.write("{\"name\":\"Joe\",\"someDouble\":0.5}".getBytes(StandardCharsets.UTF_8))); } @GetMapping(params = "deferredResult") - public DeferredResult getDeferredResult() { + DeferredResult getDeferredResult() { DeferredResult result = new DeferredResult<>(); delay(100, () -> result.setResult(new Person("Joe"))); return result; } @GetMapping(params = "deferredResultWithImmediateValue") - public DeferredResult getDeferredResultWithImmediateValue() { + DeferredResult getDeferredResultWithImmediateValue() { DeferredResult result = new DeferredResult<>(); result.setResult(new Person("Joe")); return result; } @GetMapping(params = "deferredResultWithDelayedError") - public DeferredResult getDeferredResultWithDelayedError() { + DeferredResult getDeferredResultWithDelayedError() { DeferredResult result = new DeferredResult<>(); delay(100, () -> result.setErrorResult(new RuntimeException("Delayed Error"))); return result; } @GetMapping(params = "listenableFuture") - public ListenableFuture getListenableFuture() { - ListenableFutureTask futureTask = new ListenableFutureTask<>(() -> new Person("Joe")); + @SuppressWarnings("deprecation") + org.springframework.util.concurrent.ListenableFuture getListenableFuture() { + org.springframework.util.concurrent.ListenableFutureTask futureTask = + new org.springframework.util.concurrent.ListenableFutureTask<>(() -> new Person("Joe")); delay(100, futureTask); return futureTask; } @GetMapping(params = "completableFutureWithImmediateValue") - public CompletableFuture getCompletableFutureWithImmediateValue() { + CompletableFuture getCompletableFutureWithImmediateValue() { CompletableFuture future = new CompletableFuture<>(); future.complete(new Person("Joe")); return future; @@ -211,7 +211,7 @@ public class AsyncTests { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public String errorHandler(Exception ex) { + String errorHandler(Exception ex) { return ex.getMessage(); } diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/AsyncTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/AsyncTests.java index 1f343fb17b..81da63c113 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/AsyncTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/AsyncTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 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. @@ -31,8 +31,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.test.web.Person; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; -import org.springframework.util.concurrent.ListenableFuture; -import org.springframework.util.concurrent.ListenableFutureTask; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseStatus; @@ -58,7 +56,7 @@ import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standal * @author Sam Brannen * @author Jacek Suchenia */ -public class AsyncTests { +class AsyncTests { private final AsyncController asyncController = new AsyncController(); @@ -66,7 +64,7 @@ public class AsyncTests { @Test - public void callable() throws Exception { + void callable() throws Exception { MvcResult mvcResult = this.mockMvc.perform(get("/1").param("callable", "true")) .andExpect(request().asyncStarted()) .andExpect(request().asyncResult(equalTo(new Person("Joe")))) @@ -80,7 +78,7 @@ public class AsyncTests { } @Test - public void streaming() throws Exception { + void streaming() throws Exception { this.mockMvc.perform(get("/1").param("streaming", "true")) .andExpect(request().asyncStarted()) .andDo(MvcResult::getAsyncResult) // fetch async result similar to "asyncDispatch" builder @@ -89,7 +87,7 @@ public class AsyncTests { } @Test - public void streamingSlow() throws Exception { + void streamingSlow() throws Exception { this.mockMvc.perform(get("/1").param("streamingSlow", "true")) .andExpect(request().asyncStarted()) .andDo(MvcResult::getAsyncResult) @@ -98,7 +96,7 @@ public class AsyncTests { } @Test - public void streamingJson() throws Exception { + void streamingJson() throws Exception { this.mockMvc.perform(get("/1").param("streamingJson", "true")) .andExpect(request().asyncStarted()) .andDo(MvcResult::getAsyncResult) @@ -108,7 +106,7 @@ public class AsyncTests { } @Test - public void deferredResult() throws Exception { + void deferredResult() throws Exception { MvcResult mvcResult = this.mockMvc.perform(get("/1").param("deferredResult", "true")) .andExpect(request().asyncStarted()) .andReturn(); @@ -120,7 +118,7 @@ public class AsyncTests { } @Test - public void deferredResultWithImmediateValue() throws Exception { + void deferredResultWithImmediateValue() throws Exception { MvcResult mvcResult = this.mockMvc.perform(get("/1").param("deferredResultWithImmediateValue", "true")) .andExpect(request().asyncStarted()) .andExpect(request().asyncResult(new Person("Joe"))) @@ -133,7 +131,7 @@ public class AsyncTests { } @Test // SPR-13079 - public void deferredResultWithDelayedError() throws Exception { + void deferredResultWithDelayedError() throws Exception { MvcResult mvcResult = this.mockMvc.perform(get("/1").param("deferredResultWithDelayedError", "true")) .andExpect(request().asyncStarted()) .andReturn(); @@ -144,7 +142,7 @@ public class AsyncTests { } @Test - public void listenableFuture() throws Exception { + void listenableFuture() throws Exception { MvcResult mvcResult = this.mockMvc.perform(get("/1").param("listenableFuture", "true")) .andExpect(request().asyncStarted()) .andReturn(); @@ -156,7 +154,7 @@ public class AsyncTests { } @Test // SPR-12597 - public void completableFutureWithImmediateValue() throws Exception { + void completableFutureWithImmediateValue() throws Exception { MvcResult mvcResult = this.mockMvc.perform(get("/1").param("completableFutureWithImmediateValue", "true")) .andExpect(request().asyncStarted()) .andReturn(); @@ -168,7 +166,7 @@ public class AsyncTests { } @Test // SPR-12735 - public void printAsyncResult() throws Exception { + void printAsyncResult() throws Exception { StringWriter writer = new StringWriter(); MvcResult mvcResult = this.mockMvc.perform(get("/1").param("deferredResult", "true")) @@ -194,17 +192,17 @@ public class AsyncTests { private static class AsyncController { @RequestMapping(params = "callable") - public Callable getCallable() { + Callable getCallable() { return () -> new Person("Joe"); } @RequestMapping(params = "streaming") - public StreamingResponseBody getStreaming() { + StreamingResponseBody getStreaming() { return os -> os.write("name=Joe".getBytes(StandardCharsets.UTF_8)); } @RequestMapping(params = "streamingSlow") - public StreamingResponseBody getStreamingSlow() { + StreamingResponseBody getStreamingSlow() { return os -> { os.write("name=Joe".getBytes()); try { @@ -218,41 +216,43 @@ public class AsyncTests { } @RequestMapping(params = "streamingJson") - public ResponseEntity getStreamingJson() { + ResponseEntity getStreamingJson() { return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON) .body(os -> os.write("{\"name\":\"Joe\",\"someDouble\":0.5}".getBytes(StandardCharsets.UTF_8))); } @RequestMapping(params = "deferredResult") - public DeferredResult getDeferredResult() { + DeferredResult getDeferredResult() { DeferredResult result = new DeferredResult<>(); delay(100, () -> result.setResult(new Person("Joe"))); return result; } @RequestMapping(params = "deferredResultWithImmediateValue") - public DeferredResult getDeferredResultWithImmediateValue() { + DeferredResult getDeferredResultWithImmediateValue() { DeferredResult deferredResult = new DeferredResult<>(); deferredResult.setResult(new Person("Joe")); return deferredResult; } @RequestMapping(params = "deferredResultWithDelayedError") - public DeferredResult getDeferredResultWithDelayedError() { + DeferredResult getDeferredResultWithDelayedError() { DeferredResult result = new DeferredResult<>(); delay(100, () -> result.setErrorResult(new RuntimeException("Delayed Error"))); return result; } @RequestMapping(params = "listenableFuture") - public ListenableFuture getListenableFuture() { - ListenableFutureTask futureTask = new ListenableFutureTask<>(() -> new Person("Joe")); + @SuppressWarnings("deprecation") + org.springframework.util.concurrent.ListenableFuture getListenableFuture() { + org.springframework.util.concurrent.ListenableFutureTask futureTask = + new org.springframework.util.concurrent.ListenableFutureTask<>(() -> new Person("Joe")); delay(100, futureTask); return futureTask; } @RequestMapping(params = "completableFutureWithImmediateValue") - public CompletableFuture getCompletableFutureWithImmediateValue() { + CompletableFuture getCompletableFutureWithImmediateValue() { CompletableFuture future = new CompletableFuture<>(); future.complete(new Person("Joe")); return future; @@ -260,7 +260,7 @@ public class AsyncTests { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public String errorHandler(Exception ex) { + String errorHandler(Exception ex) { return ex.getMessage(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/DeferredResultMethodReturnValueHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/DeferredResultMethodReturnValueHandler.java index 9eebe5467d..2fa01bc58f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/DeferredResultMethodReturnValueHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/DeferredResultMethodReturnValueHandler.java @@ -21,8 +21,6 @@ import java.util.concurrent.CompletionStage; import org.springframework.core.MethodParameter; import org.springframework.lang.Nullable; -import org.springframework.util.concurrent.ListenableFuture; -import org.springframework.util.concurrent.ListenableFutureCallback; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.async.DeferredResult; import org.springframework.web.context.request.async.WebAsyncUtils; @@ -31,7 +29,8 @@ import org.springframework.web.method.support.ModelAndViewContainer; /** * Handler for return values of type {@link DeferredResult}, - * {@link ListenableFuture}, and {@link CompletionStage}. + * {@link org.springframework.util.concurrent.ListenableFuture}, and + * {@link CompletionStage}. * * @author Rossen Stoyanchev * @since 3.2 @@ -43,7 +42,7 @@ public class DeferredResultMethodReturnValueHandler implements HandlerMethodRetu public boolean supportsReturnType(MethodParameter returnType) { Class type = returnType.getParameterType(); return (DeferredResult.class.isAssignableFrom(type) || - ListenableFuture.class.isAssignableFrom(type) || + org.springframework.util.concurrent.ListenableFuture.class.isAssignableFrom(type) || CompletionStage.class.isAssignableFrom(type)); } @@ -59,14 +58,14 @@ public class DeferredResultMethodReturnValueHandler implements HandlerMethodRetu DeferredResult result; - if (returnValue instanceof DeferredResult) { - result = (DeferredResult) returnValue; + if (returnValue instanceof DeferredResult deferredResult) { + result = deferredResult; } - else if (returnValue instanceof ListenableFuture) { - result = adaptListenableFuture((ListenableFuture) returnValue); + else if (returnValue instanceof org.springframework.util.concurrent.ListenableFuture listenableFuture) { + result = adaptListenableFuture(listenableFuture); } - else if (returnValue instanceof CompletionStage) { - result = adaptCompletionStage((CompletionStage) returnValue); + else if (returnValue instanceof CompletionStage completionStage) { + result = adaptCompletionStage(completionStage); } else { // Should not happen... @@ -77,9 +76,9 @@ public class DeferredResultMethodReturnValueHandler implements HandlerMethodRetu } @SuppressWarnings("deprecation") - private DeferredResult adaptListenableFuture(ListenableFuture future) { + private DeferredResult adaptListenableFuture(org.springframework.util.concurrent.ListenableFuture future) { DeferredResult result = new DeferredResult<>(); - future.addCallback(new ListenableFutureCallback() { + future.addCallback(new org.springframework.util.concurrent.ListenableFutureCallback() { @Override public void onSuccess(@Nullable Object value) { result.setResult(value); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/DeferredResultReturnValueHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/DeferredResultReturnValueHandlerTests.java index de831afa59..2b10e48331 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/DeferredResultReturnValueHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/DeferredResultReturnValueHandlerTests.java @@ -22,8 +22,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.core.MethodParameter; -import org.springframework.util.concurrent.ListenableFuture; -import org.springframework.util.concurrent.SettableListenableFuture; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.context.request.async.AsyncWebRequest; @@ -65,12 +63,13 @@ public class DeferredResultReturnValueHandlerTests { @Test + @SuppressWarnings("deprecation") public void supportsReturnType() throws Exception { assertThat(this.handler.supportsReturnType( on(TestController.class).resolveReturnType(DeferredResult.class, String.class))).isTrue(); assertThat(this.handler.supportsReturnType( - on(TestController.class).resolveReturnType(ListenableFuture.class, String.class))).isTrue(); + on(TestController.class).resolveReturnType(org.springframework.util.concurrent.ListenableFuture.class, String.class))).isTrue(); assertThat(this.handler.supportsReturnType( on(TestController.class).resolveReturnType(CompletableFuture.class, String.class))).isTrue(); @@ -91,8 +90,10 @@ public class DeferredResultReturnValueHandlerTests { @Test @SuppressWarnings("deprecation") public void listenableFuture() throws Exception { - SettableListenableFuture future = new SettableListenableFuture<>(); - testHandle(future, ListenableFuture.class, () -> future.set("foo"), "foo"); + org.springframework.util.concurrent.SettableListenableFuture future = + new org.springframework.util.concurrent.SettableListenableFuture<>(); + testHandle(future, org.springframework.util.concurrent.ListenableFuture.class, + () -> future.set("foo"), "foo"); } @Test @@ -110,9 +111,11 @@ public class DeferredResultReturnValueHandlerTests { @Test @SuppressWarnings("deprecation") public void listenableFutureWithError() throws Exception { - SettableListenableFuture future = new SettableListenableFuture<>(); + org.springframework.util.concurrent.SettableListenableFuture future = + new org.springframework.util.concurrent.SettableListenableFuture<>(); IllegalStateException ex = new IllegalStateException(); - testHandle(future, ListenableFuture.class, () -> future.setException(ex), ex); + testHandle(future, org.springframework.util.concurrent.ListenableFuture.class, + () -> future.setException(ex), ex); } @Test @@ -147,7 +150,8 @@ public class DeferredResultReturnValueHandlerTests { DeferredResult handleDeferredResult() { return null; } - ListenableFuture handleListenableFuture() { return null; } + @SuppressWarnings("deprecation") + org.springframework.util.concurrent.ListenableFuture handleListenableFuture() { return null; } CompletableFuture handleCompletableFuture() { return null; } } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/AbstractWebSocketClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/AbstractWebSocketClient.java index 433a04e0b7..1c5be1a51a 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/AbstractWebSocketClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/AbstractWebSocketClient.java @@ -18,7 +18,6 @@ package org.springframework.web.socket.client; import java.net.URI; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -30,7 +29,6 @@ import org.apache.commons.logging.LogFactory; import org.springframework.http.HttpHeaders; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.concurrent.ListenableFuture; import org.springframework.web.socket.WebSocketExtension; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketHttpHeaders; @@ -45,19 +43,16 @@ import org.springframework.web.util.UriComponentsBuilder; */ public abstract class AbstractWebSocketClient implements WebSocketClient { - private static final Set specialHeaders = new HashSet<>(); - - static { - specialHeaders.add("cache-control"); - specialHeaders.add("connection"); - specialHeaders.add("host"); - specialHeaders.add("sec-websocket-extensions"); - specialHeaders.add("sec-websocket-key"); - specialHeaders.add("sec-websocket-protocol"); - specialHeaders.add("sec-websocket-version"); - specialHeaders.add("pragma"); - specialHeaders.add("upgrade"); - } + private static final Set specialHeaders = Set.of( + "cache-control", + "connection", + "host", + "sec-websocket-extensions", + "sec-websocket-key", + "sec-websocket-protocol", + "sec-websocket-version", + "pragma", + "upgrade"); protected final Log logger = LogFactory.getLog(getClass()); @@ -119,13 +114,14 @@ public abstract class AbstractWebSocketClient implements WebSocketClient { * @param extensions requested WebSocket extensions, or an empty list * @param attributes the attributes to associate with the WebSocketSession, i.e. via * {@link WebSocketSession#getAttributes()}; currently always an empty map. - * @return the established WebSocket session wrapped in a ListenableFuture. + * @return the established WebSocket session wrapped in a {@code ListenableFuture}. * @deprecated as of 6.0, in favor of {@link #executeInternal(WebSocketHandler, HttpHeaders, URI, List, List, Map)} */ @Deprecated - protected ListenableFuture doHandshakeInternal(WebSocketHandler webSocketHandler, - HttpHeaders headers, URI uri, List subProtocols, List extensions, - Map attributes) { + protected org.springframework.util.concurrent.ListenableFuture doHandshakeInternal( + WebSocketHandler webSocketHandler, HttpHeaders headers, URI uri, List subProtocols, + List extensions, Map attributes) { + throw new UnsupportedOperationException("doHandshakeInternal is deprecated in favor of executeInternal"); } @@ -138,8 +134,8 @@ public abstract class AbstractWebSocketClient implements WebSocketClient { * @param subProtocols requested sub-protocols, or an empty list * @param extensions requested WebSocket extensions, or an empty list * @param attributes the attributes to associate with the WebSocketSession, i.e. via - * {@link WebSocketSession#getAttributes()}; currently always an empty map. - * @return the established WebSocket session wrapped in a ListenableFuture. + * {@link WebSocketSession#getAttributes()}; currently always an empty map + * @return the established WebSocket session wrapped in a {@code CompletableFuture}. */ protected abstract CompletableFuture executeInternal(WebSocketHandler webSocketHandler, HttpHeaders headers, URI uri, List subProtocols, List extensions, diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketClient.java index 8b61d8d0a1..1efd7688c1 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/WebSocketClient.java @@ -20,8 +20,6 @@ import java.net.URI; import java.util.concurrent.CompletableFuture; import org.springframework.lang.Nullable; -import org.springframework.util.concurrent.CompletableToListenableFutureAdapter; -import org.springframework.util.concurrent.ListenableFuture; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketHttpHeaders; import org.springframework.web.socket.WebSocketSession; @@ -47,9 +45,10 @@ public interface WebSocketClient { * @deprecated as of 6.0, in favor of {@link #execute(WebSocketHandler, String, Object...)} */ @Deprecated - default ListenableFuture doHandshake(WebSocketHandler webSocketHandler, - String uriTemplate, Object... uriVariables) { - return new CompletableToListenableFutureAdapter<>(execute(webSocketHandler, uriTemplate, uriVariables)); + default org.springframework.util.concurrent.ListenableFuture doHandshake( + WebSocketHandler webSocketHandler, String uriTemplate, Object... uriVariables) { + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( + execute(webSocketHandler, uriTemplate, uriVariables)); } /** @@ -73,9 +72,10 @@ public interface WebSocketClient { * @deprecated as of 6.0, in favor of {@link #execute(WebSocketHandler, WebSocketHttpHeaders, URI)} */ @Deprecated - default ListenableFuture doHandshake(WebSocketHandler webSocketHandler, - @Nullable WebSocketHttpHeaders headers, URI uri) { - return new CompletableToListenableFutureAdapter<>(execute(webSocketHandler, headers, uri)); + default org.springframework.util.concurrent.ListenableFuture doHandshake( + WebSocketHandler webSocketHandler, @Nullable WebSocketHttpHeaders headers, URI uri) { + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( + execute(webSocketHandler, headers, uri)); } /** diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java index d5c27a5cfd..96d0854c3a 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java @@ -30,10 +30,8 @@ import org.eclipse.jetty.websocket.client.ClientUpgradeRequest; import org.eclipse.jetty.websocket.client.WebSocketClient; import org.springframework.context.Lifecycle; -import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.SimpleAsyncTaskExecutor; -import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpHeaders; import org.springframework.lang.Nullable; import org.springframework.util.concurrent.FutureUtils; @@ -84,8 +82,8 @@ public class JettyWebSocketClient extends AbstractWebSocketClient implements Lif /** - * Set an {@link AsyncListenableTaskExecutor} to use when opening connections. - * If this property is set to {@code null}, calls to any of the + * Set an {@link AsyncTaskExecutor} to use when opening connections. + *

If this property is set to {@code null}, calls to any of the * {@code doHandshake} methods will block until the connection is established. *

By default an instance of {@code SimpleAsyncTaskExecutor} is used. */ @@ -94,7 +92,7 @@ public class JettyWebSocketClient extends AbstractWebSocketClient implements Lif } /** - * Return the configured {@link TaskExecutor}. + * Return the configured {@link AsyncTaskExecutor}. */ @Nullable public AsyncTaskExecutor getTaskExecutor() { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java index 6f4d409098..f22c4e842b 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java @@ -36,10 +36,8 @@ import jakarta.websocket.Extension; import jakarta.websocket.HandshakeResponse; import jakarta.websocket.WebSocketContainer; -import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.SimpleAsyncTaskExecutor; -import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpHeaders; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -109,8 +107,8 @@ public class StandardWebSocketClient extends AbstractWebSocketClient { } /** - * Set an {@link AsyncListenableTaskExecutor} to use when opening connections. - * If this property is set to {@code null}, calls to any of the + * Set an {@link AsyncTaskExecutor} to use when opening connections. + *

If this property is set to {@code null}, calls to any of the * {@code doHandshake} methods will block until the connection is established. *

By default, an instance of {@code SimpleAsyncTaskExecutor} is used. */ @@ -119,7 +117,7 @@ public class StandardWebSocketClient extends AbstractWebSocketClient { } /** - * Return the configured {@link TaskExecutor}. + * Return the configured {@link AsyncTaskExecutor}. */ @Nullable public AsyncTaskExecutor getTaskExecutor() { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java index 1bc75bb1d5..db02dbefdf 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java @@ -49,8 +49,6 @@ import org.springframework.messaging.tcp.TcpConnectionHandler; import org.springframework.scheduling.TaskScheduler; import org.springframework.util.Assert; import org.springframework.util.MimeTypeUtils; -import org.springframework.util.concurrent.CompletableToListenableFutureAdapter; -import org.springframework.util.concurrent.ListenableFuture; import org.springframework.web.socket.BinaryMessage; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; @@ -210,12 +208,15 @@ public class WebSocketStompClient extends StompClientSupport implements SmartLif * @param url the url to connect to * @param handler the session handler * @param uriVars the URI variables to expand into the URL - * @return a ListenableFuture for access to the session when ready for use + * @return a {@code ListenableFuture} for access to the session when ready for use * @deprecated as of 6.0, in favor of {@link #connectAsync(String, StompSessionHandler, Object...)} */ @Deprecated - public ListenableFuture connect(String url, StompSessionHandler handler, Object... uriVars) { - return new CompletableToListenableFutureAdapter<>(connectAsync(url, handler, uriVars)); + public org.springframework.util.concurrent.ListenableFuture connect( + String url, StompSessionHandler handler, Object... uriVars) { + + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( + connectAsync(url, handler, uriVars)); } /** @@ -240,14 +241,15 @@ public class WebSocketStompClient extends StompClientSupport implements SmartLif * @param handshakeHeaders the headers for the WebSocket handshake * @param handler the session handler * @param uriVariables the URI variables to expand into the URL - * @return a ListenableFuture for access to the session when ready for use + * @return a {@code ListenableFuture} for access to the session when ready for use * @deprecated as of 6.0, in favor of {@link #connectAsync(String, WebSocketHttpHeaders, StompSessionHandler, Object...)} */ @Deprecated - public ListenableFuture connect(String url, @Nullable WebSocketHttpHeaders handshakeHeaders, + public org.springframework.util.concurrent.ListenableFuture connect( + String url, @Nullable WebSocketHttpHeaders handshakeHeaders, StompSessionHandler handler, Object... uriVariables) { - return new CompletableToListenableFutureAdapter<>( + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( connectAsync(url, handshakeHeaders, null, handler, uriVariables)); } @@ -259,7 +261,7 @@ public class WebSocketStompClient extends StompClientSupport implements SmartLif * @param handshakeHeaders the headers for the WebSocket handshake * @param handler the session handler * @param uriVariables the URI variables to expand into the URL - * @return a ListenableFuture for access to the session when ready for use + * @return a {@code ListenableFuture} for access to the session when ready for use * @since 6.0 */ public CompletableFuture connectAsync(String url, @Nullable WebSocketHttpHeaders handshakeHeaders, @@ -278,14 +280,15 @@ public class WebSocketStompClient extends StompClientSupport implements SmartLif * @param connectHeaders headers for the STOMP CONNECT frame * @param handler the session handler * @param uriVariables the URI variables to expand into the URL - * @return a ListenableFuture for access to the session when ready for use + * @return a {@code ListenableFuture} for access to the session when ready for use * @deprecated as of 6.0, in favor of {@link #connectAsync(String, WebSocketHttpHeaders, StompHeaders, StompSessionHandler, Object...)} */ @Deprecated - public ListenableFuture connect(String url, @Nullable WebSocketHttpHeaders handshakeHeaders, + public org.springframework.util.concurrent.ListenableFuture connect( + String url, @Nullable WebSocketHttpHeaders handshakeHeaders, @Nullable StompHeaders connectHeaders, StompSessionHandler handler, Object... uriVariables) { - return new CompletableToListenableFutureAdapter<>( + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( connectAsync(url, handshakeHeaders, connectHeaders, handler, uriVariables)); } @@ -318,14 +321,15 @@ public class WebSocketStompClient extends StompClientSupport implements SmartLif * @param handshakeHeaders the headers for the WebSocket handshake * @param connectHeaders headers for the STOMP CONNECT frame * @param sessionHandler the STOMP session handler - * @return a ListenableFuture for access to the session when ready for use + * @return a {@code ListenableFuture} for access to the session when ready for use * @deprecated as of 6.0, in favor of {@link #connectAsync(URI, WebSocketHttpHeaders, StompHeaders, StompSessionHandler)} */ @Deprecated - public ListenableFuture connect(URI url, @Nullable WebSocketHttpHeaders handshakeHeaders, + public org.springframework.util.concurrent.ListenableFuture connect( + URI url, @Nullable WebSocketHttpHeaders handshakeHeaders, @Nullable StompHeaders connectHeaders, StompSessionHandler sessionHandler) { - return new CompletableToListenableFutureAdapter<>( + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( connectAsync(url, handshakeHeaders, connectHeaders, sessionHandler)); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java index 8093907f29..0b8c3d3d84 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java @@ -29,7 +29,6 @@ import org.apache.commons.logging.LogFactory; import org.springframework.http.HttpHeaders; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.concurrent.SettableListenableFuture; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketHandler; @@ -40,9 +39,11 @@ import org.springframework.web.socket.sockjs.frame.SockJsMessageCodec; /** * Base class for SockJS client implementations of {@link WebSocketSession}. - * Provides processing of incoming SockJS message frames and delegates lifecycle + * + *

Provides processing of incoming SockJS message frames and delegates lifecycle * events and messages to the (application) {@link WebSocketHandler}. - * Sub-classes implement actual send as well as disconnect logic. + * + *

Subclasses implement actual send as well as disconnect logic. * * @author Rossen Stoyanchev * @author Juergen Hoeller @@ -72,7 +73,7 @@ public abstract class AbstractClientSockJsSession implements WebSocketSession { */ @Deprecated protected AbstractClientSockJsSession(TransportRequest request, WebSocketHandler handler, - SettableListenableFuture connectFuture) { + org.springframework.util.concurrent.SettableListenableFuture connectFuture) { this(request, handler, connectFuture.completable()); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractXhrTransport.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractXhrTransport.java index c4d4b28b06..0b5a8de704 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractXhrTransport.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractXhrTransport.java @@ -29,7 +29,6 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.lang.Nullable; -import org.springframework.util.concurrent.SettableListenableFuture; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketHandler; @@ -112,7 +111,7 @@ public abstract class AbstractXhrTransport implements XhrTransport { @Deprecated protected void connectInternal(TransportRequest request, WebSocketHandler handler, URI receiveUrl, HttpHeaders handshakeHeaders, XhrClientSockJsSession session, - SettableListenableFuture connectFuture) { + org.springframework.util.concurrent.SettableListenableFuture connectFuture) { throw new UnsupportedOperationException("connectInternal has been deprecated in favor of connectInternal"); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/DefaultTransportRequest.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/DefaultTransportRequest.java index 83c05c5bac..b637acbb01 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/DefaultTransportRequest.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/DefaultTransportRequest.java @@ -33,8 +33,6 @@ import org.springframework.http.HttpHeaders; import org.springframework.lang.Nullable; import org.springframework.scheduling.TaskScheduler; import org.springframework.util.Assert; -import org.springframework.util.concurrent.ListenableFutureCallback; -import org.springframework.util.concurrent.SettableListenableFuture; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.sockjs.SockJsTransportFailureException; @@ -149,7 +147,9 @@ class DefaultTransportRequest implements TransportRequest { @Deprecated - public void connect(WebSocketHandler handler, SettableListenableFuture future) { + public void connect(WebSocketHandler handler, + org.springframework.util.concurrent.SettableListenableFuture future) { + if (logger.isTraceEnabled()) { logger.trace("Starting " + this); } @@ -208,15 +208,17 @@ class DefaultTransportRequest implements TransportRequest { * callback. */ @SuppressWarnings("deprecation") - private class ListenableConnectCallback implements ListenableFutureCallback, Runnable { + private class ListenableConnectCallback implements + org.springframework.util.concurrent.ListenableFutureCallback, Runnable { private final WebSocketHandler handler; - private final SettableListenableFuture future; + private final org.springframework.util.concurrent.SettableListenableFuture future; private final AtomicBoolean handled = new AtomicBoolean(); - public ListenableConnectCallback(WebSocketHandler handler, SettableListenableFuture future) { + public ListenableConnectCallback(WebSocketHandler handler, + org.springframework.util.concurrent.SettableListenableFuture future) { this.handler = handler; this.future = future; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/Transport.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/Transport.java index c3ab6c7d2f..ee05bc4dc1 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/Transport.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/Transport.java @@ -19,8 +19,6 @@ package org.springframework.web.socket.sockjs.client; import java.util.List; import java.util.concurrent.CompletableFuture; -import org.springframework.util.concurrent.CompletableToListenableFutureAdapter; -import org.springframework.util.concurrent.ListenableFuture; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.sockjs.transport.TransportType; @@ -34,29 +32,31 @@ import org.springframework.web.socket.sockjs.transport.TransportType; public interface Transport { /** - * Return the SockJS transport types that this transport can be used for. - * In particular since from a client perspective there is no difference + * Get the SockJS transport types that this transport can be used for. + *

In particular since from a client perspective there is no difference * between XHR and XHR streaming, an {@code XhrTransport} could do both. */ List getTransportTypes(); /** * Connect the transport. - * @param request the transport request. - * @param webSocketHandler the application handler to delegate lifecycle events to. - * @return a future to indicate success or failure to connect. + * @param request the transport request + * @param webSocketHandler the application handler to delegate lifecycle events to + * @return a future to indicate success or failure to connect * @deprecated as of 6.0, in favor of {@link #connectAsync(TransportRequest, WebSocketHandler)} */ @Deprecated - default ListenableFuture connect(TransportRequest request, WebSocketHandler webSocketHandler) { - return new CompletableToListenableFutureAdapter<>(connectAsync(request, webSocketHandler)); + default org.springframework.util.concurrent.ListenableFuture connect( + TransportRequest request, WebSocketHandler webSocketHandler) { + return new org.springframework.util.concurrent.CompletableToListenableFutureAdapter<>( + connectAsync(request, webSocketHandler)); } /** * Connect the transport. - * @param request the transport request. - * @param webSocketHandler the application handler to delegate lifecycle events to. - * @return a future to indicate success or failure to connect. + * @param request the transport request + * @param webSocketHandler the application handler to delegate lifecycle events to + * @return a future to indicate success or failure to connect * @since 6.0 */ CompletableFuture connectAsync(TransportRequest request, WebSocketHandler webSocketHandler); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/WebSocketClientSockJsSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/WebSocketClientSockJsSession.java index 6d3bebba61..3b16472d1b 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/WebSocketClientSockJsSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/WebSocketClientSockJsSession.java @@ -23,7 +23,6 @@ import java.util.concurrent.CompletableFuture; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.concurrent.SettableListenableFuture; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketExtension; @@ -49,7 +48,7 @@ public class WebSocketClientSockJsSession extends AbstractClientSockJsSession im */ @Deprecated public WebSocketClientSockJsSession(TransportRequest request, WebSocketHandler handler, - SettableListenableFuture connectFuture) { + org.springframework.util.concurrent.SettableListenableFuture connectFuture) { super(request, handler, connectFuture); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/XhrClientSockJsSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/XhrClientSockJsSession.java index 9eb4788dce..5787f36013 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/XhrClientSockJsSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/XhrClientSockJsSession.java @@ -25,7 +25,6 @@ import java.util.concurrent.CompletableFuture; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.util.Assert; -import org.springframework.util.concurrent.SettableListenableFuture; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketExtension; @@ -56,11 +55,13 @@ public class XhrClientSockJsSession extends AbstractClientSockJsSession { /** * Create a new {@code XhrClientSockJsSession}. - * @deprecated as of 6.0, in favor of {@link #XhrClientSockJsSession(TransportRequest, WebSocketHandler, XhrTransport, CompletableFuture)} + * @deprecated as of 6.0, in favor of + * {@link #XhrClientSockJsSession(TransportRequest, WebSocketHandler, XhrTransport, CompletableFuture)} */ @Deprecated - public XhrClientSockJsSession(TransportRequest request, WebSocketHandler handler, - XhrTransport transport, SettableListenableFuture connectFuture) { + public XhrClientSockJsSession( + TransportRequest request, WebSocketHandler handler, XhrTransport transport, + org.springframework.util.concurrent.SettableListenableFuture connectFuture) { super(request, handler, connectFuture); Assert.notNull(transport, "XhrTransport is required"); @@ -72,6 +73,10 @@ public class XhrClientSockJsSession extends AbstractClientSockJsSession { this.sendUrl = request.getSockJsUrlInfo().getTransportUrl(TransportType.XHR_SEND); } + /** + * Create a new {@code XhrClientSockJsSession}. + * @since 6.0 + */ public XhrClientSockJsSession(TransportRequest request, WebSocketHandler handler, XhrTransport transport, CompletableFuture connectFuture) { diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/AbstractWebSocketIntegrationTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/AbstractWebSocketIntegrationTests.java index 2a2c7ec878..cb15cdb557 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/AbstractWebSocketIntegrationTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/AbstractWebSocketIntegrationTests.java @@ -166,7 +166,7 @@ public abstract class AbstractWebSocketIntegrationTests { } - @Configuration + @Configuration(proxyBeanMethods = false) static class JettyUpgradeStrategyConfig extends AbstractRequestUpgradeStrategyConfig { @Override @@ -177,7 +177,7 @@ public abstract class AbstractWebSocketIntegrationTests { } - @Configuration + @Configuration(proxyBeanMethods = false) static class TomcatUpgradeStrategyConfig extends AbstractRequestUpgradeStrategyConfig { @Override @@ -188,7 +188,7 @@ public abstract class AbstractWebSocketIntegrationTests { } - @Configuration + @Configuration(proxyBeanMethods = false) static class UndertowUpgradeStrategyConfig extends AbstractRequestUpgradeStrategyConfig { @Override diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/WebSocketHandshakeTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/WebSocketHandshakeTests.java index 4d71136051..5eac8bb90b 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/WebSocketHandshakeTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/WebSocketHandshakeTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -53,6 +53,7 @@ class WebSocketHandshakeTests extends AbstractWebSocketIntegrationTests { @ParameterizedWebSocketTest + @SuppressWarnings("deprecation") void subProtocolNegotiation(WebSocketTestServer server, WebSocketClient webSocketClient, TestInfo testInfo) throws Exception { super.setup(server, webSocketClient, testInfo); @@ -65,6 +66,7 @@ class WebSocketHandshakeTests extends AbstractWebSocketIntegrationTests { } @ParameterizedWebSocketTest // SPR-12727 + @SuppressWarnings("deprecation") void unsolicitedPongWithEmptyPayload(WebSocketTestServer server, WebSocketClient webSocketClient, TestInfo testInfo) throws Exception { super.setup(server, webSocketClient, testInfo); diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/client/standard/StandardWebSocketClientTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/client/standard/StandardWebSocketClientTests.java index 6246a681e8..b4a28db678 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/client/standard/StandardWebSocketClientTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/client/standard/StandardWebSocketClientTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -68,6 +68,7 @@ public class StandardWebSocketClientTests { @Test + @SuppressWarnings("deprecation") public void testGetLocalAddress() throws Exception { URI uri = new URI("ws://localhost/abc"); WebSocketSession session = this.wsClient.doHandshake(this.wsHandler, this.headers, uri).get(); @@ -77,6 +78,7 @@ public class StandardWebSocketClientTests { } @Test + @SuppressWarnings("deprecation") public void testGetLocalAddressWss() throws Exception { URI uri = new URI("wss://localhost/abc"); WebSocketSession session = this.wsClient.doHandshake(this.wsHandler, this.headers, uri).get(); @@ -86,6 +88,7 @@ public class StandardWebSocketClientTests { } @Test + @SuppressWarnings("deprecation") public void testGetLocalAddressNoScheme() throws Exception { URI uri = new URI("localhost/abc"); assertThatIllegalArgumentException().isThrownBy(() -> @@ -93,6 +96,7 @@ public class StandardWebSocketClientTests { } @Test + @SuppressWarnings("deprecation") public void testGetRemoteAddress() throws Exception { URI uri = new URI("wss://localhost/abc"); WebSocketSession session = this.wsClient.doHandshake(this.wsHandler, this.headers, uri).get(); @@ -103,8 +107,8 @@ public class StandardWebSocketClientTests { } @Test + @SuppressWarnings("deprecation") public void handshakeHeaders() throws Exception { - URI uri = new URI("ws://localhost/abc"); List protocols = Collections.singletonList("abc"); this.headers.setSecWebSocketProtocol(protocols); @@ -117,8 +121,8 @@ public class StandardWebSocketClientTests { } @Test + @SuppressWarnings("deprecation") public void clientEndpointConfig() throws Exception { - URI uri = new URI("ws://localhost/abc"); List protocols = Collections.singletonList("abc"); this.headers.setSecWebSocketProtocol(protocols); @@ -133,8 +137,8 @@ public class StandardWebSocketClientTests { } @Test + @SuppressWarnings("deprecation") public void clientEndpointConfigWithUserProperties() throws Exception { - Map userProperties = Collections.singletonMap("foo", "bar"); URI uri = new URI("ws://localhost/abc"); @@ -149,8 +153,8 @@ public class StandardWebSocketClientTests { } @Test + @SuppressWarnings("deprecation") public void standardWebSocketClientConfiguratorInsertsHandshakeHeaders() throws Exception { - URI uri = new URI("ws://localhost/abc"); this.headers.add("foo", "bar"); @@ -166,8 +170,8 @@ public class StandardWebSocketClientTests { } @Test + @SuppressWarnings("deprecation") public void taskExecutor() throws Exception { - URI uri = new URI("ws://localhost/abc"); this.wsClient.setTaskExecutor(new SimpleAsyncTaskExecutor()); WebSocketSession session = this.wsClient.doHandshake(this.wsHandler, this.headers, uri).get(); diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebSocketConfigurationTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebSocketConfigurationTests.java index 705891a357..f07030fc0f 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebSocketConfigurationTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebSocketConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -49,6 +49,7 @@ class WebSocketConfigurationTests extends AbstractWebSocketIntegrationTests { @ParameterizedWebSocketTest + @SuppressWarnings("deprecation") void registerWebSocketHandler(WebSocketTestServer server, WebSocketClient webSocketClient, TestInfo testInfo) throws Exception { super.setup(server, webSocketClient, testInfo); @@ -62,6 +63,7 @@ class WebSocketConfigurationTests extends AbstractWebSocketIntegrationTests { } @ParameterizedWebSocketTest + @SuppressWarnings("deprecation") void registerWebSocketHandlerWithSockJS(WebSocketTestServer server, WebSocketClient webSocketClient, TestInfo testInfo) throws Exception { super.setup(server, webSocketClient, testInfo); diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/messaging/WebSocketStompClientIntegrationTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/messaging/WebSocketStompClientIntegrationTests.java index 28d72b22a4..c4203bc96c 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/messaging/WebSocketStompClientIntegrationTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/messaging/WebSocketStompClientIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -109,8 +109,8 @@ class WebSocketStompClientIntegrationTests { @Test + @SuppressWarnings("deprecation") void publishSubscribe() throws Exception { - String url = "ws://127.0.0.1:" + this.server.getPort() + "/stomp"; TestHandler testHandler = new TestHandler("/topic/foo", "payload"); @@ -121,7 +121,7 @@ class WebSocketStompClientIntegrationTests { } - @Configuration + @Configuration(proxyBeanMethods = false) static class TestConfig extends WebSocketMessageBrokerConfigurationSupport { @Override diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/AbstractSockJsIntegrationTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/AbstractSockJsIntegrationTests.java index 042ff8d153..72bac15368 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/AbstractSockJsIntegrationTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/AbstractSockJsIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -51,8 +51,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.testfixture.EnabledForTestGroups; import org.springframework.http.HttpHeaders; import org.springframework.http.server.ServletServerHttpRequest; -import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; -import org.springframework.util.concurrent.ListenableFutureCallback; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketHttpHeaders; @@ -79,7 +77,7 @@ import static org.springframework.core.testfixture.TestGroup.LONG_RUNNING; * @author Sam Brannen */ @EnabledForTestGroups(LONG_RUNNING) -public abstract class AbstractSockJsIntegrationTests { +abstract class AbstractSockJsIntegrationTests { protected Log logger = LogFactory.getLog(getClass()); @@ -96,7 +94,7 @@ public abstract class AbstractSockJsIntegrationTests { @BeforeEach - public void setup(TestInfo testInfo) throws Exception { + void setup(TestInfo testInfo) throws Exception { logger.debug("Setting up '" + testInfo.getTestMethod().get().getName() + "'"); this.testFilter = new TestFilter(); @@ -116,7 +114,7 @@ public abstract class AbstractSockJsIntegrationTests { } @AfterEach - public void teardown() throws Exception { + void teardown() throws Exception { try { this.sockJsClient.stop(); } @@ -157,17 +155,17 @@ public abstract class AbstractSockJsIntegrationTests { } @Test - public void echoWebSocket() throws Exception { + void echoWebSocket() throws Exception { testEcho(100, createWebSocketTransport(), null); } @Test - public void echoXhrStreaming() throws Exception { + void echoXhrStreaming() throws Exception { testEcho(100, createXhrTransport(), null); } @Test - public void echoXhr() throws Exception { + void echoXhr() throws Exception { AbstractXhrTransport xhrTransport = createXhrTransport(); xhrTransport.setXhrStreamingDisabled(true); testEcho(100, xhrTransport, null); @@ -176,7 +174,7 @@ public abstract class AbstractSockJsIntegrationTests { // SPR-13254 @Test - public void echoXhrWithHeaders() throws Exception { + void echoXhrWithHeaders() throws Exception { AbstractXhrTransport xhrTransport = createXhrTransport(); xhrTransport.setXhrStreamingDisabled(true); @@ -191,30 +189,31 @@ public abstract class AbstractSockJsIntegrationTests { } @Test - public void receiveOneMessageWebSocket() throws Exception { + void receiveOneMessageWebSocket() throws Exception { testReceiveOneMessage(createWebSocketTransport(), null); } @Test - public void receiveOneMessageXhrStreaming() throws Exception { + void receiveOneMessageXhrStreaming() throws Exception { testReceiveOneMessage(createXhrTransport(), null); } @Test - public void receiveOneMessageXhr() throws Exception { + void receiveOneMessageXhr() throws Exception { AbstractXhrTransport xhrTransport = createXhrTransport(); xhrTransport.setXhrStreamingDisabled(true); testReceiveOneMessage(xhrTransport, null); } @Test - public void infoRequestFailure() throws Exception { + @SuppressWarnings("deprecation") + void infoRequestFailure() throws Exception { TestClientHandler handler = new TestClientHandler(); this.testFilter.sendErrorMap.put("/info", 500); CountDownLatch latch = new CountDownLatch(1); initSockJsClient(createWebSocketTransport()); this.sockJsClient.doHandshake(handler, this.baseUrl + "/echo").addCallback( - new ListenableFutureCallback() { + new org.springframework.util.concurrent.ListenableFutureCallback() { @Override public void onSuccess(WebSocketSession result) { } @@ -229,12 +228,12 @@ public abstract class AbstractSockJsIntegrationTests { } @Test - public void fallbackAfterTransportFailure() throws Exception { + void fallbackAfterTransportFailure() throws Exception { this.testFilter.sendErrorMap.put("/websocket", 200); this.testFilter.sendErrorMap.put("/xhr_streaming", 500); TestClientHandler handler = new TestClientHandler(); initSockJsClient(createWebSocketTransport(), createXhrTransport()); - WebSocketSession session = this.sockJsClient.doHandshake(handler, this.baseUrl + "/echo").get(); + WebSocketSession session = this.sockJsClient.execute(handler, this.baseUrl + "/echo").get(); assertThat(session.getClass()).as("Fallback didn't occur").isEqualTo(XhrClientSockJsSession.class); TextMessage message = new TextMessage("message1"); session.sendMessage(message); @@ -243,12 +242,13 @@ public abstract class AbstractSockJsIntegrationTests { @Test @Timeout(5) - public void fallbackAfterConnectTimeout() throws Exception { + @SuppressWarnings("deprecation") + void fallbackAfterConnectTimeout() throws Exception { TestClientHandler clientHandler = new TestClientHandler(); this.testFilter.sleepDelayMap.put("/xhr_streaming", 10000L); this.testFilter.sendErrorMap.put("/xhr_streaming", 503); initSockJsClient(createXhrTransport()); - this.sockJsClient.setConnectTimeoutScheduler(this.wac.getBean(ThreadPoolTaskScheduler.class)); + // this.sockJsClient.setConnectTimeoutScheduler(this.wac.getBean(ThreadPoolTaskScheduler.class)); WebSocketSession clientSession = sockJsClient.doHandshake(clientHandler, this.baseUrl + "/echo").get(); assertThat(clientSession.getClass()).as("Fallback didn't occur").isEqualTo(XhrClientSockJsSession.class); TextMessage message = new TextMessage("message1"); @@ -258,6 +258,7 @@ public abstract class AbstractSockJsIntegrationTests { } + @SuppressWarnings("deprecation") private void testEcho(int messageCount, Transport transport, WebSocketHttpHeaders headers) throws Exception { List messages = new ArrayList<>(); for (int i = 0; i < messageCount; i++) { @@ -278,6 +279,7 @@ public abstract class AbstractSockJsIntegrationTests { session.close(); } + @SuppressWarnings("deprecation") private void testReceiveOneMessage(Transport transport, WebSocketHttpHeaders headers) throws Exception { @@ -311,7 +313,7 @@ public abstract class AbstractSockJsIntegrationTests { } - @Configuration + @Configuration(proxyBeanMethods = false) @EnableWebSocket static class TestConfig implements WebSocketConfigurer { diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/JettySockJsIntegrationTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/JettySockJsIntegrationTests.java index 8551627eba..22c8218898 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/JettySockJsIntegrationTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/JettySockJsIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2022 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. @@ -30,7 +30,7 @@ import org.springframework.web.socket.server.jetty.JettyRequestUpgradeStrategy; * * @author Rossen Stoyanchev */ -public class JettySockJsIntegrationTests extends AbstractSockJsIntegrationTests { +class JettySockJsIntegrationTests extends AbstractSockJsIntegrationTests { @Override protected Class upgradeStrategyConfigClass() { @@ -53,10 +53,10 @@ public class JettySockJsIntegrationTests extends AbstractSockJsIntegrationTests } - @Configuration + @Configuration(proxyBeanMethods = false) static class JettyTestConfig { @Bean - public RequestUpgradeStrategy upgradeStrategy() { + RequestUpgradeStrategy upgradeStrategy() { return new JettyRequestUpgradeStrategy(); } } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransportTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransportTests.java index f41b56ca96..c90f8c73d8 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransportTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransportTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -40,8 +40,6 @@ import org.springframework.messaging.simp.stomp.StompCommand; import org.springframework.messaging.simp.stomp.StompEncoder; import org.springframework.messaging.simp.stomp.StompHeaderAccessor; import org.springframework.messaging.support.MessageBuilder; -import org.springframework.util.concurrent.ListenableFuture; -import org.springframework.util.concurrent.ListenableFutureCallback; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RequestCallback; import org.springframework.web.client.ResponseExtractor; @@ -124,6 +122,7 @@ public class RestTemplateXhrTransportTests { } @Test + @SuppressWarnings("deprecation") public void connectFailure() throws Exception { final HttpServerErrorException expected = new HttpServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR); RestOperations restTemplate = mock(RestOperations.class); @@ -131,7 +130,7 @@ public class RestTemplateXhrTransportTests { final CountDownLatch latch = new CountDownLatch(1); connect(restTemplate).addCallback( - new ListenableFutureCallback() { + new org.springframework.util.concurrent.ListenableFutureCallback() { @Override public void onSuccess(WebSocketSession result) { } @@ -168,12 +167,15 @@ public class RestTemplateXhrTransportTests { verify(response).close(); } - private ListenableFuture connect(ClientHttpResponse... responses) throws Exception { + @SuppressWarnings("deprecation") + private org.springframework.util.concurrent.ListenableFuture connect( + ClientHttpResponse... responses) throws Exception { return connect(new TestRestTemplate(responses)); } - private ListenableFuture connect(RestOperations restTemplate, ClientHttpResponse... responses) - throws Exception { + @SuppressWarnings("deprecation") + private org.springframework.util.concurrent.ListenableFuture connect( + RestOperations restTemplate, ClientHttpResponse... responses) throws Exception { RestTemplateXhrTransport transport = new RestTemplateXhrTransport(restTemplate); transport.setTaskExecutor(new SyncTaskExecutor()); @@ -201,7 +203,6 @@ public class RestTemplateXhrTransportTests { } - private static class TestRestTemplate extends RestTemplate { private Queue responses = new LinkedBlockingDeque<>(); @@ -225,5 +226,4 @@ public class RestTemplateXhrTransportTests { } } - } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/SockJsClientTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/SockJsClientTests.java index 55932de6fb..48c9749dd7 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/SockJsClientTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/SockJsClientTests.java @@ -18,7 +18,6 @@ package org.springframework.web.socket.sockjs.client; import java.net.URI; import java.net.URISyntaxException; -import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -27,7 +26,6 @@ import org.mockito.ArgumentCaptor; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.util.concurrent.ListenableFutureCallback; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketHttpHeaders; @@ -43,46 +41,38 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; /** - * Unit tests for {@link org.springframework.web.socket.sockjs.client.SockJsClient}. + * Unit tests for {@link SockJsClient}. * * @author Rossen Stoyanchev */ -public class SockJsClientTests { +class SockJsClientTests { private static final String URL = "https://example.com"; private static final WebSocketHandler handler = mock(WebSocketHandler.class); - private SockJsClient sockJsClient; + private final InfoReceiver infoReceiver = mock(InfoReceiver.class); - private InfoReceiver infoReceiver; + private final TestTransport webSocketTransport = new TestTransport("WebSocketTestTransport"); - private TestTransport webSocketTransport; + private final XhrTestTransport xhrTransport = new XhrTestTransport("XhrTestTransport"); - private XhrTestTransport xhrTransport; + @SuppressWarnings({ "deprecation", "unchecked" }) + private org.springframework.util.concurrent.ListenableFutureCallback connectCallback = + mock(org.springframework.util.concurrent.ListenableFutureCallback.class); - private ListenableFutureCallback connectCallback; + private SockJsClient sockJsClient = new SockJsClient(List.of(this.webSocketTransport, this.xhrTransport)); @BeforeEach - @SuppressWarnings("unchecked") - public void setup() { - this.infoReceiver = mock(InfoReceiver.class); - this.webSocketTransport = new TestTransport("WebSocketTestTransport"); - this.xhrTransport = new XhrTestTransport("XhrTestTransport"); - - List transports = new ArrayList<>(); - transports.add(this.webSocketTransport); - transports.add(this.xhrTransport); - this.sockJsClient = new SockJsClient(transports); + void setup() { this.sockJsClient.setInfoReceiver(this.infoReceiver); - - this.connectCallback = mock(ListenableFutureCallback.class); } @Test - public void connectWebSocket() throws Exception { + @SuppressWarnings("deprecation") + void connectWebSocket() throws Exception { setupInfoRequest(true); this.sockJsClient.doHandshake(handler, URL).addCallback(this.connectCallback); assertThat(this.webSocketTransport.invoked()).isTrue(); @@ -93,7 +83,8 @@ public class SockJsClientTests { } @Test - public void connectWebSocketDisabled() throws URISyntaxException { + @SuppressWarnings("deprecation") + void connectWebSocketDisabled() throws URISyntaxException { setupInfoRequest(false); this.sockJsClient.doHandshake(handler, URL); assertThat(this.webSocketTransport.invoked()).isFalse(); @@ -102,7 +93,8 @@ public class SockJsClientTests { } @Test - public void connectXhrStreamingDisabled() throws Exception { + @SuppressWarnings("deprecation") + void connectXhrStreamingDisabled() throws Exception { setupInfoRequest(false); this.xhrTransport.setStreamingDisabled(true); this.sockJsClient.doHandshake(handler, URL).addCallback(this.connectCallback); @@ -111,10 +103,9 @@ public class SockJsClientTests { assertThat(this.xhrTransport.getRequest().getTransportUrl().toString().endsWith("xhr")).isTrue(); } - // SPR-13254 - - @Test - public void connectWithHandshakeHeaders() throws Exception { + @Test // SPR-13254 + @SuppressWarnings("deprecation") + void connectWithHandshakeHeaders() throws Exception { ArgumentCaptor headersCaptor = setupInfoRequest(false); this.xhrTransport.setStreamingDisabled(true); @@ -135,7 +126,8 @@ public class SockJsClientTests { } @Test - public void connectAndUseSubsetOfHandshakeHeadersForHttpRequests() throws Exception { + @SuppressWarnings("deprecation") + void connectAndUseSubsetOfHandshakeHeadersForHttpRequests() throws Exception { ArgumentCaptor headersCaptor = setupInfoRequest(false); this.xhrTransport.setStreamingDisabled(true); @@ -152,14 +144,16 @@ public class SockJsClientTests { } @Test - public void connectSockJsInfo() throws Exception { + @SuppressWarnings("deprecation") + void connectSockJsInfo() throws Exception { setupInfoRequest(true); this.sockJsClient.doHandshake(handler, URL); verify(this.infoReceiver, times(1)).executeInfoRequest(any(), any()); } @Test - public void connectSockJsInfoCached() throws Exception { + @SuppressWarnings("deprecation") + void connectSockJsInfoCached() throws Exception { setupInfoRequest(true); this.sockJsClient.doHandshake(handler, URL); this.sockJsClient.doHandshake(handler, URL); @@ -168,7 +162,8 @@ public class SockJsClientTests { } @Test - public void connectInfoRequestFailure() throws URISyntaxException { + @SuppressWarnings("deprecation") + void connectInfoRequestFailure() throws URISyntaxException { HttpServerErrorException exception = new HttpServerErrorException(HttpStatus.SERVICE_UNAVAILABLE); given(this.infoReceiver.executeInfoRequest(any(), any())).willThrow(exception); this.sockJsClient.doHandshake(handler, URL).addCallback(this.connectCallback); @@ -178,12 +173,15 @@ public class SockJsClientTests { } private ArgumentCaptor setupInfoRequest(boolean webSocketEnabled) { + String response = """ + { + "entropy": 123, + "origins": ["*:*"], + "cookie_needed": true, + "websocket": %s + }""".formatted(webSocketEnabled).replace('\n', '\0'); ArgumentCaptor headersCaptor = ArgumentCaptor.forClass(HttpHeaders.class); - given(this.infoReceiver.executeInfoRequest(any(), headersCaptor.capture())).willReturn( - "{\"entropy\":123," + - "\"origins\":[\"*:*\"]," + - "\"cookie_needed\":true," + - "\"websocket\":" + webSocketEnabled + "}"); + given(this.infoReceiver.executeInfoRequest(any(), headersCaptor.capture())).willReturn(response); return headersCaptor; } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/UndertowSockJsIntegrationTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/UndertowSockJsIntegrationTests.java index c707f9faa6..54c9feb4cb 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/UndertowSockJsIntegrationTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/UndertowSockJsIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -29,7 +29,7 @@ import org.springframework.web.socket.server.standard.UndertowRequestUpgradeStra /** * @author Brian Clozel */ -public class UndertowSockJsIntegrationTests extends AbstractSockJsIntegrationTests { +class UndertowSockJsIntegrationTests extends AbstractSockJsIntegrationTests { @Override protected Class upgradeStrategyConfigClass() { @@ -56,11 +56,13 @@ public class UndertowSockJsIntegrationTests extends AbstractSockJsIntegrationTes } } - @Configuration + + @Configuration(proxyBeanMethods = false) static class UndertowTestConfig { @Bean - public RequestUpgradeStrategy upgradeStrategy() { + RequestUpgradeStrategy upgradeStrategy() { return new UndertowRequestUpgradeStrategy(); } } + } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/XhrTransportTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/XhrTransportTests.java index f86353d99f..ee5afedc12 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/XhrTransportTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/XhrTransportTests.java @@ -39,22 +39,21 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; /** - * Unit tests for - * {@link org.springframework.web.socket.sockjs.client.AbstractXhrTransport}. + * Unit tests for {@link AbstractXhrTransport}. * * @author Rossen Stoyanchev */ -public class XhrTransportTests { +class XhrTransportTests { @Test - public void infoResponse() throws Exception { + void infoResponse() throws Exception { TestXhrTransport transport = new TestXhrTransport(); transport.infoResponseToReturn = new ResponseEntity<>("body", HttpStatus.OK); assertThat(transport.executeInfoRequest(new URI("https://example.com/info"), null)).isEqualTo("body"); } @Test - public void infoResponseError() throws Exception { + void infoResponseError() throws Exception { TestXhrTransport transport = new TestXhrTransport(); transport.infoResponseToReturn = new ResponseEntity<>("body", HttpStatus.BAD_REQUEST); assertThatExceptionOfType(HttpServerErrorException.class).isThrownBy(() -> @@ -62,7 +61,7 @@ public class XhrTransportTests { } @Test - public void sendMessage() throws Exception { + void sendMessage() throws Exception { HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.set("foo", "bar"); requestHeaders.setContentType(MediaType.APPLICATION_JSON); @@ -76,7 +75,7 @@ public class XhrTransportTests { } @Test - public void sendMessageError() throws Exception { + void sendMessageError() throws Exception { TestXhrTransport transport = new TestXhrTransport(); transport.sendMessageResponseToReturn = new ResponseEntity<>(HttpStatus.BAD_REQUEST); URI url = new URI("https://example.com"); @@ -85,7 +84,8 @@ public class XhrTransportTests { } @Test - public void connect() throws Exception { + @SuppressWarnings("deprecation") + void connect() throws Exception { HttpHeaders handshakeHeaders = new HttpHeaders(); handshakeHeaders.setOrigin("foo");