package org.jabref.gui.mergeentries;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import javax.swing.SwingWorker;
import org.jabref.gui.BasePanel;
import org.jabref.logic.importer.EntryBasedFetcher;
import org.jabref.logic.importer.FetcherException;
import org.jabref.logic.l10n.Localization;
import org.jabref.model.entry.BibEntry;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class EntryFetchAndMergeWorker extends SwingWorker<Optional<BibEntry>, Void> {
private static final Log LOGGER = LogFactory.getLog(EntryFetchAndMergeWorker.class);
private final BasePanel panel;
private final BibEntry entry;
private final EntryBasedFetcher fetcher;
public EntryFetchAndMergeWorker(BasePanel panel, BibEntry entry, EntryBasedFetcher fetcher) {
this.panel = Objects.requireNonNull(panel);
this.entry = Objects.requireNonNull(entry);
this.fetcher = Objects.requireNonNull(fetcher);
}
@Override
protected Optional<BibEntry> doInBackground() throws Exception {
try {
List<BibEntry> fetchedEntries = fetcher.performSearch(entry);
return fetchedEntries.stream().findFirst();
} catch (FetcherException e) {
LOGGER.error("Info cannot be found", e);
return Optional.empty();
}
}
@Override
protected void done() {
if (isCancelled()) {
return;
}
try {
Optional<BibEntry> fetchedEntry = get();
if (fetchedEntry.isPresent()) {
MergeFetchedEntryDialog dialog = new MergeFetchedEntryDialog(panel, entry, fetchedEntry.get(),
fetcher.getName());
dialog.setVisible(true);
} else {
panel.frame().setStatus(Localization.lang("Could not find any bibliographic information."));
}
} catch (InterruptedException | ExecutionException e) {
LOGGER.error("Error while fetching Entry", e);
}
}
}