Skip to content

Commit 20d57e9

Browse files
author
Goutam Lavudiya
committed
fixes JabRef#6068
fixed downloading file with same name
1 parent 70b7058 commit 20d57e9

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.jabref.logic.externalfiles.LinkedFileHandler;
3939
import org.jabref.logic.l10n.Localization;
4040
import org.jabref.logic.net.URLDownload;
41+
import org.jabref.logic.util.io.FileNameHandler;
4142
import org.jabref.logic.xmp.XmpPreferences;
4243
import org.jabref.logic.xmp.XmpUtilWriter;
4344
import org.jabref.model.database.BibDatabaseContext;
@@ -419,6 +420,7 @@ public BackgroundTask<Path> prepareDownloadTask(Path targetDirectory, URLDownloa
419420
String suggestedTypeName = externalFileType.getName();
420421
linkedFile.setFileType(suggestedTypeName);
421422
String suggestedName = linkedFileHandler.getSuggestedFileName(externalFileType.getExtension());
423+
suggestedName = FileNameHandler.getNonOverWritingFileName(targetDirectory, suggestedName);
422424
return targetDirectory.resolve(suggestedName);
423425
})
424426
.then(destination -> new FileDownloadTask(urlDownload.getSource(), destination))

src/main/java/org/jabref/logic/util/io/FileNameHandler.java

+36
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package org.jabref.logic.util.io;
22

3+
import java.nio.file.Files;
4+
import java.nio.file.Path;
5+
import java.nio.file.Paths;
36
import java.util.Arrays;
7+
import java.util.Optional;
48

59
/**
610
* This class is based on http://stackoverflow.com/a/5626340/873282
@@ -67,6 +71,38 @@ public static String cleanDirectoryName(String badFileName) {
6771
return cleanName.toString().trim();
6872
}
6973

74+
/**
75+
* Returns an absolute path to a file which does not match with any existing file names
76+
*
77+
* @param targetDirectory The directory in which file name should be unique
78+
* @param fileName Suggested name for the file
79+
* @return a file-name such that it does not match any existing files in targetDirectory.
80+
* */
81+
public static String getNonOverWritingFileName(Path targetDirectory, String fileName) {
82+
String absoluteName = targetDirectory.resolve(fileName)
83+
.toString();
84+
85+
Optional<String> extensionOptional = FileUtil.getFileExtension(fileName);
86+
87+
// the suffix include the '.' , if extension is present Eg: ".pdf"
88+
String extensionSuffix = "";
89+
String fileNameWithoutExtension = fileName;
90+
91+
if(extensionOptional.isPresent()) {
92+
extensionSuffix = '.'+extensionOptional.get();
93+
fileNameWithoutExtension = fileName.substring(0, fileName.lastIndexOf('.'));
94+
}
95+
96+
Path absolutePath = Paths.get(absoluteName);
97+
String newFileName = fileName;
98+
99+
for(int counter = 1; Files.exists(absolutePath); ++counter) {
100+
newFileName = fileNameWithoutExtension+" ("+counter+")"+extensionSuffix;
101+
absolutePath = targetDirectory.resolve(newFileName);
102+
}
103+
return newFileName;
104+
}
105+
70106
private static boolean isCharLegal(char c) {
71107
return Arrays.binarySearch(FileNameHandler.ILLEGAL_CHARS, c) < 0;
72108
}

src/test/java/org/jabref/logic/util/io/FileNameHandlerTest.java

+21
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package org.jabref.logic.util.io;
22

33
import org.junit.jupiter.api.Test;
4+
import org.junit.jupiter.api.io.TempDir;
5+
6+
import java.io.IOException;
7+
import java.nio.file.Files;
8+
import java.nio.file.Path;
49

510
import static org.junit.jupiter.api.Assertions.assertEquals;
611

@@ -30,4 +35,20 @@ public void testCleanDirectoryNameForWindows() {
3035
public void testCleanCurlyBracesAsWell() {
3136
assertEquals("The Evolution of Sentiment_ Analysis_A Review of Research Topics, Venues, and Top Cited Papers.PDF", FileNameHandler.cleanFileName("The Evolution of Sentiment} Analysis}A Review of Research Topics, Venues, and Top Cited Papers.PDF"));
3237
}
38+
39+
@Test
40+
public void test_getNonOverWritingFileName_returnsUniqueName(@TempDir Path tempDirectory) throws IOException {
41+
String dummyFile1 = "default.txt";
42+
String dummyFile2 = "default (1).txt";
43+
String expectedFileName = "default (2).txt";
44+
45+
Files.createFile(tempDirectory.resolve(dummyFile1));
46+
Files.createFile(tempDirectory.resolve(dummyFile2));
47+
48+
String outputFileName = FileNameHandler.getNonOverWritingFileName(tempDirectory, "default.txt");
49+
assertEquals(expectedFileName, outputFileName);
50+
51+
Files.delete(tempDirectory.resolve(dummyFile1));
52+
Files.delete(tempDirectory.resolve(dummyFile2));
53+
}
3354
}

0 commit comments

Comments
 (0)