sanitizeFileName — don't create stringBuilder/string if name is sanitized

This commit is contained in:
Vladimir Krivosheev
2014-10-30 10:50:34 +01:00
parent 474265a523
commit e3a8f92684
2 changed files with 46 additions and 12 deletions
@@ -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();
}
@@ -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"));
}
}