1
0
mirror of https://github.com/elisspace/autopsy.git synced 2026-09-06 02:24:30 +00:00

keyword search info improvements

This commit is contained in:
adam-m
2012-10-11 16:57:36 -04:00
parent 7d7b19293b
commit 8a431e477b
3 changed files with 114 additions and 112 deletions

View File

@@ -21,18 +21,21 @@ package org.sleuthkit.autopsy.keywordsearch;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.logging.Level;
import org.apache.solr.client.solrj.SolrServerException;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.ingest.IngestManager;
import org.sleuthkit.autopsy.keywordsearch.KeywordSearch.QueryType;
import org.sleuthkit.autopsy.keywordsearch.KeywordSearchQueryManager.Presentation;
/**
*
* @author dfickling
* Common functionality among keyword search performers / widgets
*/
abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel implements KeywordSearchPerformerInterface{
abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel implements KeywordSearchPerformerInterface {
protected int filesIndexed;
private static final Logger logger = Logger.getLogger(AbstractKeywordSearchPerformer.class.getName());
int filesIndexed;
AbstractKeywordSearchPerformer() {
initListeners();
}
@@ -40,7 +43,6 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
private void initListeners() {
KeywordSearch.changeSupport.addPropertyChangeListener(KeywordSearch.NUM_FILES_CHANGE_EVT,
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
String changed = evt.getPropertyName();
@@ -50,11 +52,17 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
if (changed.equals(KeywordSearch.NUM_FILES_CHANGE_EVT)) {
int newFilesIndexed = ((Integer) newValue).intValue();
filesIndexed = newFilesIndexed;
postFilesIndexedChange();
}
}
});
}
/**
* Hook to run after indexed files number changed
*/
protected abstract void postFilesIndexedChange();
@Override
public abstract boolean isMultiwordQuery();
@@ -63,7 +71,7 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
@Override
public abstract String getQueryText();
@Override
public abstract List<Keyword> getQueryList();
@@ -78,17 +86,17 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
KeywordSearchUtil.displayDialog("Keyword Search Error", "No files are indexed, please index an image before searching", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
return;
}
//check if keyword search module ingest is running (indexing, etc)
if (IngestManager.getDefault().isModuleRunning(KeywordSearchIngestModule.getDefault())) {
if (KeywordSearchUtil.displayConfirmDialog("Keyword Search Ingest in Progress",
if (KeywordSearchUtil.displayConfirmDialog("Keyword Search Ingest in Progress",
"<html>Keyword Search Ingest is currently running.<br />"
+ "Not all files have been indexed and this search might yield incomplete results.<br />"
+ "Do you want to proceed with this search anyway?</html>"
, KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN) == false)
+ "Do you want to proceed with this search anyway?</html>", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN) == false) {
return;
}
}
KeywordSearchQueryManager man = null;
if (isMultiwordQuery()) {
final List<Keyword> keywords = getQueryList();
@@ -107,7 +115,7 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
final String queryText = getQueryText();
if (queryText == null || queryText.trim().equals("")) {
KeywordSearchUtil.displayDialog("Keyword Search Error", "Please enter a keyword to search for", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
return;
return;
}
man = new KeywordSearchQueryManager(getQueryText(), queryType, Presentation.COLLAPSE);
}
@@ -118,5 +126,4 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
KeywordSearchUtil.displayDialog("Keyword Search Error", "Invalid query syntax.", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
}
}
}

View File

@@ -16,8 +16,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.keywordsearch;
import java.awt.Component;
@@ -38,6 +36,7 @@ import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import org.apache.solr.client.solrj.SolrServerException;
import org.openide.util.actions.SystemAction;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.ingest.IngestManager;
@@ -47,7 +46,7 @@ import org.sleuthkit.autopsy.ingest.IngestManager.IngestModuleEvent;
* Viewer panel widget for keyword lists
*/
class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
private static final Logger logger = Logger.getLogger(KeywordSearchListsViewerPanel.class.getName());
private static KeywordSearchListsViewerPanel instance;
private KeywordSearchListsXML loader;
@@ -56,21 +55,23 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
private ActionListener searchAddListener;
private boolean ingestRunning;
/** Creates new form KeywordSearchListsViewerPanel */
/**
* Creates new form KeywordSearchListsViewerPanel
*/
private KeywordSearchListsViewerPanel() {
listsTableModel = new KeywordListsTableModel();
keywordsTableModel = new KeywordsTableModel();
initComponents();
customizeComponents();
}
static synchronized KeywordSearchListsViewerPanel getDefault() {
if (instance == null) {
instance = new KeywordSearchListsViewerPanel();
}
return instance;
}
private void customizeComponents() {
listsTable.setTableHeader(null);
listsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -96,28 +97,9 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
column.setCellRenderer(new RightCheckBoxRenderer());
}
}
KeywordSearch.changeSupport.addPropertyChangeListener(KeywordSearch.NUM_FILES_CHANGE_EVT,
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
String changed = evt.getPropertyName();
Object oldValue = evt.getOldValue();
Object newValue = evt.getNewValue();
if (changed.equals(KeywordSearch.NUM_FILES_CHANGE_EVT)) {
int newFilesIndexed = ((Integer) newValue).intValue();
if(!ingestRunning){
ingestIndexLabel.setText("Files Indexed: " + newFilesIndexed);
}
}
}
});
loader = KeywordSearchListsXML.getCurrent();
listsTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
ListSelectionModel listSelectionModel = (ListSelectionModel) e.getSource();
@@ -130,58 +112,52 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
}
}
});
final KeywordSearchIngestModule module = KeywordSearchIngestModule.getDefault();
if(IngestManager.getDefault().isModuleRunning(module)) {
if (IngestManager.getDefault().isModuleRunning(module)) {
initIngest(true);
}
else {
} else {
initIngest(false);
}
IngestManager.addPropertyChangeListener(new PropertyChangeListener() {
IngestManager.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
String changed = evt.getPropertyName();
Object oldValue = evt.getOldValue();
if(changed.equals(IngestModuleEvent.COMPLETED.toString() ) &&
((String) oldValue).equals(KeywordSearchIngestModule.MODULE_NAME)) {
if (changed.equals(IngestModuleEvent.COMPLETED.toString())
&& ((String) oldValue).equals(KeywordSearchIngestModule.MODULE_NAME)) {
initIngest(false);
}
else if(changed.equals(IngestModuleEvent.STARTED.toString() ) &&
((String) oldValue).equals(KeywordSearchIngestModule.MODULE_NAME)) {
} else if (changed.equals(IngestModuleEvent.STARTED.toString())
&& ((String) oldValue).equals(KeywordSearchIngestModule.MODULE_NAME)) {
initIngest(true);
}
else if(changed.equals(IngestModuleEvent.STOPPED.toString() ) &&
((String) oldValue).equals(KeywordSearchIngestModule.MODULE_NAME)) {
} else if (changed.equals(IngestModuleEvent.STOPPED.toString())
&& ((String) oldValue).equals(KeywordSearchIngestModule.MODULE_NAME)) {
initIngest(false);
}
}
});
searchAddListener = new ActionListener() {
searchAddListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (ingestRunning) {
module.addKeywordLists(listsTableModel.getSelectedLists());
logger.log(Level.INFO, "Submitted enqueued lists to ingest");
}
else {
} else {
searchAction(e);
}
}
};
searchAddButton.addActionListener(searchAddListener);
}
/**
/**
* Initialize this panel depending on whether ingest is running
* @param running
* case 0: ingest running
* case 1: ingest not running
*
* @param running case 0: ingest running case 1: ingest not running
*/
private void initIngest(boolean running) {
if (running) {
@@ -191,17 +167,31 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
+ "<br />and enqueue them to the ongoing ingest."
+ "<br />The selected lists will be searched next time the file index is rebuilt.</html>");
listsTableModel.resync();
ingestIndexLabel.setText("Files Indexed: " + filesIndexed
+ " (ingest is ongoing)");
} else {
ingestRunning = false;
searchAddButton.setText("Search");
searchAddButton.setToolTipText("Search indexed files for keywords in selected lists");
listsTableModel.resync();
}
updateIngestIndexLabel(running);
}
private void updateIngestIndexLabel(boolean ingestRunning) {
if (ingestRunning) {
ingestIndexLabel.setText("Files Indexed: " + filesIndexed
+ " (ingest is ongoing)");
}
else {
ingestIndexLabel.setText("Files Indexed: " + filesIndexed);
}
}
@Override
protected void postFilesIndexedChange() {
updateIngestIndexLabel(ingestRunning);
}
/**
* Force resync the data view
*/
@@ -209,10 +199,10 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
listsTableModel.resync();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
@@ -293,7 +283,6 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
private void manageListsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_manageListsButtonActionPerformed
SystemAction.get(KeywordSearchConfigurationAction.class).performAction();
}//GEN-LAST:event_manageListsButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel ingestIndexLabel;
private javax.swing.JSplitPane jSplitPane1;
@@ -305,9 +294,8 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
private javax.swing.JButton searchAddButton;
// End of variables declaration//GEN-END:variables
private void searchAction(ActionEvent e) {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
try {
search();
@@ -315,16 +303,16 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
setCursor(null);
}
}
@Override
public List<Keyword> getQueryList() {
List<Keyword> ret = new ArrayList<Keyword>();
for(KeywordSearchList list : getSelectedLists()) {
for (KeywordSearchList list : getSelectedLists()) {
ret.addAll(list.getKeywords());
}
return ret;
}
private List<KeywordSearchList> getSelectedLists() {
return listsTableModel.getSelectedListsL();
}
@@ -343,11 +331,11 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
public String getQueryText() {
throw new UnsupportedOperationException("Not supported for multi-word queries.");
}
void addSearchButtonActionListener(ActionListener al) {
searchAddButton.addActionListener(al);
}
private class KeywordListsTableModel extends AbstractTableModel {
//data
@@ -367,7 +355,7 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
@Override
public String getColumnName(int column) {
String ret = null;
switch(column) {
switch (column) {
case 0:
ret = "Selected";
break;
@@ -405,24 +393,24 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
List<String> locked = KeywordSearchIngestModule.getDefault().getKeywordLists();
return (columnIndex == 0 && (!ingestRunning || !locked.contains((String)getValueAt(rowIndex, 1))));
return (columnIndex == 0 && (!ingestRunning || !locked.contains((String) getValueAt(rowIndex, 1))));
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if(columnIndex == 0){
if (columnIndex == 0) {
ListTableEntry entry = null;
Iterator<ListTableEntry> it = listData.iterator();
for(int i = 0; i <= rowIndex; i++) {
for (int i = 0; i <= rowIndex; i++) {
entry = it.next();
}
if(entry != null) {
if (entry != null) {
entry.selected = (Boolean) aValue;
if(ingestRunning) {
if (ingestRunning) {
//updateUseForIngest(getListAt(rowIndex), (Boolean) aValue);
}
}
}
}
@@ -430,7 +418,6 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
public Class<?> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
List<String> getAllLists() {
List<String> ret = new ArrayList<String>();
@@ -439,24 +426,24 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
}
return ret;
}
KeywordSearchList getListAt(int rowIndex) {
return listsHandle.getList((String)getValueAt(rowIndex, 1));
return listsHandle.getList((String) getValueAt(rowIndex, 1));
}
List<String> getSelectedLists() {
List<String> ret = new ArrayList<String>();
for(ListTableEntry e : listData) {
if(e.selected) {
for (ListTableEntry e : listData) {
if (e.selected) {
ret.add(e.name);
}
}
return ret;
}
List<KeywordSearchList> getSelectedListsL() {
List<KeywordSearchList> ret = new ArrayList<KeywordSearchList>();
for(String s : getSelectedLists()) {
for (String s : getSelectedLists()) {
ret.add(listsHandle.getList(s));
}
return ret;
@@ -488,13 +475,14 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
String name;
Boolean selected;
ListTableEntry(KeywordSearchList list, boolean ingestRunning) {
this.name = list.getName();
if(ingestRunning)
if (ingestRunning) {
this.selected = list.getUseForIngest();
else
} else {
this.selected = false;
}
}
@Override
@@ -503,11 +491,11 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
}
}
}
private class KeywordsTableModel extends AbstractTableModel {
List<KeywordTableEntry> listData = new ArrayList<KeywordTableEntry>();
@Override
public int getRowCount() {
return listData.size();
@@ -521,7 +509,7 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
@Override
public String getColumnName(int column) {
String ret = null;
switch(column) {
switch (column) {
case 0:
ret = "Name";
break;
@@ -564,25 +552,25 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
}
@Override
public Class<?> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
void resync(KeywordSearchList list) {
listData.clear();
for(Keyword k : list.getKeywords()) {
for (Keyword k : list.getKeywords()) {
listData.add(new KeywordTableEntry(k));
}
fireTableDataChanged();
}
void deleteAll() {
listData.clear();
fireTableDataChanged();
}
//single model entry
private class KeywordTableEntry implements Comparable<KeywordTableEntry> {
@@ -600,8 +588,8 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
}
}
}
private class LeftCheckBoxRenderer extends JCheckBox implements TableCellRenderer{
private class LeftCheckBoxRenderer extends JCheckBox implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(
@@ -615,7 +603,7 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
String name = (String) table.getModel().getValueAt(row, 1);
List<String> currentIngest = KeywordSearchIngestModule.getDefault().getKeywordLists();
boolean currentIngestUsed = currentIngest.contains(name);
setEnabled(! currentIngestUsed || !ingestRunning);
setEnabled(!currentIngestUsed || !ingestRunning);
boolean selected = (Boolean) table.getModel().getValueAt(row, 0);
setSelected(selected);
@@ -629,8 +617,8 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
return this;
}
}
private class RightCheckBoxRenderer extends JCheckBox implements TableCellRenderer{
private class RightCheckBoxRenderer extends JCheckBox implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(
@@ -643,10 +631,11 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
Boolean selected = (Boolean) table.getModel().getValueAt(row, 1);
setSelected(selected);
if(isSelected)
if (isSelected) {
setBackground(keywordsTable.getSelectionBackground());
else
} else {
setBackground(keywordsTable.getBackground());
}
setEnabled(false);
return this;

View File

@@ -43,8 +43,7 @@ import org.apache.solr.client.solrj.SolrServerException;
import org.sleuthkit.autopsy.casemodule.Case;
/**
*
* @author dfickling
* Keyword search toolbar which allows to search for single terms or phrases
*/
public class KeywordSearchPanel extends AbstractKeywordSearchPerformer {
@@ -70,6 +69,13 @@ public class KeywordSearchPanel extends AbstractKeywordSearchPerformer {
return instance;
}
@Override
protected void postFilesIndexedChange() {
//nothing to update
}
private void customizeComponents() {
listener = new KeywordPropertyChangeListener();