Skip to content

Commit

Permalink
Fix overwritting downloaded files with same name (#6174)
Browse files Browse the repository at this point in the history
- fixes #6068

Co-authored-by: Goutam Lavudiya <goutam_lavudiya@mentor.com>
  • Loading branch information
gtam25 and Goutam Lavudiya authored Mar 29, 2020
1 parent 9d9394e commit 7ec1d0c
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 1 deletion.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve
- We fixed an issue where opening a library from the recent libraries menu was not possible. [#5939](https://github.com/JabRef/jabref/issues/5939)
- We fixed an issue with inconsistent capitalization of file extensions when downloading files [#6115](https://github.com/JabRef/jabref/issues/6115)
- We fixed the display of language and encoding in the preferences dialog. [#6130](https://github.com/JabRef/jabref/pull/6130)

- We fixed an issue where search full-text documents downloaded files with same name, overwriting existing files. [#6174](https://github.com/JabRef/jabref/pull/6174)
### Removed

- We removed the obsolete `External programs / Open PDF` section in the preferences, as the default application to open PDFs is now set in the `Manage external file types` dialog. [#6130](https://github.com/JabRef/jabref/pull/6130)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import org.jabref.logic.externalfiles.LinkedFileHandler;
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.net.URLDownload;
import org.jabref.logic.util.io.FileNameUniqueness;
import org.jabref.logic.xmp.XmpPreferences;
import org.jabref.logic.xmp.XmpUtilWriter;
import org.jabref.model.database.BibDatabaseContext;
Expand Down Expand Up @@ -419,6 +420,7 @@ public BackgroundTask<Path> prepareDownloadTask(Path targetDirectory, URLDownloa
String suggestedTypeName = externalFileType.getName();
linkedFile.setFileType(suggestedTypeName);
String suggestedName = linkedFileHandler.getSuggestedFileName(externalFileType.getExtension());
suggestedName = FileNameUniqueness.getNonOverWritingFileName(targetDirectory, suggestedName);
return targetDirectory.resolve(suggestedName);
})
.then(destination -> new FileDownloadTask(urlDownload.getSource(), destination))
Expand Down
46 changes: 46 additions & 0 deletions src/main/java/org/jabref/logic/util/io/FileNameUniqueness.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package org.jabref.logic.util.io;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Optional;

public class FileNameUniqueness {

/**
* Returns a file-name such that it does not match any existing files in targetDirectory
*
* @param targetDirectory The directory in which file name should be unique
* @param fileName Suggested name for the file
* @return a file-name such that it does not match any existing files in targetDirectory.
* */
public static String getNonOverWritingFileName(Path targetDirectory, String fileName) {

Optional<String> extensionOptional = FileUtil.getFileExtension(fileName);

// the suffix include the '.' , if extension is present Eg: ".pdf"
String extensionSuffix;
String fileNameWithoutExtension;

if (extensionOptional.isPresent()) {
extensionSuffix = '.' + extensionOptional.get();
fileNameWithoutExtension = fileName.substring(0, fileName.lastIndexOf('.'));
}
else {
extensionSuffix = "";
fileNameWithoutExtension = fileName;
}

String newFileName = fileName;

int counter = 1;
while ( Files.exists(
targetDirectory.resolve(newFileName))
) {
newFileName = fileNameWithoutExtension +
" (" + counter + ")" +
extensionSuffix;
counter++;
}
return newFileName;
}
}
50 changes: 50 additions & 0 deletions src/test/java/org/jabref/logic/util/io/FileNameUniquenessTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package org.jabref.logic.util.io;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;

public class FileNameUniquenessTest {

@TempDir
protected Path tempDir;

@Test
public void testGetNonOverWritingFileNameReturnsSameName() throws IOException {

assertFalse(
Files.exists(tempDir.resolve("sameFile.txt"))
);

String outputFileName = FileNameUniqueness.getNonOverWritingFileName(tempDir, "sameFile.txt");
assertEquals("sameFile.txt", outputFileName);
}

@Test
public void testGetNonOverWritingFileNameReturnsUniqueNameOver1Conflict() throws IOException {
Path dummyFilePath1 = tempDir.resolve("differentFile.txt");

Files.createFile(dummyFilePath1);

String outputFileName = FileNameUniqueness.getNonOverWritingFileName(tempDir, "differentFile.txt");
assertEquals("differentFile (1).txt", outputFileName);
}

@Test
public void testGetNonOverWritingFileNameReturnsUniqueNameOverNConflicts() throws IOException {
Path dummyFilePath1 = tempDir.resolve("manyfiles.txt");
Path dummyFilePath2 = tempDir.resolve("manyfiles (1).txt");

Files.createFile(dummyFilePath1);
Files.createFile(dummyFilePath2);

String outputFileName = FileNameUniqueness.getNonOverWritingFileName(tempDir, "manyfiles.txt");
assertEquals("manyfiles (2).txt", outputFileName);
}
}

0 comments on commit 7ec1d0c

Please sign in to comment.