Merge pull request #5345 from wschaeferB/5657-FileDiscoveryTopComponent

5657 file discovery top component
This commit is contained in:
Richard Cordovano 2019-10-23 12:07:35 -04:00 committed by GitHub
commit b13f68df45
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 234 additions and 70 deletions

View File

@ -1,4 +1,5 @@
CTL_FileDiscoveryTestAction=Test file discovery
DiscoveryTopComponent.name=\ File Discovery
# {0} - Data source name
# {1} - Data source ID
FileSearch.DataSourceGroupKey.datasourceAndID={0}(ID: {1})

View File

@ -209,10 +209,24 @@ final class DiscoveryEvents {
* Construct a new NoResultsEvent.
*/
NoResultsEvent() {
//no arg conustructor
//no arg constructor
}
}
/**
* Event to signal that a search has been cancelled
*/
static final class SearchCancelledEvent {
/**
* Construct a new SearchCancelledEvent.
*/
SearchCancelledEvent() {
//no arg constructor
}
}
/**
* Event to signal that a group has been selected.
*/

View File

@ -1,16 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.4" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
<Form version="1.4" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<Properties>
<Property name="defaultCloseOperation" type="int" value="2"/>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[1100, 700]"/>
</Property>
</Properties>
<SyntheticProperties>
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
</SyntheticProperties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>

View File

@ -18,26 +18,40 @@
*/
package org.sleuthkit.autopsy.filequery;
import javax.swing.JFrame;
import java.awt.Cursor;
import java.util.logging.Level;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.openide.explorer.ExplorerManager;
import org.openide.nodes.Node;
import org.openide.util.NbBundle;
import org.openide.windows.Mode;
import org.openide.windows.RetainLocation;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
import org.sleuthkit.autopsy.corecomponents.DataContentPanel;
import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
import org.sleuthkit.autopsy.datamodel.FileNode;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.SleuthkitCase;
/**
* Create a dialog for displaying the file discovery tool
*/
class FileDiscoveryDialog extends javax.swing.JDialog {
@TopComponent.Description(preferredID = "DiscoveryTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
@TopComponent.Registration(mode = "discovery", openAtStartup = false)
@RetainLocation("discovery")
@NbBundle.Messages("DiscoveryTopComponent.name= File Discovery")
final class DiscoveryTopComponent extends TopComponent {
private static final long serialVersionUID = 1L;
private static final String PREFERRED_ID = "DiscoveryTopComponent"; // NON-NLS
private final static Logger logger = Logger.getLogger(DiscoveryTopComponent.class.getName());
private final FileSearchPanel fileSearchPanel;
private final GroupListPanel groupListPanel;
private final DataContentPanel dataContentPanel;
@ -47,16 +61,24 @@ class FileDiscoveryDialog extends javax.swing.JDialog {
/**
* Creates new form FileDiscoveryDialog
*/
FileDiscoveryDialog(java.awt.Frame parent, boolean modal, SleuthkitCase caseDb, EamDb centralRepoDb) {
super((JFrame) WindowManager.getDefault().getMainWindow(), Bundle.FileSearchPanel_dialogTitle_text(), modal);
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
DiscoveryTopComponent() {
initComponents();
// Load the central repository database.
EamDb centralRepoDb = null;
if (EamDb.isEnabled()) {
try {
centralRepoDb = EamDb.getInstance();
} catch (EamDbException ex) {
logger.log(Level.SEVERE, "Error loading central repository database, no central repository options will be available for File Discovery", ex);
}
}
setName(Bundle.DiscoveryTopComponent_name());
explorerManager = new ExplorerManager();
fileSearchPanel = new FileSearchPanel(caseDb, centralRepoDb);
fileSearchPanel = new FileSearchPanel(Case.getCurrentCase().getSleuthkitCase(), centralRepoDb);
dataContentPanel = DataContentPanel.createInstance();
resultsPanel = new ResultsPanel(explorerManager, centralRepoDb);
DiscoveryEvents.getDiscoveryEventBus().register(resultsPanel);
groupListPanel = new GroupListPanel();
DiscoveryEvents.getDiscoveryEventBus().register(groupListPanel);
leftSplitPane.setLeftComponent(fileSearchPanel);
leftSplitPane.setRightComponent(groupListPanel);
rightSplitPane.setTopComponent(resultsPanel);
@ -101,20 +123,49 @@ class FileDiscoveryDialog extends javax.swing.JDialog {
}
/**
* Show the dialog
* Open the instance of the DiscoveryTopComponent which exists.
*/
void display() {
this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
setVisible(true);
static void openTopComponent() {
final DiscoveryTopComponent tc = (DiscoveryTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID);
if (tc != null) {
WindowManager.getDefault().isTopComponentFloating(tc);
if (tc.isOpened() == false) {
Mode mode = WindowManager.getDefault().findMode("discovery"); // NON-NLS
if (mode != null) {
mode.dockInto(tc);
}
tc.open();
}
tc.toFront();
}
}
/**
* Sets the cursor for the instance of the DiscoveryTopComponent which
* exists.
*
* @param cursor The Cursor which you want to have displayed.
*/
static void changeCursor(Cursor cursor) {
WindowManager.getDefault().findTopComponent(PREFERRED_ID).setCursor(cursor);
}
@Override
public void dispose() {
public void componentOpened() {
super.componentOpened();
WindowManager.getDefault().setTopComponentFloating(this, true);
DiscoveryEvents.getDiscoveryEventBus().register(resultsPanel);
DiscoveryEvents.getDiscoveryEventBus().register(groupListPanel);
DiscoveryEvents.getDiscoveryEventBus().register(fileSearchPanel);
}
@Override
protected void componentClosed() {
fileSearchPanel.cancelSearch();
FileSearch.clearCache();
DiscoveryEvents.getDiscoveryEventBus().unregister(fileSearchPanel);
DiscoveryEvents.getDiscoveryEventBus().unregister(groupListPanel);
DiscoveryEvents.getDiscoveryEventBus().unregister(resultsPanel);
super.dispose();
super.componentClosed();
}
/**
@ -130,8 +181,8 @@ class FileDiscoveryDialog extends javax.swing.JDialog {
leftSplitPane = new javax.swing.JSplitPane();
rightSplitPane = new javax.swing.JSplitPane();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setPreferredSize(new java.awt.Dimension(1100, 700));
setLayout(new java.awt.BorderLayout());
mainSplitPane.setDividerLocation(550);
mainSplitPane.setResizeWeight(0.2);
@ -147,9 +198,7 @@ class FileDiscoveryDialog extends javax.swing.JDialog {
rightSplitPane.setResizeWeight(0.5);
mainSplitPane.setRightComponent(rightSplitPane);
getContentPane().add(mainSplitPane, java.awt.BorderLayout.CENTER);
pack();
add(mainSplitPane, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents

View File

@ -18,18 +18,13 @@
*/
package org.sleuthkit.autopsy.filequery;
import java.util.logging.Level;
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionRegistration;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.actions.CallableSystemAction;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.coreutils.Logger;
/**
* Class to test the file search API. Allows the user to run searches and see
@ -41,7 +36,6 @@ import org.sleuthkit.autopsy.coreutils.Logger;
@NbBundle.Messages({"CTL_FileDiscoveryTestAction=Test file discovery"})
public final class FileDiscoveryTestAction extends CallableSystemAction {
private final static Logger logger = Logger.getLogger(FileDiscoveryTestAction.class.getName());
private static final String DISPLAY_NAME = "Test file discovery";
private static final long serialVersionUID = 1L;
@ -53,22 +47,7 @@ public final class FileDiscoveryTestAction extends CallableSystemAction {
@Override
@SuppressWarnings("fallthrough")
public void performAction() {
// Load the central repository database.
EamDb crDb = null;
if (EamDb.isEnabled()) {
try {
crDb = EamDb.getInstance();
} catch (EamDbException ex) {
logger.log(Level.SEVERE, "Error loading central repository database", ex);
return;
}
}
//modal set to true currently to prevent multiple dialogs being opened because messaging uses a shared eventbus
FileDiscoveryDialog dialog = new FileDiscoveryDialog(WindowManager.getDefault().getMainWindow(), true, Case.getCurrentCase().getSleuthkitCase(), crDb);
// Display the dialog
dialog.display();
DiscoveryTopComponent.openTopComponent();
}
@Override

View File

@ -828,6 +828,7 @@
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/filequery/Bundle.properties" key="FileSearchPanel.cancelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonActionPerformed"/>

View File

@ -18,6 +18,8 @@
*/
package org.sleuthkit.autopsy.filequery;
import com.google.common.eventbus.Subscribe;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
@ -32,6 +34,7 @@ import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JList;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.openide.util.NbBundle;
@ -215,6 +218,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
addListeners(keywordCheckbox, keywordList);
}
/**
* Initialize the hash filter.
*/
private void setUpHashFilter() {
int count = 0;
try {
@ -234,6 +240,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
addListeners(hashSetCheckbox, hashSetList);
}
/**
* Initialize the interesting items filter.
*/
private void setUpInterestingItemsFilter() {
int count = 0;
try {
@ -253,6 +262,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
addListeners(interestingItemsCheckbox, interestingItemsList);
}
/**
* Initialize the tags filter.
*/
private void setUpTagsFilter() {
int count = 0;
try {
@ -329,6 +341,18 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
addListeners(scoreCheckbox, scoreList);
}
/**
* Get the names of the sets which exist in the case database for the
* specified artifact and attribute types.
*
* @param artifactType The artifact type to get the list of sets for.
* @param setNameAttribute The attribute type which contains the set names.
*
* @return A list of set names which exist in the case for the specified
* artifact and attribute types.
*
* @throws TskCoreException
*/
private List<String> getSetNames(BlackboardArtifact.ARTIFACT_TYPE artifactType, BlackboardAttribute.ATTRIBUTE_TYPE setNameAttribute) throws TskCoreException {
List<BlackboardArtifact> arts = caseDb.getBlackboardArtifacts(artifactType);
List<String> setNames = new ArrayList<>();
@ -1116,6 +1140,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
errorLabel.setForeground(new java.awt.Color(255, 0, 0));
org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.cancelButton.text")); // NOI18N
cancelButton.setEnabled(false);
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
@ -1169,7 +1194,8 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
}// </editor-fold>//GEN-END:initComponents
private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed
searchButton.setEnabled(false);
enableSearch(false);
FileType searchType = fileTypeComboBox.getItemAt(fileTypeComboBox.getSelectedIndex());
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchStartedEvent(searchType));
// For testing, allow the user to run different searches in loop
@ -1183,10 +1209,92 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
// Get the file sorting method
FileSorter.SortingMethod fileSort = getFileSortingMethod();
searchWorker = new SearchWorker(centralRepoDb, searchButton, filters, groupingAttr, groupSortAlgorithm, fileSort);
searchWorker = new SearchWorker(centralRepoDb, filters, groupingAttr, groupSortAlgorithm, fileSort);
searchWorker.execute();
}//GEN-LAST:event_searchButtonActionPerformed
/**
* Set the enabled status of the search controls.
*
* @param enabled Boolean which indicates if the search should be enabled.
* True if the search button and controls should be enabled,
* false otherwise.
*/
private void enableSearch(boolean enabled) {
if (enabled) {
DiscoveryTopComponent.changeCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} else {
DiscoveryTopComponent.changeCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
searchButton.setEnabled(enabled);
cancelButton.setEnabled(!enabled);
fileTypeComboBox.setEnabled(enabled);
orderByCombobox.setEnabled(enabled);
groupByCombobox.setEnabled(enabled);
attributeRadioButton.setEnabled(enabled);
groupSizeRadioButton.setEnabled(enabled);
sizeCheckbox.setEnabled(enabled);
sizeScrollPane.setEnabled(enabled && sizeCheckbox.isSelected());
sizeList.setEnabled(enabled && sizeCheckbox.isSelected());
dataSourceCheckbox.setEnabled(enabled);
dataSourceList.setEnabled(enabled && dataSourceCheckbox.isSelected());
dataSourceScrollPane.setEnabled(enabled && dataSourceCheckbox.isSelected());
crFrequencyCheckbox.setEnabled(enabled);
crFrequencyScrollPane.setEnabled(enabled && crFrequencyCheckbox.isSelected());
crFrequencyList.setEnabled(enabled && crFrequencyCheckbox.isSelected());
keywordCheckbox.setEnabled(enabled);
keywordList.setEnabled(enabled && keywordCheckbox.isSelected());
keywordScrollPane.setEnabled(enabled && keywordCheckbox.isSelected());
hashSetCheckbox.setEnabled(enabled);
hashSetScrollPane.setEnabled(enabled && hashSetCheckbox.isSelected());
hashSetList.setEnabled(enabled && hashSetCheckbox.isSelected());
objectsCheckbox.setEnabled(enabled);
objectsScrollPane.setEnabled(enabled && objectsCheckbox.isSelected());
objectsList.setEnabled(enabled && objectsCheckbox.isSelected());
tagsCheckbox.setEnabled(enabled);
tagsScrollPane.setEnabled(enabled && tagsCheckbox.isSelected());
tagsList.setEnabled(enabled && tagsCheckbox.isSelected());
interestingItemsCheckbox.setEnabled(enabled);
interestingItemsScrollPane.setEnabled(enabled && interestingItemsCheckbox.isSelected());
interestingItemsList.setEnabled(enabled && interestingItemsCheckbox.isSelected());
scoreCheckbox.setEnabled(enabled);
scoreScrollPane.setEnabled(enabled && scoreCheckbox.isSelected());
scoreList.setEnabled(enabled && scoreCheckbox.isSelected());
exifCheckbox.setEnabled(enabled);
notableCheckbox.setEnabled(enabled);
parentCheckbox.setEnabled(enabled);
parentScrollPane.setEnabled(enabled && parentCheckbox.isSelected());
parentList.setEnabled(enabled && parentCheckbox.isSelected());
parentTextField.setEnabled(enabled && parentCheckbox.isSelected());
addButton.setEnabled(enabled && parentCheckbox.isSelected());
deleteButton.setEnabled(enabled && parentCheckbox.isSelected() && !parentListModel.isEmpty());
fullRadioButton.setEnabled(enabled && parentCheckbox.isSelected());
substringRadioButton.setEnabled(enabled && parentCheckbox.isSelected());
}
/**
* Update the user interface when a search has been cancelled.
*
* @param searchCancelledEvent The SearchCancelledEvent which was received.
*/
@Subscribe
void handleSearchCancelledEvent(DiscoveryEvents.SearchCancelledEvent searchCancelledEvent) {
SwingUtilities.invokeLater(() -> {
enableSearch(true);
});
}
/**
* Update the user interface when a search has been successfully completed.
*
* @param searchCompleteEvent The SearchCompleteEvent which was received.
*/
@Subscribe
void handleSearchCompleteEvent(DiscoveryEvents.SearchCompleteEvent searchCompleteEvent) {
SwingUtilities.invokeLater(() -> {
enableSearch(true);
});
}
private void parentCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_parentCheckboxActionPerformed
parentList.setEnabled(parentCheckbox.isSelected());
@ -1194,7 +1302,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
substringRadioButton.setEnabled(parentCheckbox.isSelected());
parentTextField.setEnabled(parentCheckbox.isSelected());
addButton.setEnabled(parentCheckbox.isSelected());
deleteButton.setEnabled(parentCheckbox.isSelected());
deleteButton.setEnabled(parentCheckbox.isSelected() && !parentListModel.isEmpty());
}//GEN-LAST:event_parentCheckboxActionPerformed
private void keywordCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_keywordCheckboxActionPerformed
@ -1222,6 +1330,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
}
}//GEN-LAST:event_addButtonActionPerformed
/**
* Cancel the current search.
*/
void cancelSearch() {
if (searchWorker != null) {
searchWorker.cancel(true);
@ -1230,7 +1341,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed
int index = parentList.getSelectedIndex();
if (index >= 0) {
parentListModel.remove(index);
}
validateFields();
}//GEN-LAST:event_deleteButtonActionPerformed

View File

@ -19,6 +19,7 @@
package org.sleuthkit.autopsy.filequery;
import java.util.List;
import java.util.ArrayList;
import java.util.logging.Level;
import javax.swing.SwingWorker;
import org.sleuthkit.autopsy.casemodule.Case;
@ -41,6 +42,7 @@ final class PageWorker extends SwingWorker<Void, Void> {
private final int pageSize;
private final FileSearchData.FileType resultType;
private final EamDb centralRepo;
private final List<ResultFile> results = new ArrayList<>();
/**
* Construct a new PageWorker.
@ -77,16 +79,24 @@ final class PageWorker extends SwingWorker<Void, Void> {
try {
// Run the search
List<ResultFile> results = FileSearch.getFilesInGroup(searchfilters,
results.addAll(FileSearch.getFilesInGroup(searchfilters,
groupingAttribute,
groupSort,
fileSortMethod, groupKey, startingEntry, pageSize,
Case.getCurrentCase().getSleuthkitCase(), centralRepo);
int currentPage = startingEntry / pageSize; //integer division should round down to get page number correctly
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.PageRetrievedEvent(resultType, currentPage, results));
Case.getCurrentCase().getSleuthkitCase(), centralRepo));
} catch (FileSearchException ex) {
logger.log(Level.SEVERE, "Error running file search test", ex);
cancel(true);
}
return null;
}
@Override
protected void done() {
if (!isCancelled()) {
int currentPage = startingEntry / pageSize; //integer division should round down to get page number correctly
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.PageRetrievedEvent(resultType, currentPage, results));
}
}
}

View File

@ -249,8 +249,14 @@ public class ResultsPanel extends javax.swing.JPanel {
});
}
/**
* Handle and respond to NoResultsEvent, updating the panel to reflect that
* there were no results.
*
* @param noResultsEvent the NoResultsEvent received.
*/
@Subscribe
void handleNoResultsEvent(DiscoveryEvents.NoResultsEvent noResultsEven) {
void handleNoResultsEvent(DiscoveryEvents.NoResultsEvent noResultsEvent) {
SwingUtilities.invokeLater(() -> {
groupSize = 0;
currentPage = 0;

View File

@ -19,7 +19,6 @@
package org.sleuthkit.autopsy.filequery;
import java.util.LinkedHashMap;
import javax.swing.JButton;
import javax.swing.SwingWorker;
import java.util.List;
import java.util.logging.Level;
@ -34,27 +33,24 @@ import org.sleuthkit.autopsy.filequery.FileSearch.GroupKey;
final class SearchWorker extends SwingWorker<Void, Void> {
private final static Logger logger = Logger.getLogger(SearchWorker.class.getName());
private final JButton searchButtonToEnable;
private final List<FileSearchFiltering.FileFilter> filters;
private final FileSearch.AttributeType groupingAttr;
private final FileSorter.SortingMethod fileSort;
private final FileGroup.GroupSortingAlgorithm groupSortAlgorithm;
private final EamDb centralRepoDb;
private final LinkedHashMap<GroupKey, Integer> results = new LinkedHashMap<>();
/**
* Create a SwingWorker which performs a search
*
* @param centralRepo the central repository being used for the search
* @param searchButton the search button to renable when the search is
* complete
* @param searchfilters the FileFilters to use for the search
* @param groupingAttribute the AttributeType to group by
* @param groupSort the Algorithm to sort groups by
* @param fileSortMethod the SortingMethod to use for files
*/
SearchWorker(EamDb centralRepo, JButton searchButton, List<FileSearchFiltering.FileFilter> searchfilters, FileSearch.AttributeType groupingAttribute, FileGroup.GroupSortingAlgorithm groupSort, FileSorter.SortingMethod fileSortMethod) {
SearchWorker(EamDb centralRepo, List<FileSearchFiltering.FileFilter> searchfilters, FileSearch.AttributeType groupingAttribute, FileGroup.GroupSortingAlgorithm groupSort, FileSorter.SortingMethod fileSortMethod) {
centralRepoDb = centralRepo;
searchButtonToEnable = searchButton;
filters = searchfilters;
groupingAttr = groupingAttribute;
groupSortAlgorithm = groupSort;
@ -63,26 +59,26 @@ final class SearchWorker extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() throws Exception {
try {
// Run the search
LinkedHashMap<GroupKey, Integer> results = FileSearch.getGroupSizes(filters,
results.putAll(FileSearch.getGroupSizes(filters,
groupingAttr,
groupSortAlgorithm,
fileSort,
Case.getCurrentCase().getSleuthkitCase(), centralRepoDb);
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCompleteEvent(results, filters, groupingAttr, groupSortAlgorithm, fileSort));
Case.getCurrentCase().getSleuthkitCase(), centralRepoDb));
} catch (FileSearchException ex) {
logger.log(Level.SEVERE, "Error running file search test", ex);
cancel(true);
}
return null;
}
@Override
protected void done() {
//If a search button was provided re-enable it
if (searchButtonToEnable != null) {
searchButtonToEnable.setEnabled(true);
if (isCancelled()) {
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCancelledEvent());
} else {
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCompleteEvent(results, filters, groupingAttr, groupSortAlgorithm, fileSort));
}
}
}