Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package org.jabref.gui.importer.actions;

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

import org.jabref.gui.DialogService;
import org.jabref.gui.LibraryTabContainer;
import org.jabref.gui.actions.SimpleCommand;
import org.jabref.gui.util.FileDialogConfiguration;
import org.jabref.logic.importer.ParserResult;
import org.jabref.logic.importer.fileformat.CitaviXmlImporter;
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.preferences.CliPreferences;
import org.jabref.logic.util.BackgroundTask;
import org.jabref.logic.util.StandardFileType;
import org.jabref.logic.util.TaskExecutor;
import org.jabref.logic.util.UpdateField;
import org.jabref.model.util.FileUpdateMonitor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Action to import Citavi XML files into a new library tab.
* This action preserves citation keys from Citavi by temporarily disabling
* the "Generate a new key for imported entries" preference.
*/
public class ImportCitaviAction extends SimpleCommand {
private static final Logger LOGGER = LoggerFactory.getLogger(ImportCitaviAction.class);

private final LibraryTabContainer tabContainer;
private final DialogService dialogService;
private final CliPreferences preferences;
private final FileUpdateMonitor fileUpdateMonitor;
private final TaskExecutor taskExecutor;

public ImportCitaviAction(LibraryTabContainer tabContainer,
CliPreferences preferences,
FileUpdateMonitor fileUpdateMonitor,
TaskExecutor taskExecutor,
DialogService dialogService) {
this.tabContainer = tabContainer;
this.preferences = preferences;
this.fileUpdateMonitor = fileUpdateMonitor;
this.taskExecutor = taskExecutor;
this.dialogService = dialogService;
}

@Override
public void execute() {
FileDialogConfiguration fileDialogConfiguration = new FileDialogConfiguration.Builder()
.addExtensionFilter(StandardFileType.CITAVI)
.withInitialDirectory(preferences.getImporterPreferences().getImportWorkingDirectory())
.build();

List<Path> selectedFiles = dialogService.showFileOpenDialogAndGetMultipleFiles(fileDialogConfiguration);

if (selectedFiles.isEmpty()) {
return;
}

importCitaviFiles(selectedFiles);
}

private void importCitaviFiles(List<Path> files) {
for (Path file : files) {
if (!Files.exists(file)) {
dialogService.showErrorDialogAndWait(Localization.lang("Import from Citavi"),
Localization.lang("File not found") + ": '" + file.getFileName() + "'.");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use File %0 not found. See #14692

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ItsYash1421 Why didn't you follow-up here?

return;
}
}

BackgroundTask<ParserResult> task = BackgroundTask.wrap(() -> doImport(files));

task.onSuccess(parserResult -> {
tabContainer.addTab(parserResult.getDatabaseContext(), true);
dialogService.notify(Localization.lang("%0 entry(s) imported", parserResult.getDatabase().getEntries().size()));
})
.onFailure(ex -> {
LOGGER.error("Error importing from Citavi", ex);
dialogService.notify(Localization.lang("Error importing. See the error log for details."));
})
.executeWith(taskExecutor);

if (!files.isEmpty()) {
preferences.getImporterPreferences().setImportWorkingDirectory(files.getLast().getParent());
}
}

private ParserResult doImport(List<Path> files) throws IOException {
CitaviXmlImporter importer = new CitaviXmlImporter();
ParserResult result = new ParserResult();

for (Path file : files) {
dialogService.notify(Localization.lang("Importing in %0 format", importer.getName()) + "...");
ParserResult fileResult = importer.importDatabase(file);

result.getDatabaseContext().getDatabase().insertEntries(fileResult.getDatabase().getEntries());
}

UpdateField.setAutomaticFields(
result.getDatabase().getEntries(),
preferences.getOwnerPreferences(),
preferences.getTimestampPreferences());

return result;
}
}
6 changes: 5 additions & 1 deletion jabgui/src/main/java/org/jabref/gui/welcome/WelcomeTab.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.jabref.gui.frame.FileHistoryMenu;
import org.jabref.gui.icon.IconTheme;
import org.jabref.gui.importer.NewDatabaseAction;
import org.jabref.gui.importer.actions.ImportCitaviAction;
import org.jabref.gui.importer.actions.OpenDatabaseAction;
import org.jabref.gui.preferences.GuiPreferences;
import org.jabref.gui.undo.CountingUndoManager;
Expand Down Expand Up @@ -248,9 +249,12 @@ private VBox createWelcomeStartBox() {
Hyperlink openExampleLibraryLink = createActionLink(Localization.lang("New example library"),
this::openExampleLibrary);

Hyperlink importCitaviLink = createActionLink(Localization.lang("Import from Citavi..."),
() -> new ImportCitaviAction(tabContainer, preferences, fileUpdateMonitor, taskExecutor, dialogService).execute());

VBox container = new VBox();
container.getStyleClass().add("welcome-links-content");
container.getChildren().addAll(newLibraryLink, openExampleLibraryLink, openLibraryLink);
container.getChildren().addAll(newLibraryLink, openExampleLibraryLink, openLibraryLink, importCitaviLink);

return createVBoxContainer(header, container);
}
Expand Down
4 changes: 4 additions & 0 deletions jablib/src/main/resources/l10n/JabRef_en.properties
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,10 @@ Import=Import

Import\ entries=Import entries

Import\ from\ Citavi=Import from Citavi

Import\ from\ Citavi...=Import from Citavi...

Import\ name=Import name

Import\ preferences=Import preferences
Expand Down