Skip to content

Commit 102ed25

Browse files
authored
Fix downloading pdf produces html as extension (#4965)
* Fix downloading pdf produces html as extension If we already have a filetype we use that instead of relying on the autodetection Fixes #4913 * add relativze if not an URL * Create Test for download pdf document heavy mocking and refactoring of ExternalFileType TODO : Cleanup * refactor and simply test fix cehckstyle fail test on exception
1 parent cbd3fdf commit 102ed25

File tree

8 files changed

+114
-61
lines changed

8 files changed

+114
-61
lines changed

src/main/java/org/jabref/gui/externalfiles/FindFullTextAction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.jabref.gui.BasePanel;
1414
import org.jabref.gui.DialogService;
1515
import org.jabref.gui.actions.SimpleCommand;
16+
import org.jabref.gui.externalfiletype.ExternalFileTypes;
1617
import org.jabref.gui.fieldeditors.LinkedFileViewModel;
1718
import org.jabref.gui.fieldeditors.LinkedFilesEditorViewModel;
1819
import org.jabref.gui.util.BackgroundTask;
@@ -136,15 +137,15 @@ private void addLinkedFileFromURL(URL url, BibEntry entry, Path targetDirectory)
136137
basePanel.getBibDatabaseContext(),
137138
Globals.TASK_EXECUTOR,
138139
dialogService,
139-
JabRefPreferences.getInstance());
140+
JabRefPreferences.getInstance(), ExternalFileTypes.getInstance());
140141

141142
try {
142143
URLDownload urlDownload = new URLDownload(newLinkedFile.getLink());
143144
BackgroundTask<Path> downloadTask = onlineFile.prepareDownloadTask(targetDirectory, urlDownload);
144145
downloadTask.onSuccess(destination -> {
145146
LinkedFile downloadedFile = LinkedFilesEditorViewModel.fromFile(
146147
destination,
147-
basePanel.getBibDatabaseContext().getFileDirectoriesAsPaths(JabRefPreferences.getInstance().getFilePreferences()));
148+
basePanel.getBibDatabaseContext().getFileDirectoriesAsPaths(JabRefPreferences.getInstance().getFilePreferences()), ExternalFileTypes.getInstance());
148149
entry.addFile(downloadedFile);
149150
dialogService.notify(Localization.lang("Finished downloading full text document for entry %0.",
150151
entry.getCiteKeyOptional().orElse(Localization.lang("undefined"))));

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,15 @@ public class LinkedFileViewModel extends AbstractViewModel {
6666
private final FilePreferences filePreferences;
6767
private final XmpPreferences xmpPreferences;
6868
private final LinkedFileHandler linkedFileHandler;
69+
private final ExternalFileTypes externalFileTypes;
6970

7071
public LinkedFileViewModel(LinkedFile linkedFile,
7172
BibEntry entry,
7273
BibDatabaseContext databaseContext,
7374
TaskExecutor taskExecutor,
7475
DialogService dialogService,
75-
JabRefPreferences preferences) {
76+
JabRefPreferences preferences,
77+
ExternalFileTypes externalFileTypes) {
7678

7779
this.linkedFile = linkedFile;
7880
this.filePreferences = preferences.getFilePreferences();
@@ -81,6 +83,7 @@ public LinkedFileViewModel(LinkedFile linkedFile,
8183
this.entry = entry;
8284
this.dialogService = dialogService;
8385
this.taskExecutor = taskExecutor;
86+
this.externalFileTypes = externalFileTypes;
8487

8588
xmpPreferences = preferences.getXMPPreferences();
8689
downloadOngoing.bind(downloadProgress.greaterThanOrEqualTo(0).and(downloadProgress.lessThan(1)));
@@ -402,7 +405,7 @@ public void download() {
402405
URLDownload urlDownload = new URLDownload(linkedFile.getLink());
403406
BackgroundTask<Path> downloadTask = prepareDownloadTask(targetDirectory.get(), urlDownload);
404407
downloadTask.onSuccess(destination -> {
405-
LinkedFile newLinkedFile = LinkedFilesEditorViewModel.fromFile(destination, databaseContext.getFileDirectoriesAsPaths(filePreferences));
408+
LinkedFile newLinkedFile = LinkedFilesEditorViewModel.fromFile(destination, databaseContext.getFileDirectoriesAsPaths(filePreferences), externalFileTypes);
406409
linkedFile.setLink(newLinkedFile.getLink());
407410
linkedFile.setFileType(newLinkedFile.getFileType());
408411
});
@@ -420,7 +423,7 @@ public BackgroundTask<Path> prepareDownloadTask(Path targetDirectory, URLDownloa
420423
String suggestedTypeName = suggestedType.map(ExternalFileType::getName).orElse("");
421424
linkedFile.setFileType(suggestedTypeName);
422425

423-
String suggestedName = linkedFileHandler.getSuggestedFileName();
426+
String suggestedName = linkedFileHandler.getSuggestedFileName(suggestedTypeName);
424427
return targetDirectory.resolve(suggestedName);
425428
})
426429
.then(destination -> new FileDownloadTask(urlDownload.getSource(), destination))
@@ -443,15 +446,15 @@ private Optional<ExternalFileType> inferFileTypeFromMimeType(URLDownload urlDown
443446

444447
if (mimeType != null) {
445448
LOGGER.debug("MIME Type suggested: " + mimeType);
446-
return ExternalFileTypes.getInstance().getExternalFileTypeByMimeType(mimeType);
449+
return externalFileTypes.getExternalFileTypeByMimeType(mimeType);
447450
} else {
448451
return Optional.empty();
449452
}
450453
}
451454

452455
private Optional<ExternalFileType> inferFileTypeFromURL(String url) {
453456
return URLUtil.getSuffix(url)
454-
.flatMap(extension -> ExternalFileTypes.getInstance().getExternalFileTypeByExt(extension));
457+
.flatMap(extension -> externalFileTypes.getExternalFileTypeByExt(extension));
455458
}
456459

457460
public LinkedFile getFile() {

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,22 @@ public class LinkedFilesEditorViewModel extends AbstractEditorViewModel {
4848
private final BibDatabaseContext databaseContext;
4949
private final TaskExecutor taskExecutor;
5050
private final JabRefPreferences preferences;
51+
private final ExternalFileTypes externalFileTypes = ExternalFileTypes.getInstance();
5152

5253
public LinkedFilesEditorViewModel(String fieldName, AutoCompleteSuggestionProvider<?> suggestionProvider,
5354
DialogService dialogService,
5455
BibDatabaseContext databaseContext,
5556
TaskExecutor taskExecutor,
5657
FieldCheckers fieldCheckers,
5758
JabRefPreferences preferences) {
59+
5860
super(fieldName, suggestionProvider, fieldCheckers);
5961

6062
this.dialogService = dialogService;
6163
this.databaseContext = databaseContext;
6264
this.taskExecutor = taskExecutor;
6365
this.preferences = preferences;
6466

65-
6667
BindingsHelper.bindContentBidirectional(
6768
files,
6869
text,
@@ -86,9 +87,9 @@ private static String getStringRepresentation(List<LinkedFileViewModel> files) {
8687
*
8788
* TODO: Move this method to {@link LinkedFile} as soon as {@link CustomExternalFileType} lives in model.
8889
*/
89-
public static LinkedFile fromFile(Path file, List<Path> fileDirectories) {
90+
public static LinkedFile fromFile(Path file, List<Path> fileDirectories, ExternalFileTypes externalFileTypesFile) {
9091
String fileExtension = FileHelper.getFileExtension(file).orElse("");
91-
ExternalFileType suggestedFileType = ExternalFileTypes.getInstance()
92+
ExternalFileType suggestedFileType = externalFileTypesFile
9293
.getExternalFileTypeByExt(fileExtension)
9394
.orElse(new UnknownExternalFileType(fileExtension));
9495
Path relativePath = FileUtil.relativize(file, fileDirectories);
@@ -98,8 +99,8 @@ public static LinkedFile fromFile(Path file, List<Path> fileDirectories) {
9899
public LinkedFileViewModel fromFile(Path file) {
99100
List<Path> fileDirectories = databaseContext.getFileDirectoriesAsPaths(preferences.getFilePreferences());
100101

101-
LinkedFile linkedFile = fromFile(file, fileDirectories);
102-
return new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences);
102+
LinkedFile linkedFile = fromFile(file, fileDirectories, externalFileTypes);
103+
return new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileTypes);
103104

104105
}
105106

@@ -113,7 +114,7 @@ public BooleanProperty fulltextLookupInProgressProperty() {
113114

114115
private List<LinkedFileViewModel> parseToFileViewModel(String stringValue) {
115116
return FileFieldParser.parse(stringValue).stream()
116-
.map(linkedFile -> new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences))
117+
.map(linkedFile -> new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileTypes))
117118
.collect(Collectors.toList());
118119
}
119120

@@ -135,8 +136,8 @@ public void addNewFile() {
135136

136137
List<Path> fileDirectories = databaseContext.getFileDirectoriesAsPaths(preferences.getFilePreferences());
137138
dialogService.showFileOpenDialog(fileDialogConfiguration).ifPresent(newFile -> {
138-
LinkedFile newLinkedFile = fromFile(newFile, fileDirectories);
139-
files.add(new LinkedFileViewModel(newLinkedFile, entry, databaseContext, taskExecutor, dialogService, preferences));
139+
LinkedFile newLinkedFile = fromFile(newFile, fileDirectories, externalFileTypes);
140+
files.add(new LinkedFileViewModel(newLinkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileTypes));
140141
});
141142
}
142143

@@ -162,7 +163,7 @@ private List<LinkedFileViewModel> findAssociatedNotLinkedFiles(BibEntry entry) {
162163
try {
163164
List<LinkedFile> linkedFiles = util.findAssociatedNotLinkedFiles(entry);
164165
for (LinkedFile linkedFile : linkedFiles) {
165-
LinkedFileViewModel newLinkedFile = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences);
166+
LinkedFileViewModel newLinkedFile = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileTypes);
166167
newLinkedFile.markAsAutomaticallyFound();
167168
result.add(newLinkedFile);
168169
}
@@ -205,7 +206,7 @@ public void addFromURL() {
205206
}
206207

207208
private void addFromURL(URL url) {
208-
LinkedFileViewModel onlineFile = new LinkedFileViewModel(new LinkedFile(url, ""), entry, databaseContext, taskExecutor, dialogService, preferences);
209+
LinkedFileViewModel onlineFile = new LinkedFileViewModel(new LinkedFile(url, ""), entry, databaseContext, taskExecutor, dialogService, preferences, externalFileTypes);
209210
files.add(onlineFile);
210211
onlineFile.download();
211212
}

src/main/java/org/jabref/gui/filelist/AttachFileAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.jabref.gui.BasePanel;
77
import org.jabref.gui.DialogService;
88
import org.jabref.gui.actions.SimpleCommand;
9+
import org.jabref.gui.externalfiletype.ExternalFileTypes;
910
import org.jabref.gui.fieldeditors.LinkedFilesEditorViewModel;
1011
import org.jabref.gui.undo.UndoableFieldChange;
1112
import org.jabref.gui.util.FileDialogConfiguration;
@@ -38,7 +39,7 @@ public void execute() {
3839

3940
dialogService.showFileOpenDialog(fileDialogConfiguration).ifPresent(newFile -> {
4041

41-
LinkedFile linkedFile = LinkedFilesEditorViewModel.fromFile(newFile, panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences()));
42+
LinkedFile linkedFile = LinkedFilesEditorViewModel.fromFile(newFile, panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences()), ExternalFileTypes.getInstance());
4243

4344
LinkedFileEditDialogView dialog = new LinkedFileEditDialogView(linkedFile);
4445

src/main/java/org/jabref/gui/filelist/LinkedFilesEditDialogViewModel.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ public void openBrowseDialog() {
7676
String fileName = Paths.get(fileText).getFileName().toString();
7777

7878
FileDialogConfiguration fileDialogConfiguration = new FileDialogConfiguration.Builder()
79-
.withInitialDirectory(workingDir)
80-
.withInitialFileName(fileName)
81-
.build();
79+
.withInitialDirectory(workingDir)
80+
.withInitialFileName(fileName)
81+
.build();
8282

8383
dialogService.showFileOpenDialog(fileDialogConfiguration).ifPresent(path -> {
8484
// Store the directory for next time:
@@ -92,8 +92,11 @@ public void openBrowseDialog() {
9292
public void setValues(LinkedFile linkedFile) {
9393
description.set(linkedFile.getDescription());
9494

95-
Path linkPath = Paths.get(linkedFile.getLink());
96-
link.set(relativize(linkPath));
95+
if (linkedFile.isOnlineLink()) {
96+
link.setValue(linkedFile.getLink()); //Might be an URL
97+
} else {
98+
link.setValue(relativize(Paths.get(linkedFile.getLink())));
99+
}
97100

98101
selectedExternalFileType.setValue(null);
99102

src/main/java/org/jabref/gui/maintable/MainTableColumnFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ class MainTableColumnFactory {
6565
private final CellFactory cellFactory;
6666
private final UndoManager undoManager;
6767
private final DialogService dialogService;
68+
6869

6970
public MainTableColumnFactory(BibDatabaseContext database, ColumnPreferences preferences, ExternalFileTypes externalFileTypes, UndoManager undoManager, DialogService dialogService) {
7071
this.database = Objects.requireNonNull(database);
@@ -264,7 +265,7 @@ private TableColumn<BibEntryTableViewModel, List<LinkedFile>> createFileColumn()
264265
.withOnMouseClickedEvent((entry, linkedFiles) -> event -> {
265266
if ((event.getButton() == MouseButton.PRIMARY) && (linkedFiles.size() == 1)) {
266267
// Only one linked file -> open directly
267-
LinkedFileViewModel linkedFileViewModel = new LinkedFileViewModel(linkedFiles.get(0), entry.getEntry(), database, Globals.TASK_EXECUTOR, dialogService, Globals.prefs);
268+
LinkedFileViewModel linkedFileViewModel = new LinkedFileViewModel(linkedFiles.get(0), entry.getEntry(), database, Globals.TASK_EXECUTOR, dialogService, Globals.prefs, externalFileTypes);
268269
linkedFileViewModel.open();
269270
}
270271
})
@@ -287,7 +288,7 @@ private ContextMenu createFileMenu(BibEntryTableViewModel entry, List<LinkedFile
287288
ContextMenu contextMenu = new ContextMenu();
288289

289290
for (LinkedFile linkedFile : linkedFiles) {
290-
LinkedFileViewModel linkedFileViewModel = new LinkedFileViewModel(linkedFile, entry.getEntry(), database, Globals.TASK_EXECUTOR, dialogService, Globals.prefs);
291+
LinkedFileViewModel linkedFileViewModel = new LinkedFileViewModel(linkedFile, entry.getEntry(), database, Globals.TASK_EXECUTOR, dialogService, Globals.prefs, externalFileTypes);
291292

292293
MenuItem menuItem = new MenuItem(linkedFileViewModel.getDescriptionAndLink(), linkedFileViewModel.getTypeIcon().getGraphicNode());
293294
menuItem.setOnAction(event -> linkedFileViewModel.open());

src/main/java/org/jabref/logic/externalfiles/LinkedFileHandler.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.slf4j.LoggerFactory;
2020

2121
public class LinkedFileHandler {
22+
2223
private static final Logger LOGGER = LoggerFactory.getLogger(LinkedFileHandler.class);
2324

2425
private final BibDatabaseContext databaseContext;
@@ -84,7 +85,7 @@ public boolean renameToName(String targetFileName) throws IOException {
8485

8586
String expandedOldFilePath = oldFile.get().toString();
8687
boolean pathsDifferOnlyByCase = newPath.toString().equalsIgnoreCase(expandedOldFilePath)
87-
&& !newPath.toString().equals(expandedOldFilePath);
88+
&& !newPath.toString().equals(expandedOldFilePath);
8889

8990
if (Files.exists(newPath) && !pathsDifferOnlyByCase) {
9091
// We do not overwrite files
@@ -113,9 +114,14 @@ private String relativize(Path path) {
113114
public String getSuggestedFileName() {
114115
String oldFileName = fileEntry.getLink();
115116

117+
String extension = FileHelper.getFileExtension(oldFileName).orElse(fileEntry.getFileType());
118+
return getSuggestedFileName(extension);
119+
}
120+
121+
public String getSuggestedFileName(String extension) {
116122
String targetFileName = FileUtil.createFileNameFromPattern(databaseContext.getDatabase(), entry, filePreferences.getFileNamePattern()).trim()
117-
+ '.'
118-
+ FileHelper.getFileExtension(oldFileName).orElse(fileEntry.getFileType());
123+
+ '.'
124+
+ extension;
119125

120126
// Only create valid file names
121127
return FileUtil.getValidFileName(targetFileName);

0 commit comments

Comments
 (0)