From 25a00ae2e6587e9eab9c34565294a3c73f319443 Mon Sep 17 00:00:00 2001 From: Nicolas QUINQUENEL Date: Wed, 29 Jan 2025 09:11:14 +0100 Subject: [PATCH] Fix SSF-699 --- .../core/commons/util/StringUtils.java | 13 ++++++++++++- .../core/commons/StringUtilsTests.java | 19 +++++++++++++++---- .../ShowFixSuggestionRequestHandler.java | 7 +++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/backend/commons/src/main/java/org/sonarsource/sonarlint/core/commons/util/StringUtils.java b/backend/commons/src/main/java/org/sonarsource/sonarlint/core/commons/util/StringUtils.java index 8e25837863..f98f8ce358 100644 --- a/backend/commons/src/main/java/org/sonarsource/sonarlint/core/commons/util/StringUtils.java +++ b/backend/commons/src/main/java/org/sonarsource/sonarlint/core/commons/util/StringUtils.java @@ -19,13 +19,24 @@ */ package org.sonarsource.sonarlint.core.commons.util; +import javax.annotation.Nullable; + public class StringUtils { + private static final char RTLO = '\u202E'; + public static String pluralize(long count, String word) { - var pluralizedWord = count == 1 || count == 0 ? word : (word + 's'); + var pluralizedWord = count == 1 ? word : (word + 's'); return count + " " + pluralizedWord; } + public static String sanitizeAgainstRTLO(@Nullable String input) { + if (input == null) { + return null; + } + return input.replaceAll(String.valueOf(RTLO), ""); + } + private StringUtils() { // utility class } diff --git a/backend/commons/src/test/java/org/sonarsource/sonarlint/core/commons/StringUtilsTests.java b/backend/commons/src/test/java/org/sonarsource/sonarlint/core/commons/StringUtilsTests.java index 66dbb015fa..cd07cfb294 100644 --- a/backend/commons/src/test/java/org/sonarsource/sonarlint/core/commons/StringUtilsTests.java +++ b/backend/commons/src/test/java/org/sonarsource/sonarlint/core/commons/StringUtilsTests.java @@ -20,17 +20,28 @@ package org.sonarsource.sonarlint.core.commons; import org.junit.jupiter.api.Test; -import org.sonarsource.sonarlint.core.commons.util.StringUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.sonarsource.sonarlint.core.commons.util.StringUtils.pluralize; +import static org.sonarsource.sonarlint.core.commons.util.StringUtils.sanitizeAgainstRTLO; class StringUtilsTests { @Test void should_pluralize_words() { - assertThat(StringUtils.pluralize(0, "word")).isEqualTo("0 word"); - assertThat(StringUtils.pluralize(1, "word")).isEqualTo("1 word"); - assertThat(StringUtils.pluralize(2, "word")).isEqualTo("2 words"); + assertThat(pluralize(0, "word")).isEqualTo("0 words"); + assertThat(pluralize(1, "word")).isEqualTo("1 word"); + assertThat(pluralize(2, "word")).isEqualTo("2 words"); + } + + @Test + void should_sanitize_against_rtlo() { + assertThat(sanitizeAgainstRTLO("This is a \u202eegassem")).isEqualTo("This is a egassem"); + } + + @Test + void should_sanitize_with_null() { + assertThat(sanitizeAgainstRTLO(null)).isNull(); } } diff --git a/backend/core/src/main/java/org/sonarsource/sonarlint/core/embedded/server/ShowFixSuggestionRequestHandler.java b/backend/core/src/main/java/org/sonarsource/sonarlint/core/embedded/server/ShowFixSuggestionRequestHandler.java index ea1d6df35e..5528581709 100644 --- a/backend/core/src/main/java/org/sonarsource/sonarlint/core/embedded/server/ShowFixSuggestionRequestHandler.java +++ b/backend/core/src/main/java/org/sonarsource/sonarlint/core/embedded/server/ShowFixSuggestionRequestHandler.java @@ -67,6 +67,7 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.StringUtils.isNotEmpty; +import static org.sonarsource.sonarlint.core.commons.util.StringUtils.sanitizeAgainstRTLO; public class ShowFixSuggestionRequestHandler implements HttpRequestHandler { @@ -333,6 +334,12 @@ public boolean isValid() { @VisibleForTesting public record ChangesPayload(TextRangePayload beforeLineRange, String before, String after) { + public ChangesPayload(TextRangePayload beforeLineRange, String before, String after) { + this.beforeLineRange = beforeLineRange; + this.before = sanitizeAgainstRTLO(before); + this.after = sanitizeAgainstRTLO(after); + } + public boolean isValid() { return beforeLineRange.isValid(); }