From b2ca36f09876ecb15345ad886a7303b0ae43264c Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Wed, 19 Jul 2023 12:16:01 +0300 Subject: [PATCH] Stop using Constants utility in JmsAccessor See gh-30851 --- .../jms/support/JmsAccessor.java | 21 +++++++++++++--- .../jms/support/JmsAccessorTests.java | 25 +++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/spring-jms/src/main/java/org/springframework/jms/support/JmsAccessor.java b/spring-jms/src/main/java/org/springframework/jms/support/JmsAccessor.java index dd25415e0b..e7a2ff4f8c 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/JmsAccessor.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/JmsAccessor.java @@ -16,6 +16,8 @@ package org.springframework.jms.support; +import java.util.Map; + import jakarta.jms.Connection; import jakarta.jms.ConnectionFactory; import jakarta.jms.JMSException; @@ -24,7 +26,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.Constants; import org.springframework.jms.JmsException; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -40,14 +41,23 @@ import org.springframework.util.Assert; * See {@link org.springframework.jms.core.JmsTemplate}. * * @author Juergen Hoeller + * @author Sam Brannen * @since 1.2 * @see org.springframework.jms.support.destination.JmsDestinationAccessor * @see org.springframework.jms.core.JmsTemplate */ public abstract class JmsAccessor implements InitializingBean { - /** Constants instance for {@code jakarta.jms.Session}. */ - private static final Constants sessionConstants = new Constants(Session.class); + /** + * Map of constant names to constant values for the constants defined in + * {@link jakarta.jms.Session}. + */ + private static final Map sessionConstants = Map.of( + "AUTO_ACKNOWLEDGE", Session.AUTO_ACKNOWLEDGE, + "CLIENT_ACKNOWLEDGE", Session.CLIENT_ACKNOWLEDGE, + "DUPS_OK_ACKNOWLEDGE", Session.DUPS_OK_ACKNOWLEDGE, + "SESSION_TRANSACTED", Session.SESSION_TRANSACTED + ); /** Logger available to subclasses. */ @@ -133,7 +143,10 @@ public abstract class JmsAccessor implements InitializingBean { * @see jakarta.jms.Connection#createSession(int) */ public void setSessionAcknowledgeModeName(String constantName) { - setSessionAcknowledgeMode(sessionConstants.asNumber(constantName).intValue()); + Assert.hasText(constantName, "'constantName' must not be null or blank"); + Integer acknowledgeMode = sessionConstants.get(constantName); + Assert.notNull(acknowledgeMode, "Only acknowledge mode constants allowed"); + setSessionAcknowledgeMode(acknowledgeMode); } /** diff --git a/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java b/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java index 9ff48c7bd1..5ab60a5a65 100644 --- a/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java @@ -16,11 +16,18 @@ package org.springframework.jms.support; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.stream.Stream; + import jakarta.jms.Session; import org.junit.jupiter.api.Test; +import org.springframework.util.ReflectionUtils; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.assertThatNoException; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; @@ -70,6 +77,24 @@ class JmsAccessorTests { assertThatIllegalArgumentException().isThrownBy(() -> accessor.setSessionAcknowledgeModeName("bogus")); } + /** + * This test effectively verifies that the internal 'constants' map is properly + * configured for all acknowledge mode constants constants defined in + * {@link jakarta.jms.Session}. + */ + @Test + void setSessionAcknowledgeModeNameToAllSupportedValues() { + streamAcknowledgeModeConstants() + .map(Field::getName) + .forEach(name -> assertThatNoException().isThrownBy(() -> accessor.setSessionAcknowledgeModeName(name))); + } + + + private static Stream streamAcknowledgeModeConstants() { + return Arrays.stream(Session.class.getFields()) + .filter(ReflectionUtils::isPublicStaticFinal); + } + @Test void customAcknowledgeModeIsConsideredClientAcknowledge() throws Exception { Session session = mock();