Skip to content

Commit 4c3e520

Browse files
authored
Fix that "Rename and move file" throws file not found exception (#4317)
* Fix that "Rename and move file" throws file not found exception Fixes #4307. Moreover, I refactored a bit how files are renamed/moved to the default file directory. This should make it easier to reuse the code. * Fix tests
1 parent 4c7194a commit 4c3e520

File tree

65 files changed

+558
-738
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+558
-738
lines changed

Diff for: src/main/java/org/jabref/cli/ArgumentProcessor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ private void exportFile(List<ParserResult> loaded, String[] data) {
454454
BibDatabaseContext databaseContext = pr.getDatabaseContext();
455455
databaseContext.setDatabaseFile(theFile);
456456
Globals.prefs.fileDirForDatabase = databaseContext
457-
.getFileDirectories(Globals.prefs.getFileDirectoryPreferences());
457+
.getFileDirectories(Globals.prefs.getFilePreferences());
458458
System.out.println(Localization.lang("Exporting") + ": " + data[0]);
459459
Optional<Exporter> exporter = Globals.exportFactory.getExporterByName(data[1]);
460460
if (!exporter.isPresent()) {

Diff for: src/main/java/org/jabref/gui/BasePanel.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public BasePanel(JabRefFrame frame, BasePanelPreferences preferences, BibDatabas
191191
this.tableModel = new MainTableDataModel(getBibDatabaseContext());
192192

193193
citationStyleCache = new CitationStyleCache(bibDatabaseContext);
194-
annotationCache = new FileAnnotationCache(bibDatabaseContext, Globals.prefs.getFileDirectoryPreferences());
194+
annotationCache = new FileAnnotationCache(bibDatabaseContext, Globals.prefs.getFilePreferences());
195195

196196
setupMainPanel();
197197

@@ -368,7 +368,7 @@ private void setupActions() {
368368
actions.put(Actions.OPEN_EXTERNAL_FILE, this::openExternalFile);
369369

370370
actions.put(Actions.OPEN_FOLDER, () -> JabRefExecutorService.INSTANCE.execute(() -> {
371-
final List<Path> files = FileUtil.getListOfLinkedFiles(mainTable.getSelectedEntries(), bibDatabaseContext.getFileDirectoriesAsPaths(Globals.prefs.getFileDirectoryPreferences()));
371+
final List<Path> files = FileUtil.getListOfLinkedFiles(mainTable.getSelectedEntries(), bibDatabaseContext.getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences()));
372372
for (final Path f : files) {
373373
try {
374374
JabRefDesktop.openFolderAndSelectFile(f.toAbsolutePath());
@@ -1398,7 +1398,7 @@ public void searchAndOpen() {
13981398
}
13991399

14001400
final Set<ExternalFileType> types = ExternalFileTypes.getInstance().getExternalFileTypeSelection();
1401-
final List<Path> dirs = basePanel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFileDirectoryPreferences());
1401+
final List<Path> dirs = basePanel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences());
14021402
final List<String> extensions = types.stream().map(ExternalFileType::getExtension).collect(Collectors.toList());
14031403

14041404
// Run the search operation:

Diff for: src/main/java/org/jabref/gui/PreviewPanel.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import org.jabref.model.database.BibDatabaseContext;
4242
import org.jabref.model.entry.BibEntry;
4343
import org.jabref.model.entry.event.FieldChangedEvent;
44-
import org.jabref.preferences.JabRefPreferences;
4544
import org.jabref.preferences.PreviewPreferences;
4645

4746
import com.google.common.eventbus.Subscribe;
@@ -89,12 +88,10 @@ public PreviewPanel(BasePanel panel, BibDatabaseContext databaseContext, KeyBind
8988
this.keyBindingRepository = keyBindingRepository;
9089

9190
fileHandler = new NewDroppedFileHandler(dialogService, databaseContext, externalFileTypes,
92-
Globals.prefs.getFileDirectoryPreferences(),
93-
Globals.prefs.getCleanupPreferences(Globals.journalAbbreviationLoader).getFileDirPattern(),
91+
Globals.prefs.getFilePreferences(),
9492
Globals.prefs.getImportFormatPreferences(),
9593
Globals.prefs.getUpdateFieldPreferences(),
96-
Globals.getFileUpdateMonitor(),
97-
Globals.prefs.get(JabRefPreferences.IMPORT_FILENAMEPATTERN));
94+
Globals.getFileUpdateMonitor());
9895

9996
// Set up scroll pane for preview pane
10097
setFitToHeight(true);

Diff for: src/main/java/org/jabref/gui/actions/CleanupAction.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,6 @@ private void doCleanup(CleanupPreset preset, BibEntry entry, NamedCompound ce) {
7474
Globals.journalAbbreviationLoader));
7575
List<FieldChange> changes = cleaner.cleanup(preset, entry);
7676

77-
unsuccessfulRenames = cleaner.getUnsuccessfulRenames();
78-
7977
if (changes.isEmpty()) {
8078
return;
8179
}
@@ -90,11 +88,7 @@ private void showResults() {
9088
if (isCanceled) {
9189
return;
9290
}
93-
if (unsuccessfulRenames > 0) { //Rename failed for at least one entry
94-
dialogService.showErrorDialogAndWait(
95-
Localization.lang("Autogenerate PDF Names"),
96-
Localization.lang("File rename failed for %0 entries.", Integer.toString(unsuccessfulRenames)));
97-
}
91+
9892
if (modifiedEntriesCount > 0) {
9993
panel.updateEntryEditorIfShowing();
10094
panel.markBaseChanged();

Diff for: src/main/java/org/jabref/gui/actions/IntegrityCheckAction.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public IntegrityCheckAction(JabRefFrame frame) {
4848
@Override
4949
public void execute() {
5050
IntegrityCheck check = new IntegrityCheck(frame.getCurrentBasePanel().getBibDatabaseContext(),
51-
Globals.prefs.getFileDirectoryPreferences(),
51+
Globals.prefs.getFilePreferences(),
5252
Globals.prefs.getBibtexKeyPatternPreferences(),
5353
Globals.journalAbbreviationLoader.getRepository(Globals.prefs.getJournalAbbreviationPreferences()),
5454
Globals.prefs.getBoolean(JabRefPreferences.ENFORCE_LEGAL_BIBTEX_KEY));

Diff for: src/main/java/org/jabref/gui/actions/WriteXMPAction.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ private void writeXMP() {
111111
// Make a list of all PDFs linked from this entry:
112112
List<Path> files = entry.getFiles().stream()
113113
.filter(file -> file.getFileType().equalsIgnoreCase("pdf"))
114-
.map(file -> file.findIn(basePanel.getBibDatabaseContext(), Globals.prefs.getFileDirectoryPreferences()))
114+
.map(file -> file.findIn(basePanel.getBibDatabaseContext(), Globals.prefs.getFilePreferences()))
115115
.filter(Optional::isPresent)
116116
.map(Optional::get)
117117
.collect(Collectors.toList());

Diff for: src/main/java/org/jabref/gui/cleanup/CleanupPresetPanel.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ private void init() {
5353
cleanUpISSN = new JCheckBox(Localization.lang("Reformat ISSN"));
5454

5555
Optional<Path> firstExistingDir = databaseContext
56-
.getFirstExistingFileDir(JabRefPreferences.getInstance().getFileDirectoryPreferences());
56+
.getFirstExistingFileDir(JabRefPreferences.getInstance().getFilePreferences());
5757
if (firstExistingDir.isPresent()) {
5858
cleanUpMovePDF = new JCheckBox(Localization.lang("Move linked files to default file directory %0",
5959
firstExistingDir.get().toString()));

Diff for: src/main/java/org/jabref/gui/copyfiles/CopyFilesTask.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ protected List<CopyFilesResultItemViewModel> call() throws InterruptedException,
7474

7575
LinkedFile fileName = files.get(j);
7676

77-
Optional<Path> fileToExport = fileName.findIn(databaseContext, Globals.prefs.getFileDirectoryPreferences());
77+
Optional<Path> fileToExport = fileName.findIn(databaseContext, Globals.prefs.getFilePreferences());
7878

7979
newPath = OptionalUtil.combine(Optional.of(exportPath), fileToExport, resolvePathFilename);
8080

Diff for: src/main/java/org/jabref/gui/desktop/JabRefDesktop.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static void openExternalViewer(BibDatabaseContext databaseContext, String
5757
String fieldName = initialFieldName;
5858
if (FieldName.PS.equals(fieldName) || FieldName.PDF.equals(fieldName)) {
5959
// Find the default directory for this field type:
60-
List<String> dir = databaseContext.getFileDirectories(fieldName, Globals.prefs.getFileDirectoryPreferences());
60+
List<String> dir = databaseContext.getFileDirectories(fieldName, Globals.prefs.getFilePreferences());
6161

6262
Optional<Path> file = FileHelper.expandFilename(link, dir);
6363

@@ -128,7 +128,7 @@ public static boolean openExternalFileAnyFormat(final BibDatabaseContext databas
128128
return true;
129129
}
130130

131-
Optional<Path> file = FileHelper.expandFilename(databaseContext, link, Globals.prefs.getFileDirectoryPreferences());
131+
Optional<Path> file = FileHelper.expandFilename(databaseContext, link, Globals.prefs.getFilePreferences());
132132
if (file.isPresent() && Files.exists(file.get())) {
133133
// Open the file:
134134
String filePath = file.get().toString();

Diff for: src/main/java/org/jabref/gui/documentviewer/DocumentViewerViewModel.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ private void setCurrentDocument(Path path) {
112112
public void switchToFile(LinkedFile file) {
113113
if (file != null) {
114114
stateManager.getActiveDatabase().ifPresent(database ->
115-
file.findIn(database, Globals.prefs.getFileDirectoryPreferences())
116-
.ifPresent(this::setCurrentDocument));
115+
file.findIn(database, Globals.prefs.getFilePreferences())
116+
.ifPresent(this::setCurrentDocument));
117117
}
118118
}
119119

Diff for: src/main/java/org/jabref/gui/entryeditor/EntryEditor.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import org.jabref.model.database.BibDatabaseContext;
4949
import org.jabref.model.entry.BibEntry;
5050
import org.jabref.model.util.FileUpdateMonitor;
51-
import org.jabref.preferences.JabRefPreferences;
5251

5352
import com.airhacks.afterburner.views.ViewLoader;
5453
import org.fxmisc.easybind.EasyBind;
@@ -102,12 +101,10 @@ public EntryEditor(BasePanel panel, EntryEditorPreferences preferences, FileUpda
102101
this.dialogService = dialogService;
103102

104103
fileHandler = new NewDroppedFileHandler(dialogService, databaseContext, externalFileTypes,
105-
Globals.prefs.getFileDirectoryPreferences(),
106-
Globals.prefs.getCleanupPreferences(Globals.journalAbbreviationLoader).getFileDirPattern(),
104+
Globals.prefs.getFilePreferences(),
107105
Globals.prefs.getImportFormatPreferences(),
108106
Globals.prefs.getUpdateFieldPreferences(),
109-
Globals.getFileUpdateMonitor(),
110-
Globals.prefs.get(JabRefPreferences.IMPORT_FILENAMEPATTERN));
107+
Globals.getFileUpdateMonitor());
111108

112109
ViewLoader.view(this)
113110
.root(this)

Diff for: src/main/java/org/jabref/gui/exporter/ExportCommand.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ private void export(Path file, FileChooser.ExtensionFilter selectedExtensionFilt
8686
// so formatters can resolve linked files correctly.
8787
// (This is an ugly hack!)
8888
Globals.prefs.fileDirForDatabase = frame.getCurrentBasePanel()
89-
.getBibDatabaseContext()
90-
.getFileDirectories(Globals.prefs.getFileDirectoryPreferences());
89+
.getBibDatabaseContext()
90+
.getFileDirectories(Globals.prefs.getFilePreferences());
9191

9292
// Make sure we remember which filter was used, to set
9393
// the default for next time:

Diff for: src/main/java/org/jabref/gui/exporter/ExportToClipboardAction.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ private String exportToClipboard(Exporter exporter) {
7373
// Set the global variable for this database's file directory before exporting,
7474
// so formatters can resolve linked files correctly.
7575
// (This is an ugly hack!)
76-
Globals.prefs.fileDirForDatabase = panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFileDirectoryPreferences()).stream().map(Path::toString).collect(Collectors.toList());
76+
Globals.prefs.fileDirForDatabase = panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences()).stream().map(Path::toString).collect(Collectors.toList());
7777

7878
Path tmp = null;
7979
try {

Diff for: src/main/java/org/jabref/gui/externalfiles/AutoSetFileLinksUtil.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import org.jabref.model.database.BibDatabaseContext;
1919
import org.jabref.model.entry.BibEntry;
2020
import org.jabref.model.entry.LinkedFile;
21-
import org.jabref.model.metadata.FileDirectoryPreferences;
21+
import org.jabref.model.metadata.FilePreferences;
2222
import org.jabref.model.util.FileHelper;
2323

2424
import org.slf4j.Logger;
@@ -31,8 +31,8 @@ public class AutoSetFileLinksUtil {
3131
private AutoLinkPreferences autoLinkPreferences;
3232
private ExternalFileTypes externalFileTypes;
3333

34-
public AutoSetFileLinksUtil(BibDatabaseContext databaseContext, FileDirectoryPreferences fileDirectoryPreferences, AutoLinkPreferences autoLinkPreferences, ExternalFileTypes externalFileTypes) {
35-
this(databaseContext.getFileDirectoriesAsPaths(fileDirectoryPreferences), autoLinkPreferences, externalFileTypes);
34+
public AutoSetFileLinksUtil(BibDatabaseContext databaseContext, FilePreferences filePreferences, AutoLinkPreferences autoLinkPreferences, ExternalFileTypes externalFileTypes) {
35+
this(databaseContext.getFileDirectoriesAsPaths(filePreferences), autoLinkPreferences, externalFileTypes);
3636
}
3737

3838
public AutoSetFileLinksUtil(List<Path> directories, AutoLinkPreferences autoLinkPreferences, ExternalFileTypes externalFileTypes) {
@@ -68,7 +68,7 @@ public List<LinkedFile> findAssociatedNotLinkedFiles(BibEntry entry) throws IOEx
6868
.orElse(Optional.of(new UnknownExternalFileType("")));
6969

7070
String strType = type.isPresent() ? type.get().getName() : "";
71-
String relativeFilePath = FileUtil.shortenFileName(foundFile, directories).toString();
71+
String relativeFilePath = FileUtil.relativize(foundFile, directories).toString();
7272
LinkedFile linkedFile = new LinkedFile("", relativeFilePath, strType);
7373
linkedFiles.add(linkedFile);
7474
}

Diff for: src/main/java/org/jabref/gui/externalfiles/AutoSetLinks.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public static Runnable autoSetLinks(final List<BibEntry> entries, final NamedCom
8989

9090
Runnable r = () -> {
9191
boolean foundAny = false;
92-
AutoSetFileLinksUtil util = new AutoSetFileLinksUtil(databaseContext, Globals.prefs.getFileDirectoryPreferences(), Globals.prefs.getAutoLinkPreferences(), ExternalFileTypes.getInstance());
92+
AutoSetFileLinksUtil util = new AutoSetFileLinksUtil(databaseContext, Globals.prefs.getFilePreferences(), Globals.prefs.getAutoLinkPreferences(), ExternalFileTypes.getInstance());
9393

9494
for (BibEntry entry : entries) {
9595

Diff for: src/main/java/org/jabref/gui/externalfiles/DownloadExternalFile.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ public void download(URL url, String mimeType, final DownloadCallback callback)
202202
fileType = ExternalFileTypes.getInstance().getExternalFileTypeByExt(suffix);
203203
}
204204
String suggestedName = getSuggestedFileName(suffix);
205-
List<String> fDirectory = databaseContext.getFileDirectories(Globals.prefs.getFileDirectoryPreferences());
205+
List<String> fDirectory = databaseContext.getFileDirectories(Globals.prefs.getFilePreferences());
206206
String directory;
207207
if (fDirectory.isEmpty()) {
208208
directory = null;

Diff for: src/main/java/org/jabref/gui/externalfiles/DroppedFileHandler.java

+13-13
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,9 @@ public void handleDroppedfile(String fileName, ExternalFileType fileType, BibEnt
147147
String destFilename;
148148

149149
if (linkInPlace.isSelected()) {
150-
destFilename = FileUtil.shortenFileName(Paths.get(fileName),
151-
panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFileDirectoryPreferences()))
152-
.toString();
150+
destFilename = FileUtil.relativize(Paths.get(fileName),
151+
panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences()))
152+
.toString();
153153
} else {
154154
destFilename = renameCheckBox.isSelected() ? renameToTextBox.getText() : Paths.get(fileName).toString();
155155
if (copyRadioButton.isSelected()) {
@@ -199,9 +199,9 @@ public void linkPdfToEntry(String fileName, BibEntry entry) {
199199
NamedCompound edits = new NamedCompound(Localization.lang("Drop %0", fileType.getExtension()));
200200

201201
if (linkInPlace.isSelected()) {
202-
destFilename = FileUtil.shortenFileName(Paths.get(fileName),
203-
panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFileDirectoryPreferences()))
204-
.toString();
202+
destFilename = FileUtil.relativize(Paths.get(fileName),
203+
panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences()))
204+
.toString();
205205
} else {
206206
destFilename = renameCheckBox.isSelected() ? renameToTextBox.getText() : new File(fileName).getName();
207207
if (copyRadioButton.isSelected()) {
@@ -284,9 +284,9 @@ private boolean tryXmpImport(String fileName, ExternalFileType fileType, NamedCo
284284
String destFilename;
285285

286286
if (linkInPlace.isSelected()) {
287-
destFilename = FileUtil.shortenFileName(Paths.get(fileName),
288-
panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFileDirectoryPreferences()))
289-
.toString();
287+
destFilename = FileUtil.relativize(Paths.get(fileName),
288+
panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences()))
289+
.toString();
290290
} else {
291291
if (renameCheckBox.isSelected() || (single == null)) {
292292
destFilename = fileName;
@@ -325,7 +325,7 @@ private boolean showLinkMoveCopyRenameDialog(String linkFileName, ExternalFileTy
325325
String dialogTitle = Localization.lang("Link to file %0", linkFileName);
326326

327327
Optional<Path> dir = panel.getBibDatabaseContext()
328-
.getFirstExistingFileDir(Globals.prefs.getFileDirectoryPreferences());
328+
.getFirstExistingFileDir(Globals.prefs.getFilePreferences());
329329

330330
if (!dir.isPresent()) {
331331
destDirLabel.setText(Localization.lang("File directory is not set or does not exist!"));
@@ -416,7 +416,7 @@ private void doLink(BibEntry entry, ExternalFileType fileType, String filename,
416416
if (avoidDuplicate) {
417417
// For comparison, find the absolute filename:
418418
List<Path> dirs = panel.getBibDatabaseContext()
419-
.getFileDirectoriesAsPaths(Globals.prefs.getFileDirectoryPreferences());
419+
.getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences());
420420
String absFilename;
421421
if (new File(filename).isAbsolute() || dirs.isEmpty()) {
422422
absFilename = filename;
@@ -475,7 +475,7 @@ private void doLink(BibEntry entry, ExternalFileType fileType, String filename,
475475
*/
476476
private boolean doMove(String fileName, String destFilename, NamedCompound edits) {
477477
Optional<Path> dir = panel.getBibDatabaseContext()
478-
.getFirstExistingFileDir(Globals.prefs.getFileDirectoryPreferences());
478+
.getFirstExistingFileDir(Globals.prefs.getFilePreferences());
479479

480480
if (dir.isPresent()) {
481481
Path destFile = dir.get().resolve(destFilename);
@@ -522,7 +522,7 @@ private boolean doMove(String fileName, String destFilename, NamedCompound edits
522522
private boolean doCopy(String fileName, String toFile, NamedCompound edits) {
523523

524524
List<String> dirs = panel.getBibDatabaseContext()
525-
.getFileDirectories(Globals.prefs.getFileDirectoryPreferences());
525+
.getFileDirectories(Globals.prefs.getFilePreferences());
526526
int found = -1;
527527
for (int i = 0; i < dirs.size(); i++) {
528528
if (new File(dirs.get(i)).exists()) {

0 commit comments

Comments
 (0)