mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-17 18:17:43 +00:00
Merge pull request #5345 from wschaeferB/5657-FileDiscoveryTopComponent
5657 file discovery top component
This commit is contained in:
commit
b13f68df45
@ -1,4 +1,5 @@
|
|||||||
CTL_FileDiscoveryTestAction=Test file discovery
|
CTL_FileDiscoveryTestAction=Test file discovery
|
||||||
|
DiscoveryTopComponent.name=\ File Discovery
|
||||||
# {0} - Data source name
|
# {0} - Data source name
|
||||||
# {1} - Data source ID
|
# {1} - Data source ID
|
||||||
FileSearch.DataSourceGroupKey.datasourceAndID={0}(ID: {1})
|
FileSearch.DataSourceGroupKey.datasourceAndID={0}(ID: {1})
|
||||||
|
@ -209,10 +209,24 @@ final class DiscoveryEvents {
|
|||||||
* Construct a new NoResultsEvent.
|
* Construct a new NoResultsEvent.
|
||||||
*/
|
*/
|
||||||
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.
|
* Event to signal that a group has been selected.
|
||||||
*/
|
*/
|
||||||
|
@ -1,16 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?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>
|
<Properties>
|
||||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
|
||||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
<Dimension value="[1100, 700]"/>
|
<Dimension value="[1100, 700]"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<SyntheticProperties>
|
|
||||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
|
||||||
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
|
||||||
</SyntheticProperties>
|
|
||||||
<AuxValues>
|
<AuxValues>
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
@ -18,26 +18,40 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.filequery;
|
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.SwingUtilities;
|
||||||
import javax.swing.event.ListSelectionEvent;
|
import javax.swing.event.ListSelectionEvent;
|
||||||
import javax.swing.event.ListSelectionListener;
|
import javax.swing.event.ListSelectionListener;
|
||||||
import org.openide.explorer.ExplorerManager;
|
import org.openide.explorer.ExplorerManager;
|
||||||
import org.openide.nodes.Node;
|
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.openide.windows.WindowManager;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
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.DataContentPanel;
|
||||||
import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
|
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.autopsy.datamodel.FileNode;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a dialog for displaying the file discovery tool
|
* 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 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 FileSearchPanel fileSearchPanel;
|
||||||
private final GroupListPanel groupListPanel;
|
private final GroupListPanel groupListPanel;
|
||||||
private final DataContentPanel dataContentPanel;
|
private final DataContentPanel dataContentPanel;
|
||||||
@ -47,16 +61,24 @@ class FileDiscoveryDialog extends javax.swing.JDialog {
|
|||||||
/**
|
/**
|
||||||
* Creates new form FileDiscoveryDialog
|
* Creates new form FileDiscoveryDialog
|
||||||
*/
|
*/
|
||||||
FileDiscoveryDialog(java.awt.Frame parent, boolean modal, SleuthkitCase caseDb, EamDb centralRepoDb) {
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
super((JFrame) WindowManager.getDefault().getMainWindow(), Bundle.FileSearchPanel_dialogTitle_text(), modal);
|
DiscoveryTopComponent() {
|
||||||
initComponents();
|
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();
|
explorerManager = new ExplorerManager();
|
||||||
fileSearchPanel = new FileSearchPanel(caseDb, centralRepoDb);
|
fileSearchPanel = new FileSearchPanel(Case.getCurrentCase().getSleuthkitCase(), centralRepoDb);
|
||||||
dataContentPanel = DataContentPanel.createInstance();
|
dataContentPanel = DataContentPanel.createInstance();
|
||||||
resultsPanel = new ResultsPanel(explorerManager, centralRepoDb);
|
resultsPanel = new ResultsPanel(explorerManager, centralRepoDb);
|
||||||
DiscoveryEvents.getDiscoveryEventBus().register(resultsPanel);
|
|
||||||
groupListPanel = new GroupListPanel();
|
groupListPanel = new GroupListPanel();
|
||||||
DiscoveryEvents.getDiscoveryEventBus().register(groupListPanel);
|
|
||||||
leftSplitPane.setLeftComponent(fileSearchPanel);
|
leftSplitPane.setLeftComponent(fileSearchPanel);
|
||||||
leftSplitPane.setRightComponent(groupListPanel);
|
leftSplitPane.setRightComponent(groupListPanel);
|
||||||
rightSplitPane.setTopComponent(resultsPanel);
|
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() {
|
static void openTopComponent() {
|
||||||
this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
|
final DiscoveryTopComponent tc = (DiscoveryTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID);
|
||||||
setVisible(true);
|
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
|
@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();
|
fileSearchPanel.cancelSearch();
|
||||||
FileSearch.clearCache();
|
DiscoveryEvents.getDiscoveryEventBus().unregister(fileSearchPanel);
|
||||||
DiscoveryEvents.getDiscoveryEventBus().unregister(groupListPanel);
|
DiscoveryEvents.getDiscoveryEventBus().unregister(groupListPanel);
|
||||||
DiscoveryEvents.getDiscoveryEventBus().unregister(resultsPanel);
|
DiscoveryEvents.getDiscoveryEventBus().unregister(resultsPanel);
|
||||||
super.dispose();
|
super.componentClosed();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -130,8 +181,8 @@ class FileDiscoveryDialog extends javax.swing.JDialog {
|
|||||||
leftSplitPane = new javax.swing.JSplitPane();
|
leftSplitPane = new javax.swing.JSplitPane();
|
||||||
rightSplitPane = new javax.swing.JSplitPane();
|
rightSplitPane = new javax.swing.JSplitPane();
|
||||||
|
|
||||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
|
||||||
setPreferredSize(new java.awt.Dimension(1100, 700));
|
setPreferredSize(new java.awt.Dimension(1100, 700));
|
||||||
|
setLayout(new java.awt.BorderLayout());
|
||||||
|
|
||||||
mainSplitPane.setDividerLocation(550);
|
mainSplitPane.setDividerLocation(550);
|
||||||
mainSplitPane.setResizeWeight(0.2);
|
mainSplitPane.setResizeWeight(0.2);
|
||||||
@ -147,9 +198,7 @@ class FileDiscoveryDialog extends javax.swing.JDialog {
|
|||||||
rightSplitPane.setResizeWeight(0.5);
|
rightSplitPane.setResizeWeight(0.5);
|
||||||
mainSplitPane.setRightComponent(rightSplitPane);
|
mainSplitPane.setRightComponent(rightSplitPane);
|
||||||
|
|
||||||
getContentPane().add(mainSplitPane, java.awt.BorderLayout.CENTER);
|
add(mainSplitPane, java.awt.BorderLayout.CENTER);
|
||||||
|
|
||||||
pack();
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
|
@ -18,18 +18,13 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.filequery;
|
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.ActionID;
|
||||||
import org.openide.awt.ActionReference;
|
import org.openide.awt.ActionReference;
|
||||||
import org.openide.awt.ActionRegistration;
|
import org.openide.awt.ActionRegistration;
|
||||||
import org.openide.util.HelpCtx;
|
import org.openide.util.HelpCtx;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.util.actions.CallableSystemAction;
|
import org.openide.util.actions.CallableSystemAction;
|
||||||
import org.openide.windows.WindowManager;
|
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
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
|
* 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"})
|
@NbBundle.Messages({"CTL_FileDiscoveryTestAction=Test file discovery"})
|
||||||
public final class FileDiscoveryTestAction extends CallableSystemAction {
|
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 String DISPLAY_NAME = "Test file discovery";
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@ -53,22 +47,7 @@ public final class FileDiscoveryTestAction extends CallableSystemAction {
|
|||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("fallthrough")
|
@SuppressWarnings("fallthrough")
|
||||||
public void performAction() {
|
public void performAction() {
|
||||||
|
DiscoveryTopComponent.openTopComponent();
|
||||||
// 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();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -828,6 +828,7 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<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, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/filequery/Bundle.properties" key="FileSearchPanel.cancelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonActionPerformed"/>
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.filequery;
|
package org.sleuthkit.autopsy.filequery;
|
||||||
|
|
||||||
|
import com.google.common.eventbus.Subscribe;
|
||||||
|
import java.awt.Cursor;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.awt.event.ItemEvent;
|
import java.awt.event.ItemEvent;
|
||||||
@ -32,6 +34,7 @@ import javax.swing.DefaultListCellRenderer;
|
|||||||
import javax.swing.DefaultListModel;
|
import javax.swing.DefaultListModel;
|
||||||
import javax.swing.JCheckBox;
|
import javax.swing.JCheckBox;
|
||||||
import javax.swing.JList;
|
import javax.swing.JList;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.event.ListSelectionEvent;
|
import javax.swing.event.ListSelectionEvent;
|
||||||
import javax.swing.event.ListSelectionListener;
|
import javax.swing.event.ListSelectionListener;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
@ -215,6 +218,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
|
|||||||
addListeners(keywordCheckbox, keywordList);
|
addListeners(keywordCheckbox, keywordList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the hash filter.
|
||||||
|
*/
|
||||||
private void setUpHashFilter() {
|
private void setUpHashFilter() {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
try {
|
try {
|
||||||
@ -234,6 +240,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
|
|||||||
addListeners(hashSetCheckbox, hashSetList);
|
addListeners(hashSetCheckbox, hashSetList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the interesting items filter.
|
||||||
|
*/
|
||||||
private void setUpInterestingItemsFilter() {
|
private void setUpInterestingItemsFilter() {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
try {
|
try {
|
||||||
@ -253,6 +262,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
|
|||||||
addListeners(interestingItemsCheckbox, interestingItemsList);
|
addListeners(interestingItemsCheckbox, interestingItemsList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the tags filter.
|
||||||
|
*/
|
||||||
private void setUpTagsFilter() {
|
private void setUpTagsFilter() {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
try {
|
try {
|
||||||
@ -329,6 +341,18 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
|
|||||||
addListeners(scoreCheckbox, scoreList);
|
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 {
|
private List<String> getSetNames(BlackboardArtifact.ARTIFACT_TYPE artifactType, BlackboardAttribute.ATTRIBUTE_TYPE setNameAttribute) throws TskCoreException {
|
||||||
List<BlackboardArtifact> arts = caseDb.getBlackboardArtifacts(artifactType);
|
List<BlackboardArtifact> arts = caseDb.getBlackboardArtifacts(artifactType);
|
||||||
List<String> setNames = new ArrayList<>();
|
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));
|
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
|
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() {
|
cancelButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
cancelButtonActionPerformed(evt);
|
cancelButtonActionPerformed(evt);
|
||||||
@ -1169,7 +1194,8 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
|
|||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed
|
private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed
|
||||||
searchButton.setEnabled(false);
|
enableSearch(false);
|
||||||
|
|
||||||
FileType searchType = fileTypeComboBox.getItemAt(fileTypeComboBox.getSelectedIndex());
|
FileType searchType = fileTypeComboBox.getItemAt(fileTypeComboBox.getSelectedIndex());
|
||||||
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchStartedEvent(searchType));
|
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchStartedEvent(searchType));
|
||||||
// For testing, allow the user to run different searches in loop
|
// 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
|
// Get the file sorting method
|
||||||
FileSorter.SortingMethod fileSort = getFileSortingMethod();
|
FileSorter.SortingMethod fileSort = getFileSortingMethod();
|
||||||
searchWorker = new SearchWorker(centralRepoDb, searchButton, filters, groupingAttr, groupSortAlgorithm, fileSort);
|
searchWorker = new SearchWorker(centralRepoDb, filters, groupingAttr, groupSortAlgorithm, fileSort);
|
||||||
searchWorker.execute();
|
searchWorker.execute();
|
||||||
}//GEN-LAST:event_searchButtonActionPerformed
|
}//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
|
private void parentCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_parentCheckboxActionPerformed
|
||||||
parentList.setEnabled(parentCheckbox.isSelected());
|
parentList.setEnabled(parentCheckbox.isSelected());
|
||||||
@ -1194,7 +1302,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
|
|||||||
substringRadioButton.setEnabled(parentCheckbox.isSelected());
|
substringRadioButton.setEnabled(parentCheckbox.isSelected());
|
||||||
parentTextField.setEnabled(parentCheckbox.isSelected());
|
parentTextField.setEnabled(parentCheckbox.isSelected());
|
||||||
addButton.setEnabled(parentCheckbox.isSelected());
|
addButton.setEnabled(parentCheckbox.isSelected());
|
||||||
deleteButton.setEnabled(parentCheckbox.isSelected());
|
deleteButton.setEnabled(parentCheckbox.isSelected() && !parentListModel.isEmpty());
|
||||||
}//GEN-LAST:event_parentCheckboxActionPerformed
|
}//GEN-LAST:event_parentCheckboxActionPerformed
|
||||||
|
|
||||||
private void keywordCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_keywordCheckboxActionPerformed
|
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
|
}//GEN-LAST:event_addButtonActionPerformed
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cancel the current search.
|
||||||
|
*/
|
||||||
void cancelSearch() {
|
void cancelSearch() {
|
||||||
if (searchWorker != null) {
|
if (searchWorker != null) {
|
||||||
searchWorker.cancel(true);
|
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
|
private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed
|
||||||
int index = parentList.getSelectedIndex();
|
int index = parentList.getSelectedIndex();
|
||||||
|
if (index >= 0) {
|
||||||
parentListModel.remove(index);
|
parentListModel.remove(index);
|
||||||
|
}
|
||||||
validateFields();
|
validateFields();
|
||||||
}//GEN-LAST:event_deleteButtonActionPerformed
|
}//GEN-LAST:event_deleteButtonActionPerformed
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package org.sleuthkit.autopsy.filequery;
|
package org.sleuthkit.autopsy.filequery;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.SwingWorker;
|
import javax.swing.SwingWorker;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
@ -41,6 +42,7 @@ final class PageWorker extends SwingWorker<Void, Void> {
|
|||||||
private final int pageSize;
|
private final int pageSize;
|
||||||
private final FileSearchData.FileType resultType;
|
private final FileSearchData.FileType resultType;
|
||||||
private final EamDb centralRepo;
|
private final EamDb centralRepo;
|
||||||
|
private final List<ResultFile> results = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new PageWorker.
|
* Construct a new PageWorker.
|
||||||
@ -77,16 +79,24 @@ final class PageWorker extends SwingWorker<Void, Void> {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Run the search
|
// Run the search
|
||||||
List<ResultFile> results = FileSearch.getFilesInGroup(searchfilters,
|
results.addAll(FileSearch.getFilesInGroup(searchfilters,
|
||||||
groupingAttribute,
|
groupingAttribute,
|
||||||
groupSort,
|
groupSort,
|
||||||
fileSortMethod, groupKey, startingEntry, pageSize,
|
fileSortMethod, groupKey, startingEntry, pageSize,
|
||||||
Case.getCurrentCase().getSleuthkitCase(), centralRepo);
|
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));
|
|
||||||
} catch (FileSearchException ex) {
|
} catch (FileSearchException ex) {
|
||||||
logger.log(Level.SEVERE, "Error running file search test", ex);
|
logger.log(Level.SEVERE, "Error running file search test", ex);
|
||||||
|
cancel(true);
|
||||||
}
|
}
|
||||||
return null;
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
@Subscribe
|
||||||
void handleNoResultsEvent(DiscoveryEvents.NoResultsEvent noResultsEven) {
|
void handleNoResultsEvent(DiscoveryEvents.NoResultsEvent noResultsEvent) {
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
groupSize = 0;
|
groupSize = 0;
|
||||||
currentPage = 0;
|
currentPage = 0;
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
package org.sleuthkit.autopsy.filequery;
|
package org.sleuthkit.autopsy.filequery;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import javax.swing.JButton;
|
|
||||||
import javax.swing.SwingWorker;
|
import javax.swing.SwingWorker;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
@ -34,27 +33,24 @@ import org.sleuthkit.autopsy.filequery.FileSearch.GroupKey;
|
|||||||
final class SearchWorker extends SwingWorker<Void, Void> {
|
final class SearchWorker extends SwingWorker<Void, Void> {
|
||||||
|
|
||||||
private final static Logger logger = Logger.getLogger(SearchWorker.class.getName());
|
private final static Logger logger = Logger.getLogger(SearchWorker.class.getName());
|
||||||
private final JButton searchButtonToEnable;
|
|
||||||
private final List<FileSearchFiltering.FileFilter> filters;
|
private final List<FileSearchFiltering.FileFilter> filters;
|
||||||
private final FileSearch.AttributeType groupingAttr;
|
private final FileSearch.AttributeType groupingAttr;
|
||||||
private final FileSorter.SortingMethod fileSort;
|
private final FileSorter.SortingMethod fileSort;
|
||||||
private final FileGroup.GroupSortingAlgorithm groupSortAlgorithm;
|
private final FileGroup.GroupSortingAlgorithm groupSortAlgorithm;
|
||||||
private final EamDb centralRepoDb;
|
private final EamDb centralRepoDb;
|
||||||
|
private final LinkedHashMap<GroupKey, Integer> results = new LinkedHashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a SwingWorker which performs a search
|
* Create a SwingWorker which performs a search
|
||||||
*
|
*
|
||||||
* @param centralRepo the central repository being used for the 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 searchfilters the FileFilters to use for the search
|
||||||
* @param groupingAttribute the AttributeType to group by
|
* @param groupingAttribute the AttributeType to group by
|
||||||
* @param groupSort the Algorithm to sort groups by
|
* @param groupSort the Algorithm to sort groups by
|
||||||
* @param fileSortMethod the SortingMethod to use for files
|
* @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;
|
centralRepoDb = centralRepo;
|
||||||
searchButtonToEnable = searchButton;
|
|
||||||
filters = searchfilters;
|
filters = searchfilters;
|
||||||
groupingAttr = groupingAttribute;
|
groupingAttr = groupingAttribute;
|
||||||
groupSortAlgorithm = groupSort;
|
groupSortAlgorithm = groupSort;
|
||||||
@ -63,26 +59,26 @@ final class SearchWorker extends SwingWorker<Void, Void> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Void doInBackground() throws Exception {
|
protected Void doInBackground() throws Exception {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Run the search
|
// Run the search
|
||||||
LinkedHashMap<GroupKey, Integer> results = FileSearch.getGroupSizes(filters,
|
results.putAll(FileSearch.getGroupSizes(filters,
|
||||||
groupingAttr,
|
groupingAttr,
|
||||||
groupSortAlgorithm,
|
groupSortAlgorithm,
|
||||||
fileSort,
|
fileSort,
|
||||||
Case.getCurrentCase().getSleuthkitCase(), centralRepoDb);
|
Case.getCurrentCase().getSleuthkitCase(), centralRepoDb));
|
||||||
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCompleteEvent(results, filters, groupingAttr, groupSortAlgorithm, fileSort));
|
|
||||||
} catch (FileSearchException ex) {
|
} catch (FileSearchException ex) {
|
||||||
logger.log(Level.SEVERE, "Error running file search test", ex);
|
logger.log(Level.SEVERE, "Error running file search test", ex);
|
||||||
|
cancel(true);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void done() {
|
protected void done() {
|
||||||
//If a search button was provided re-enable it
|
if (isCancelled()) {
|
||||||
if (searchButtonToEnable != null) {
|
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCancelledEvent());
|
||||||
searchButtonToEnable.setEnabled(true);
|
} else {
|
||||||
|
DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCompleteEvent(results, filters, groupingAttr, groupSortAlgorithm, fileSort));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user