From e3a8f92684caa6ee80425969af3d6ee78eb2ac4c Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 30 Oct 2014 08:48:04 +0100 Subject: [PATCH] =?UTF-8?q?sanitizeFileName=20=E2=80=94=20don't=20create?= =?UTF-8?q?=20stringBuilder/string=20if=20name=20is=20sanitized?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../intellij/openapi/util/io/FileUtil.java | 41 ++++++++++++++----- .../openapi/util/io/FileUtilLightTest.java | 17 +++++++- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java index d7d632377ab4..473aa8acda70 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java @@ -1053,21 +1053,40 @@ public class FileUtil extends FileUtilRt { */ @NotNull public static String sanitizeFileName(@NotNull String name) { - StringBuilder result = new StringBuilder(); - - for (int i = 0; i < name.length(); i++) { - final char ch = name.charAt(i); - - if (ch > 0 && ch < 255) { - if (Character.isLetterOrDigit(ch)) { - result.append(ch); - } - else { - result.append("_"); + StringBuilder result = null; + int last = 0; + int length = name.length(); + for (int i = 0; i < length; i++) { + char c = name.charAt(i); + boolean appendReplacement = true; + if (c > 0 && c < 255) { + if (Character.isLetterOrDigit(c) || c == '_') { + continue; } } + else { + appendReplacement = false; + } + + if (result == null) { + result = new StringBuilder(); + } + if (last < i) { + result.append(name, last, i); + } + if (appendReplacement) { + result.append('_'); + } + last = i + 1; } + if (result == null) { + return name; + } + + if (last < length) { + result.append(name, last, length); + } return result.toString(); } diff --git a/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilLightTest.java b/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilLightTest.java index dd1f46dace4c..e0c0f9b64130 100644 --- a/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilLightTest.java +++ b/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilLightTest.java @@ -24,7 +24,6 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.Convertor; import org.junit.Test; -import java.io.File; import java.io.IOException; import java.io.StringReader; import java.util.Arrays; @@ -32,6 +31,8 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.sameInstance; import static org.junit.Assert.*; public class FileUtilLightTest { @@ -198,4 +199,18 @@ public class FileUtilLightTest { String expected = SystemInfo.isWindows ? "~\\relative" : "~/relative"; assertEquals(expected, FileUtil.getLocationRelativeToUserHome(SystemProperties.getUserHome() + "/relative", false)); } + + @Test + public void sanitizeFileName() { + String newS = "tmp"; + assertThat(FileUtil.sanitizeFileName(newS), sameInstance(newS)); + assertThat(FileUtil.sanitizeFileName("_test"), sameInstance("_test")); + + assertThat(FileUtil.sanitizeFileName(" "), equalTo("_")); + assertThat(FileUtil.sanitizeFileName("\u2026"), equalTo("")); + assertThat(FileUtil.sanitizeFileName("q_test"), sameInstance("q_test")); + assertThat(FileUtil.sanitizeFileName("12_"), sameInstance("12_")); + assertThat(FileUtil.sanitizeFileName("12_ 123"), equalTo("12___123")); + assertThat(FileUtil.sanitizeFileName(" 12\u2026123"), equalTo("_12123")); + } }