From 8d16d8cc028d35eacf7fcac6ad927aeab93b0ca5 Mon Sep 17 00:00:00 2001 From: Chris Bono Date: Thu, 17 Oct 2024 15:07:16 -0500 Subject: [PATCH] Specify locale in toLowerCase|toUpperCase This commit makes sure that all usages of String toLowerCase and toUpperCase specify a Locale (default of Locale.ROOT). --- .../pulsar/gradle/JavaConventionsPlugin.java | 3 ++- .../docs/AsciidoctorConventionsPlugin.java | 3 ++- gradle/version-catalog-update.gradle | 2 +- ...arFunctionAdministrationIntegrationTests.java | 3 ++- .../pages/reference/pulsar/transactions.adoc | 11 ++++++----- .../function/PulsarFunctionAdministration.java | 3 ++- .../support/header/PulsarHeaderMatcher.java | 5 +++-- .../pulsar/core/DefaultTopicResolverTests.java | 6 ++++-- src/checkstyle/checkstyle.xml | 16 ++++++++++++++++ 9 files changed, 38 insertions(+), 14 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/pulsar/gradle/JavaConventionsPlugin.java b/buildSrc/src/main/java/org/springframework/pulsar/gradle/JavaConventionsPlugin.java index f7d7422f5..85ec7869d 100644 --- a/buildSrc/src/main/java/org/springframework/pulsar/gradle/JavaConventionsPlugin.java +++ b/buildSrc/src/main/java/org/springframework/pulsar/gradle/JavaConventionsPlugin.java @@ -18,6 +18,7 @@ import java.util.Arrays; import java.util.Collections; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -204,7 +205,7 @@ private void configureDependencyManagement(Project project) { configuration.setCanBeResolved(false); }); configurations - .matching((c) -> c.getName().endsWith("Classpath") || c.getName().toLowerCase().endsWith("annotationprocessor")) + .matching((c) -> c.getName().endsWith("Classpath") || c.getName().toLowerCase(Locale.ROOT).endsWith("annotationprocessor")) .all((c) -> c.extendsFrom(dependencyManagement)); Dependency pulsarDependencies = project.getDependencies().enforcedPlatform(project.getDependencies() .project(Collections.singletonMap("path", ":spring-pulsar-dependencies"))); diff --git a/buildSrc/src/main/java/org/springframework/pulsar/gradle/docs/AsciidoctorConventionsPlugin.java b/buildSrc/src/main/java/org/springframework/pulsar/gradle/docs/AsciidoctorConventionsPlugin.java index 4c3cc1eb1..86ff12639 100644 --- a/buildSrc/src/main/java/org/springframework/pulsar/gradle/docs/AsciidoctorConventionsPlugin.java +++ b/buildSrc/src/main/java/org/springframework/pulsar/gradle/docs/AsciidoctorConventionsPlugin.java @@ -20,6 +20,7 @@ import java.net.URI; import java.util.Collections; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask; @@ -121,7 +122,7 @@ private void configureAsciidoctorTask(Project project, AbstractAsciidoctorTask a asciidoctorTask.baseDirFollowsSourceDir(); createSyncDocumentationSourceTask(project, asciidoctorTask); if (asciidoctorTask instanceof AsciidoctorTask task) { - boolean pdf = task.getName().toLowerCase().contains("pdf"); + boolean pdf = task.getName().toLowerCase(Locale.ROOT).contains("pdf"); String backend = (!pdf) ? "spring-html" : "spring-pdf"; task.outputOptions((outputOptions) -> outputOptions.backends(backend)); } diff --git a/gradle/version-catalog-update.gradle b/gradle/version-catalog-update.gradle index 42fa330ea..9a4b1e11b 100644 --- a/gradle/version-catalog-update.gradle +++ b/gradle/version-catalog-update.gradle @@ -4,7 +4,7 @@ def isNonStable = { String version -> if (unstableKeyword) { return true } - def containsStableKeyword = ['RELEASE', 'FINAL', 'GA'].any { it -> version.toUpperCase().contains(it) } + def containsStableKeyword = ['RELEASE', 'FINAL', 'GA'].any { it -> version.toUpperCase(Locale.ROOT).contains(it) } def containsStableSuffix = (version ==~ /^[0-9,.v-]+(-r)?$/) return !containsStableKeyword && !containsStableSuffix } diff --git a/integration-tests/src/intTest/java/org/springframework/pulsar/inttest/function/PulsarFunctionAdministrationIntegrationTests.java b/integration-tests/src/intTest/java/org/springframework/pulsar/inttest/function/PulsarFunctionAdministrationIntegrationTests.java index 284653d9f..549ddebaf 100644 --- a/integration-tests/src/intTest/java/org/springframework/pulsar/inttest/function/PulsarFunctionAdministrationIntegrationTests.java +++ b/integration-tests/src/intTest/java/org/springframework/pulsar/inttest/function/PulsarFunctionAdministrationIntegrationTests.java @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.concurrent.CountDownLatch; @@ -222,7 +223,7 @@ static PulsarSource rabbitPulsarSource(@Nullable FunctionStopPolicy stopPolicy) // custom network and a network alias 'rabbitmq' and the exposed port '5672'. // This differs from typical RabbitTemplate/RabbitProperties coordinates which // require the mapped host and port (outside the container). - String suffix = stopPolicy != null ? ("-" + stopPolicy.name().toLowerCase()) : ""; + String suffix = stopPolicy != null ? ("-" + stopPolicy.name().toLowerCase(Locale.ROOT)) : ""; Map configs = new HashMap<>(); configs.put("host", "rabbitmq"); configs.put("port", 5672); 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 d3baa783a..00e9b5d2d 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 @@ -89,11 +89,12 @@ A common transactional pattern is where a consumer reads messages from a Pulsar The framework supports this use case when transactions are enabled and your listener method uses a transactional `PulsarTemplate` to produce the transformed message. Given the following listener method: -[source, java] + +[source,java] ---- -@PulsarListener(topics = "my-input-topic") // <1> +import java.util.Locale;@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> ---- @@ -212,10 +213,10 @@ The DB transaction is committed first; if the Pulsar transaction fails to commit [source,java] ---- -@PulsarListener(topics = "my-input-topic") +import java.util.Locale;@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 de038d61d..9dac885da 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.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 @@ private Optional safeInvoke(Runnable invocation) { } 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 95ee67ba3..629acc1af 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 static PatternMatch fromPatternString(String pattern) { 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/spring-pulsar/src/test/java/org/springframework/pulsar/core/DefaultTopicResolverTests.java b/spring-pulsar/src/test/java/org/springframework/pulsar/core/DefaultTopicResolverTests.java index 02466039b..17e4d57d7 100644 --- a/spring-pulsar/src/test/java/org/springframework/pulsar/core/DefaultTopicResolverTests.java +++ b/spring-pulsar/src/test/java/org/springframework/pulsar/core/DefaultTopicResolverTests.java @@ -22,6 +22,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import java.util.Locale; import java.util.stream.Stream; import org.apache.pulsar.common.schema.SchemaType; @@ -204,7 +205,7 @@ void spelExpressionIsResolved(@Autowired DefaultTopicResolver topicResolver) { @Test void embeddedExpressionIsResolved(@Autowired DefaultTopicResolver topicResolver) { assertThat(topicResolver.resolveTopic(null, MsgTypeWithTopicEmbeddedExpression.class, () -> defaultTopic) - .value().orElse(null)).isEqualTo("my-custom-property-topic".toUpperCase()); + .value().orElse(null)).isEqualTo("my-custom-property-topic".toUpperCase(Locale.ROOT)); } // @formatter:on @@ -226,7 +227,8 @@ record MsgTypeWithTopicPropertyExpression(String value) { record MsgTypeWithTopicSpELExpression(String value) { } - @PulsarMessage(topic = "#{T(java.lang.String).valueOf('${app.customPropertyTopic}').toUpperCase()}") + @PulsarMessage( + topic = "#{T(java.lang.String).valueOf('${app.customPropertyTopic}').toUpperCase(java.util.Locale.ROOT)}") record MsgTypeWithTopicEmbeddedExpression(String value) { } diff --git a/src/checkstyle/checkstyle.xml b/src/checkstyle/checkstyle.xml index 06f99f55f..d10e07be1 100644 --- a/src/checkstyle/checkstyle.xml +++ b/src/checkstyle/checkstyle.xml @@ -169,6 +169,22 @@ value="Please use AssertJ imports."/> + + + + + + + + + + + + + +