diff --git a/framework-docs/modules/ROOT/pages/web/websocket/stomp/enable.adoc b/framework-docs/modules/ROOT/pages/web/websocket/stomp/enable.adoc index 16dc4ce382..d49acb3bee 100644 --- a/framework-docs/modules/ROOT/pages/web/websocket/stomp/enable.adoc +++ b/framework-docs/modules/ROOT/pages/web/websocket/stomp/enable.adoc @@ -3,7 +3,7 @@ STOMP over WebSocket support is available in the `spring-messaging` and `spring-websocket` modules. Once you have those dependencies, you can expose a STOMP -endpoints, over WebSocket with xref:web/websocket/fallback.adoc[SockJS Fallback], as the following example shows: +endpoint over WebSocket with xref:web/websocket/fallback.adoc[SockJS Fallback], as the following example shows: [source,java,indent=0,subs="verbatim,quotes"] ---- @@ -32,7 +32,7 @@ client needs to connect for the WebSocket handshake. <2> STOMP messages whose destination header begins with `/app` are routed to `@MessageMapping` methods in `@Controller` classes. <3> Use the built-in message broker for subscriptions and broadcasting and -route messages whose destination header begins with `/topic `or `/queue` to the broker. +route messages whose destination header begins with `/topic` or `/queue` to the broker. The following example shows the XML configuration equivalent of the preceding example: diff --git a/spring-core/src/main/java/org/springframework/aot/hint/MemberCategory.java b/spring-core/src/main/java/org/springframework/aot/hint/MemberCategory.java index 06bc339774..9424b17f9a 100644 --- a/spring-core/src/main/java/org/springframework/aot/hint/MemberCategory.java +++ b/spring-core/src/main/java/org/springframework/aot/hint/MemberCategory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 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. @@ -22,7 +22,7 @@ import java.lang.reflect.Member; import java.lang.reflect.Method; /** - * Represent predefined {@linkplain Member members} groups. + * Predefined {@link Member} categories. * * @author Andy Clement * @author Sebastien Deleuze @@ -39,14 +39,14 @@ public enum MemberCategory { /** * A category that represents {@linkplain Class#getDeclaredFields() declared - * fields}, that is all fields defined by the class, but not inherited ones. + * fields}: all fields defined by the class but not inherited fields. * @see Class#getDeclaredFields() */ DECLARED_FIELDS, /** * A category that defines public {@linkplain Constructor constructors} can - * be introspected, but not invoked. + * be introspected but not invoked. * @see Class#getConstructors() * @see ExecutableMode#INTROSPECT */ @@ -54,7 +54,7 @@ public enum MemberCategory { /** * A category that defines {@linkplain Class#getDeclaredConstructors() all - * constructors} can be introspected, but not invoked. + * constructors} can be introspected but not invoked. * @see Class#getDeclaredConstructors() * @see ExecutableMode#INTROSPECT */ @@ -78,7 +78,7 @@ public enum MemberCategory { /** * A category that defines public {@linkplain Method methods}, including - * inherited ones can be introspect, but not invoked. + * inherited ones, can be introspected but not invoked. * @see Class#getMethods() * @see ExecutableMode#INTROSPECT */ @@ -86,7 +86,7 @@ public enum MemberCategory { /** * A category that defines {@linkplain Class#getDeclaredMethods() all - * methods}, excluding inherited ones can be introspected, but not invoked. + * methods}, excluding inherited ones, can be introspected but not invoked. * @see Class#getDeclaredMethods() * @see ExecutableMode#INTROSPECT */ @@ -94,7 +94,7 @@ public enum MemberCategory { /** * A category that defines public {@linkplain Method methods}, including - * inherited ones can be invoked. + * inherited ones, can be invoked. * @see Class#getMethods() * @see ExecutableMode#INVOKE */ @@ -102,7 +102,7 @@ public enum MemberCategory { /** * A category that defines {@linkplain Class#getDeclaredMethods() all - * methods}, excluding inherited ones can be invoked. + * methods}, excluding inherited ones, can be invoked. * @see Class#getDeclaredMethods() * @see ExecutableMode#INVOKE */ @@ -110,16 +110,18 @@ public enum MemberCategory { /** * A category that represents public {@linkplain Class#getClasses() inner - * classes}. Contrary to other categories, this does not register any - * particular reflection for them but rather make sure they are available + * classes}. + *

Contrary to other categories, this does not register any particular + * reflection for inner classes but rather makes sure they are available * via a call to {@link Class#getClasses}. */ PUBLIC_CLASSES, /** * A category that represents all {@linkplain Class#getDeclaredClasses() - * inner classes}. Contrary to other categories, this does not register any - * particular reflection for them but rather make sure they are available + * inner classes}. + *

Contrary to other categories, this does not register any particular + * reflection for inner classes but rather makes sure they are available * via a call to {@link Class#getDeclaredClasses}. */ DECLARED_CLASSES; diff --git a/spring-core/src/main/java/org/springframework/core/NativeDetector.java b/spring-core/src/main/java/org/springframework/core/NativeDetector.java index 697af695e6..a588864234 100644 --- a/spring-core/src/main/java/org/springframework/core/NativeDetector.java +++ b/spring-core/src/main/java/org/springframework/core/NativeDetector.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2023 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. @@ -33,15 +33,16 @@ public abstract class NativeDetector { private static final boolean inNativeImage = (imageCode != null); /** - * Returns {@code true} if running in a native image context (for example {@code buildtime}, {@code runtime} or - * {@code agent}) expressed by setting {@code org.graalvm.nativeimage.imagecode} system property to any value, else {@code false}. + * Returns {@code true} if running in a native image context (for example + * {@code buildtime}, {@code runtime}, or {@code agent}) expressed by setting the + * {@code org.graalvm.nativeimage.imagecode} system property to any value. */ public static boolean inNativeImage() { return inNativeImage; } /** - * Returns {@code true} if running in any of the specified native image context(s), else {@code false}. + * Returns {@code true} if running in any of the specified native image context(s). * @param contexts the native image context(s) * @since 6.0.10 */ @@ -55,8 +56,8 @@ public abstract class NativeDetector { } /** - * Native image context as defined in - * ImageInfo.java. + * Native image context as defined in GraalVM's + * ImageInfo. * * @since 6.0.10 */ @@ -82,6 +83,7 @@ public abstract class NativeDetector { public String toString() { return this.key; } + } } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java index f3383f9d0c..7d4ef3ac02 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java @@ -16,7 +16,6 @@ package org.springframework.messaging.simp.broker; -import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -33,41 +32,38 @@ import org.springframework.util.MultiValueMap; import static org.assertj.core.api.Assertions.assertThat; /** - * Test fixture for - * {@link org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry}. + * Tests for {@link DefaultSubscriptionRegistry}. * * @author Rossen Stoyanchev * @author Sebastien Deleuze + * @author Sam Brannen */ -public class DefaultSubscriptionRegistryTests { +class DefaultSubscriptionRegistryTests { private final DefaultSubscriptionRegistry registry = new DefaultSubscriptionRegistry(); @Test - public void registerSubscriptionInvalidInput() { + void registerSubscriptionInvalidInput() { String sessId = "sess01"; String subsId = "subs01"; String dest = "/foo"; this.registry.registerSubscription(subscribeMessage(null, subsId, dest)); MultiValueMap actual = this.registry.findSubscriptions(createMessage(dest)); - assertThat(actual).isNotNull(); assertThat(actual).isEmpty(); this.registry.registerSubscription(subscribeMessage(sessId, null, dest)); actual = this.registry.findSubscriptions(createMessage(dest)); - assertThat(actual).isNotNull(); assertThat(actual).isEmpty(); this.registry.registerSubscription(subscribeMessage(sessId, subsId, null)); actual = this.registry.findSubscriptions(createMessage(dest)); - assertThat(actual).isNotNull(); assertThat(actual).isEmpty(); } @Test - public void registerSubscription() { + void registerSubscription() { String sessId = "sess01"; String subsId = "subs01"; String dest = "/foo"; @@ -75,15 +71,14 @@ public class DefaultSubscriptionRegistryTests { this.registry.registerSubscription(subscribeMessage(sessId, subsId, dest)); MultiValueMap actual = this.registry.findSubscriptions(createMessage(dest)); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected one element " + actual).hasSize(1); - assertThat(actual.get(sessId)).isEqualTo(Collections.singletonList(subsId)); + assertThat(actual).hasSize(1); + assertThat(actual.get(sessId)).containsExactly(subsId); } @Test - public void registerSubscriptionOneSession() { + void registerSubscriptionOneSession() { String sessId = "sess01"; - List subscriptionIds = Arrays.asList("subs01", "subs02", "subs03"); + List subscriptionIds = List.of("subs01", "subs02", "subs03"); String dest = "/foo"; for (String subId : subscriptionIds) { @@ -91,13 +86,12 @@ public class DefaultSubscriptionRegistryTests { } MultiValueMap actual = this.registry.findSubscriptions(createMessage(dest)); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(1); assertThat(sort(actual.get(sessId))).isEqualTo(subscriptionIds); } @Test - public void registerSameSubscriptionTwice() { + void registerSameSubscriptionTwice() { String sessId = "sess01"; String subId = "subs01"; String dest = "/foo"; @@ -106,15 +100,14 @@ public class DefaultSubscriptionRegistryTests { this.registry.registerSubscription(subscribeMessage(sessId, subId, dest)); MultiValueMap actual = this.registry.findSubscriptions(createMessage(dest)); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(1); assertThat(actual.get(sessId)).containsExactly(subId); } @Test - public void registerSubscriptionMultipleSessions() { - List sessIds = Arrays.asList("sess01", "sess02", "sess03"); - List subscriptionIds = Arrays.asList("subs01", "subs02", "subs03"); + void registerSubscriptionMultipleSessions() { + List sessIds = List.of("sess01", "sess02", "sess03"); + List subscriptionIds = List.of("subs01", "subs02", "subs03"); String dest = "/foo"; for (String sessId : sessIds) { @@ -124,7 +117,6 @@ public class DefaultSubscriptionRegistryTests { } MultiValueMap actual = this.registry.findSubscriptions(createMessage(dest)); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(3); assertThat(sort(actual.get(sessIds.get(0)))).isEqualTo(subscriptionIds); assertThat(sort(actual.get(sessIds.get(1)))).isEqualTo(subscriptionIds); @@ -132,7 +124,7 @@ public class DefaultSubscriptionRegistryTests { } @Test - public void registerSubscriptionWithDestinationPattern() { + void registerSubscriptionWithDestinationPattern() { String sessId = "sess01"; String subsId = "subs01"; String destPattern = "/topic/PRICE.STOCK.*.IBM"; @@ -140,13 +132,12 @@ public class DefaultSubscriptionRegistryTests { this.registry.registerSubscription(subscribeMessage(sessId, subsId, destPattern)); MultiValueMap actual = this.registry.findSubscriptions(createMessage(dest)); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected one element " + actual).hasSize(1); - assertThat(actual.get(sessId)).isEqualTo(Collections.singletonList(subsId)); + assertThat(actual).hasSize(1); + assertThat(actual.get(sessId)).containsExactly(subsId); } @Test // SPR-11657 - public void registerSubscriptionsWithSimpleAndPatternDestinations() { + void registerSubscriptionsWithSimpleAndPatternDestinations() { String sess1 = "sess01"; String sess2 = "sess02"; @@ -161,7 +152,6 @@ public class DefaultSubscriptionRegistryTests { this.registry.registerSubscription(subscribeMessage(sess1, subs1, "/topic/PRICE.STOCK.*.IBM")); MultiValueMap actual = this.registry.findSubscriptions(destNasdaqIbmMessage); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(1); assertThat(actual.get(sess1)).containsExactlyInAnyOrder(subs2, subs1); @@ -170,51 +160,45 @@ public class DefaultSubscriptionRegistryTests { this.registry.registerSubscription(subscribeMessage(sess2, subs3, "/topic/PRICE.STOCK.NASDAQ.GOOG")); actual = this.registry.findSubscriptions(destNasdaqIbmMessage); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(2); assertThat(actual.get(sess1)).containsExactlyInAnyOrder(subs2, subs1); - assertThat(actual.get(sess2)).isEqualTo(Collections.singletonList(subs1)); + assertThat(actual.get(sess2)).containsExactly(subs1); this.registry.unregisterAllSubscriptions(sess1); actual = this.registry.findSubscriptions(destNasdaqIbmMessage); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(1); - assertThat(actual.get(sess2)).isEqualTo(Collections.singletonList(subs1)); + assertThat(actual.get(sess2)).containsExactly(subs1); this.registry.registerSubscription(subscribeMessage(sess1, subs1, "/topic/PRICE.STOCK.*.IBM")); this.registry.registerSubscription(subscribeMessage(sess1, subs2, destNasdaqIbm)); actual = this.registry.findSubscriptions(destNasdaqIbmMessage); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(2); assertThat(actual.get(sess1)).containsExactlyInAnyOrder(subs1, subs2); - assertThat(actual.get(sess2)).isEqualTo(Collections.singletonList(subs1)); + assertThat(actual.get(sess2)).containsExactly(subs1); this.registry.unregisterSubscription(unsubscribeMessage(sess1, subs2)); actual = this.registry.findSubscriptions(destNasdaqIbmMessage); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(2); - assertThat(actual.get(sess1)).isEqualTo(Collections.singletonList(subs1)); - assertThat(actual.get(sess2)).isEqualTo(Collections.singletonList(subs1)); + assertThat(actual.get(sess1)).containsExactly(subs1); + assertThat(actual.get(sess2)).containsExactly(subs1); this.registry.unregisterSubscription(unsubscribeMessage(sess1, subs1)); actual = this.registry.findSubscriptions(destNasdaqIbmMessage); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(1); - assertThat(actual.get(sess2)).isEqualTo(Collections.singletonList(subs1)); + assertThat(actual.get(sess2)).containsExactly(subs1); this.registry.unregisterSubscription(unsubscribeMessage(sess2, subs1)); actual = this.registry.findSubscriptions(destNasdaqIbmMessage); - assertThat(actual).isNotNull(); assertThat(actual).isEmpty(); } @Test // SPR-11755 - public void registerAndUnregisterMultipleDestinations() { + void registerAndUnregisterMultipleDestinations() { String sess1 = "sess01"; String sess2 = "sess02"; @@ -247,7 +231,7 @@ public class DefaultSubscriptionRegistryTests { } @Test - public void registerSubscriptionWithDestinationPatternRegex() { + void registerSubscriptionWithDestinationPatternRegex() { String sessId = "sess01"; String subsId = "subs01"; String destPattern = "/topic/PRICE.STOCK.*.{ticker:(IBM|MSFT)}"; @@ -255,24 +239,21 @@ public class DefaultSubscriptionRegistryTests { this.registry.registerSubscription(subscribeMessage(sessId, subsId, destPattern)); Message message = createMessage("/topic/PRICE.STOCK.NASDAQ.IBM"); MultiValueMap actual = this.registry.findSubscriptions(message); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected one element " + actual).hasSize(1); - assertThat(actual.get(sessId)).isEqualTo(Collections.singletonList(subsId)); + assertThat(actual).hasSize(1); + assertThat(actual.get(sessId)).containsExactly(subsId); message = createMessage("/topic/PRICE.STOCK.NASDAQ.MSFT"); actual = this.registry.findSubscriptions(message); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected one element " + actual).hasSize(1); - assertThat(actual.get(sessId)).isEqualTo(Collections.singletonList(subsId)); + assertThat(actual).hasSize(1); + assertThat(actual.get(sessId)).containsExactly(subsId); message = createMessage("/topic/PRICE.STOCK.NASDAQ.VMW"); actual = this.registry.findSubscriptions(message); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected no elements " + actual).isEmpty(); + assertThat(actual).isEmpty(); } @Test - public void registerSubscriptionWithSelector() { + void registerSubscriptionWithSelector() { String sessionId = "sess01"; String subscriptionId = "subs01"; String destination = "/foo"; @@ -288,19 +269,17 @@ public class DefaultSubscriptionRegistryTests { Message message = MessageBuilder.createMessage("", accessor.getMessageHeaders()); MultiValueMap actual = this.registry.findSubscriptions(message); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(1); - assertThat(actual.get(sessionId)).isEqualTo(Collections.singletonList(subscriptionId)); + assertThat(actual.get(sessionId)).containsExactly(subscriptionId); - // Then without + // Then without selector header actual = this.registry.findSubscriptions(createMessage(destination)); - assertThat(actual).isNotNull(); assertThat(actual).isEmpty(); } @Test - public void registerSubscriptionWithSelectorNotSupported() { + void registerSubscriptionWithSelectorNotSupported() { String sessionId = "sess01"; String subscriptionId = "subs01"; String destination = "/foo"; @@ -315,39 +294,35 @@ public class DefaultSubscriptionRegistryTests { Message message = MessageBuilder.createMessage("", accessor.getMessageHeaders()); MultiValueMap actual = this.registry.findSubscriptions(message); - assertThat(actual).isNotNull(); assertThat(actual).hasSize(1); - assertThat(actual.get(sessionId)).isEqualTo(Collections.singletonList(subscriptionId)); + assertThat(actual.get(sessionId)).containsExactly(subscriptionId); } @Test // SPR-11931 - public void registerSubscriptionTwiceAndUnregister() { + void registerSubscriptionTwiceAndUnregister() { this.registry.registerSubscription(subscribeMessage("sess01", "subs01", "/foo")); this.registry.registerSubscription(subscribeMessage("sess01", "subs02", "/foo")); MultiValueMap actual = this.registry.findSubscriptions(createMessage("/foo")); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected 1 element").hasSize(1); - assertThat(actual.get("sess01")).isEqualTo(Arrays.asList("subs01", "subs02")); + assertThat(actual).hasSize(1); + assertThat(actual.get("sess01")).containsExactly("subs01", "subs02"); this.registry.unregisterSubscription(unsubscribeMessage("sess01", "subs01")); actual = this.registry.findSubscriptions(createMessage("/foo")); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected 1 element").hasSize(1); - assertThat(actual.get("sess01")).isEqualTo(Collections.singletonList("subs02")); + assertThat(actual).hasSize(1); + assertThat(actual.get("sess01")).containsExactly("subs02"); this.registry.unregisterSubscription(unsubscribeMessage("sess01", "subs02")); actual = this.registry.findSubscriptions(createMessage("/foo")); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected no element").isEmpty(); + assertThat(actual).isEmpty(); } @Test - public void unregisterSubscription() { - List sessIds = Arrays.asList("sess01", "sess02", "sess03"); - List subscriptionIds = Arrays.asList("subs01", "subs02", "subs03"); + void unregisterSubscription() { + List sessIds = List.of("sess01", "sess02", "sess03"); + List subscriptionIds = List.of("subs01", "subs02", "subs03"); String dest = "/foo"; for (String sessId : sessIds) { @@ -361,16 +336,15 @@ public class DefaultSubscriptionRegistryTests { this.registry.unregisterSubscription(unsubscribeMessage(sessIds.get(0), subscriptionIds.get(2))); MultiValueMap actual = this.registry.findSubscriptions(createMessage(dest)); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected two elements: " + actual).hasSize(2); + assertThat(actual).hasSize(2); assertThat(sort(actual.get(sessIds.get(1)))).isEqualTo(subscriptionIds); assertThat(sort(actual.get(sessIds.get(2)))).isEqualTo(subscriptionIds); } @Test - public void unregisterAllSubscriptions() { - List sessIds = Arrays.asList("sess01", "sess02", "sess03"); - List subscriptionIds = Arrays.asList("subs01", "subs02", "subs03"); + void unregisterAllSubscriptions() { + List sessIds = List.of("sess01", "sess02", "sess03"); + List subscriptionIds = List.of("subs01", "subs02", "subs03"); String dest = "/foo"; for (String sessId : sessIds) { @@ -383,31 +357,28 @@ public class DefaultSubscriptionRegistryTests { this.registry.unregisterAllSubscriptions(sessIds.get(1)); MultiValueMap actual = this.registry.findSubscriptions(createMessage(dest)); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected one element: " + actual).hasSize(1); + assertThat(actual).hasSize(1); assertThat(sort(actual.get(sessIds.get(2)))).isEqualTo(subscriptionIds); } @Test - public void unregisterAllSubscriptionsNoMatch() { + void unregisterAllSubscriptionsNoMatch() { this.registry.unregisterAllSubscriptions("bogus"); // no exceptions } @Test - public void findSubscriptionsNoMatches() { + void findSubscriptionsNoMatches() { MultiValueMap actual = this.registry.findSubscriptions(createMessage("/foo")); - assertThat(actual).isNotNull(); - assertThat(actual).as("Expected no elements " + actual).isEmpty(); + assertThat(actual).isEmpty(); } @Test // SPR-12665 - public void findSubscriptionsReturnsMapSafeToIterate() throws Exception { + void findSubscriptionsReturnsMapSafeToIterate() throws Exception { this.registry.registerSubscription(subscribeMessage("sess1", "1", "/foo")); this.registry.registerSubscription(subscribeMessage("sess2", "1", "/foo")); MultiValueMap subscriptions = this.registry.findSubscriptions(createMessage("/foo")); - assertThat(subscriptions).isNotNull(); assertThat(subscriptions).hasSize(2); Iterator>> iterator = subscriptions.entrySet().iterator(); @@ -420,12 +391,11 @@ public class DefaultSubscriptionRegistryTests { } @Test // SPR-13185 - public void findSubscriptionsReturnsMapSafeToIterateIncludingValues() throws Exception { + void findSubscriptionsReturnsMapSafeToIterateIncludingValues() throws Exception { this.registry.registerSubscription(subscribeMessage("sess1", "1", "/foo")); this.registry.registerSubscription(subscribeMessage("sess1", "2", "/foo")); MultiValueMap allSubscriptions = this.registry.findSubscriptions(createMessage("/foo")); - assertThat(allSubscriptions).isNotNull(); assertThat(allSubscriptions).hasSize(1); Iterator iteratorValues = allSubscriptions.get("sess1").iterator(); @@ -438,7 +408,7 @@ public class DefaultSubscriptionRegistryTests { } @Test // SPR-13555 - public void cacheLimitExceeded() throws Exception { + void cacheLimitExceeded() throws Exception { this.registry.setCacheLimit(1); this.registry.registerSubscription(subscribeMessage("sess1", "1", "/foo")); this.registry.registerSubscription(subscribeMessage("sess1", "2", "/bar"));