package org.jabref.gui.search; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; import javax.swing.SwingWorker; import org.jabref.gui.BasePanel; import org.jabref.gui.JabRefFrame; import org.jabref.logic.l10n.Localization; import org.jabref.logic.search.SearchQuery; import org.jabref.model.entry.BibEntry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; class GlobalSearchWorker extends SwingWorker<Map<BasePanel, List<BibEntry>>, Void> { private static final Log LOGGER = LogFactory.getLog(GlobalSearchWorker.class); private final JabRefFrame frame; private final SearchQuery searchQuery; private final SearchResultFrame dialog; public GlobalSearchWorker(JabRefFrame frame, SearchQuery query) { this.frame = Objects.requireNonNull(frame); this.searchQuery = Objects.requireNonNull(query); dialog = new SearchResultFrame(frame, Localization.lang("Search results in all libraries for %0", this.searchQuery.localize()), searchQuery, true); frame.getGlobalSearchBar().setSearchResultFrame(dialog); } @Override protected Map<BasePanel, List<BibEntry>> doInBackground() throws Exception { Map<BasePanel, List<BibEntry>> matches = new HashMap<>(); for (BasePanel basePanel : frame.getBasePanelList()) { matches.put(basePanel, basePanel.getDatabase().getEntries().parallelStream() .filter(searchQuery::isMatch) .collect(Collectors.toList())); } return matches; } @Override protected void done() { if (isCancelled()) { return; } try { for (Map.Entry<BasePanel, List<BibEntry>> match : get().entrySet()) { dialog.addEntries(match.getValue(), match.getKey()); } dialog.selectFirstEntry(); dialog.setVisible(true); } catch (InterruptedException | ExecutionException e) { LOGGER.error("something went wrong during the search", e); } } }