From 123b17df0d0693aab743e5d6d2664c5a4bea0303 Mon Sep 17 00:00:00 2001 From: Chris Bono Date: Thu, 17 Oct 2024 16:26:26 -0500 Subject: [PATCH] Specify locale in toLowerCase|toUpperCase (#893) This commit makes sure that all usages of String toLowerCase and toUpperCase specify a Locale (default of Locale.ROOT). Also, a checkstyle rule is added to prevent usage of the no-arg variant of String toLowerCase and toUpperCase. --- .../pages/reference/pulsar/transactions.adoc | 4 ++-- .../function/PulsarFunctionAdministration.java | 3 ++- .../support/header/PulsarHeaderMatcher.java | 5 +++-- src/checkstyle/checkstyle-suppressions.xml | 2 ++ src/checkstyle/checkstyle.xml | 16 ++++++++++++++++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/spring-pulsar-docs/src/main/antora/modules/ROOT/pages/reference/pulsar/transactions.adoc b/spring-pulsar-docs/src/main/antora/modules/ROOT/pages/reference/pulsar/transactions.adoc index d3baa783..c15ade7e 100644 --- a/spring-pulsar-docs/src/main/antora/modules/ROOT/pages/reference/pulsar/transactions.adoc +++ b/spring-pulsar-docs/src/main/antora/modules/ROOT/pages/reference/pulsar/transactions.adoc @@ -93,7 +93,7 @@ Given the following listener method: ---- @PulsarListener(topics = "my-input-topic") // <1> void listen(String msg) { // <2> - var transformedMsg = msg.toUpperCase(); // <3> + var transformedMsg = msg.toUpperCase(Locale.ROOT); // <3> this.transactionalTemplate.send("my-output-topic", transformedMsg); // <4> } // <5> <6> ---- @@ -215,7 +215,7 @@ The DB transaction is committed first; if the Pulsar transaction fails to commit @PulsarListener(topics = "my-input-topic") @Transactional("dataSourceTransactionManager") void listen(String msg) { - var transformedMsg = msg.toUpperCase(); + var transformedMsg = msg.toUpperCase(Locale.ROOT); this.pulsarTemplate.send("my-output-topic", transformedMsg); this.jdbcTemplate.execute("insert into my_table (data) values ('%s')".formatted(transformedMsg)); } diff --git a/spring-pulsar/src/main/java/org/springframework/pulsar/function/PulsarFunctionAdministration.java b/spring-pulsar/src/main/java/org/springframework/pulsar/function/PulsarFunctionAdministration.java index de038d61..9dac885d 100644 --- a/spring-pulsar/src/main/java/org/springframework/pulsar/function/PulsarFunctionAdministration.java +++ b/spring-pulsar/src/main/java/org/springframework/pulsar/function/PulsarFunctionAdministration.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.stream.Stream; @@ -314,7 +315,7 @@ public class PulsarFunctionAdministration implements SmartLifecycle { } private String functionDesc(PulsarFunctionOperations function) { - return "'%s' %s".formatted(function.name(), function.type().toString().toLowerCase()); + return "'%s' %s".formatted(function.name(), function.type().toString().toLowerCase(Locale.ROOT)); } /** diff --git a/spring-pulsar/src/main/java/org/springframework/pulsar/support/header/PulsarHeaderMatcher.java b/spring-pulsar/src/main/java/org/springframework/pulsar/support/header/PulsarHeaderMatcher.java index 95ee67ba..629acc1a 100644 --- a/spring-pulsar/src/main/java/org/springframework/pulsar/support/header/PulsarHeaderMatcher.java +++ b/spring-pulsar/src/main/java/org/springframework/pulsar/support/header/PulsarHeaderMatcher.java @@ -16,6 +16,7 @@ package org.springframework.pulsar.support.header; +import java.util.Locale; import java.util.Set; import org.springframework.core.log.LogAccessor; @@ -92,13 +93,13 @@ public interface PulsarHeaderMatcher { public PatternMatch(String pattern, boolean negate) { Assert.notNull(pattern, "Pattern must not be null"); - this.pattern = pattern.toLowerCase(); + this.pattern = pattern.toLowerCase(Locale.ROOT); this.negate = negate; } @Override public boolean matchHeader(String headerName) { - if (!PatternMatchUtils.simpleMatch(this.pattern, headerName.toLowerCase())) { + if (!PatternMatchUtils.simpleMatch(this.pattern, headerName.toLowerCase(Locale.ROOT))) { return false; } LOGGER.debug(() -> "headerName=[%s] WILL %s be mapped, matched pattern=%s".formatted(headerName, diff --git a/src/checkstyle/checkstyle-suppressions.xml b/src/checkstyle/checkstyle-suppressions.xml index 83ed763d..e695ac0f 100644 --- a/src/checkstyle/checkstyle-suppressions.xml +++ b/src/checkstyle/checkstyle-suppressions.xml @@ -9,6 +9,8 @@ + + diff --git a/src/checkstyle/checkstyle.xml b/src/checkstyle/checkstyle.xml index 06f99f55..d10e07be 100644 --- a/src/checkstyle/checkstyle.xml +++ b/src/checkstyle/checkstyle.xml @@ -169,6 +169,22 @@ value="Please use AssertJ imports."/> + + + + + + + + + + + + + +