Autopsy 4.22.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
DropdownSingleTermSearchPanel.java
Go to the documentation of this file.
1/*
2 * Autopsy Forensic Browser
3 *
4 * Copyright 2011-2018 Basis Technology Corp.
5 * Contact: carrier <at> sleuthkit <dot> org
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19package org.sleuthkit.autopsy.keywordsearch;
20
21import java.awt.EventQueue;
22import java.awt.event.ActionEvent;
23import java.awt.event.ActionListener;
24import java.awt.event.FocusEvent;
25import java.awt.event.FocusListener;
26import java.beans.PropertyChangeEvent;
27import java.beans.PropertyChangeListener;
28import java.util.ArrayList;
29import java.util.HashSet;
30import java.util.List;
31import java.util.Set;
32import java.util.logging.Level;
33import javax.swing.JMenuItem;
34import javax.swing.event.ListSelectionEvent;
35import org.openide.util.NbBundle;
36import org.sleuthkit.autopsy.coreutils.Logger;
37import org.sleuthkit.autopsy.ingest.IngestManager;
38
53@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
54public class DropdownSingleTermSearchPanel extends AdHocSearchPanel {
55
56 private static final long serialVersionUID = 1L;
57 private static final Logger LOGGER = Logger.getLogger(DropdownSingleTermSearchPanel.class.getName());
59 private boolean ingestRunning;
60
61
69 public static synchronized DropdownSingleTermSearchPanel getDefault() {
70 if (null == defaultInstance) {
72 }
73 return defaultInstance;
74 }
75
80 @NbBundle.Messages({"DropdownSingleTermSearchPanel.selected=Ad Hoc Search data source filter is selected"})
84 dataSourceList.setModel(getDataSourceListModel());
85 this.dataSourceList.addListSelectionListener((ListSelectionEvent evt) -> {
86 firePropertyChange(Bundle.DropdownSingleTermSearchPanel_selected(), null, null);
87 });
88 }
89
94 private void customizeComponents() {
95 keywordTextField.addFocusListener(new FocusListener() {
96 @Override
97 public void focusGained(FocusEvent e) {
98 }
99
100 @Override
101 public void focusLost(FocusEvent e) {
102 if (keywordTextField.getText().isEmpty()) {
103 clearSearchBox();
104 }
105 }
106 });
107
108 keywordTextField.setComponentPopupMenu(rightClickMenu);
109 ActionListener actList = (ActionEvent e) -> {
110 JMenuItem jmi = (JMenuItem) e.getSource();
111 if (jmi.equals(cutMenuItem)) {
112 keywordTextField.cut();
113 } else if (jmi.equals(copyMenuItem)) {
114 keywordTextField.copy();
115 } else if (jmi.equals(pasteMenuItem)) {
116 keywordTextField.paste();
117 } else if (jmi.equals(selectAllMenuItem)) {
118 keywordTextField.selectAll();
119 }
120 };
123
124 jSaveSearchResults.setSelected(true);
125
126 IngestManager.getInstance().addIngestJobEventListener(new PropertyChangeListener() {
127 @Override
128 public void propertyChange(PropertyChangeEvent evt) {
129 Object source = evt.getSource();
130 if (source instanceof String && ((String) source).equals("LOCAL")) { //NON-NLS
131 EventQueue.invokeLater(() -> {
134 });
135 }
136 }
137 });
138
139 cutMenuItem.addActionListener(actList);
140 copyMenuItem.addActionListener(actList);
141 pasteMenuItem.addActionListener(actList);
142 selectAllMenuItem.addActionListener(actList);
143 }
144
150 void addSearchButtonActionListener(ActionListener actionListener) {
151 searchButton.addActionListener(actionListener);
152 }
153
158 void clearSearchBox() {
159 keywordTextField.setText("");
160 }
161
162 void setRegexSearchEnabled(boolean enabled) {
163 exactRadioButton.setSelected(true);
164 regexRadioButton.setEnabled(enabled);
165 }
166
173 @NbBundle.Messages({"DropdownSingleTermSearchPanel.warning.title=Warning",
174 "DropdownSingleTermSearchPanel.warning.text=Boundary characters ^ and $ do not match word boundaries. Consider\nreplacing with an explicit list of boundary characters, such as [ \\.,]"})
175 @Override
176 List<KeywordList> getKeywordLists() {
177 if (regexRadioButton.isSelected()) {
178 if((keywordTextField.getText() != null) &&
179 (keywordTextField.getText().startsWith("^") ||
180 (keywordTextField.getText().endsWith("$") && ! keywordTextField.getText().endsWith("\\$")))) {
181
182 KeywordSearchUtil.displayDialog(NbBundle.getMessage(this.getClass(), "DropdownSingleTermSearchPanel.warning.title"),
183 NbBundle.getMessage(this.getClass(), "DropdownSingleTermSearchPanel.warning.text"),
184 KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);
185 }
186 }
187 List<Keyword> keywords = new ArrayList<>();
188 keywords.add(new Keyword(keywordTextField.getText(), !regexRadioButton.isSelected(), exactRadioButton.isSelected()));
189 List<KeywordList> keywordLists = new ArrayList<>();
190 keywordLists.add(new KeywordList(keywords));
191 return keywordLists;
192 }
193
197 @Override
198 protected void postFilesIndexedChange() {
200 }
201
207 @SuppressWarnings("unchecked")
208 // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
209 private void initComponents() {
210
211 queryTypeButtonGroup = new javax.swing.ButtonGroup();
212 rightClickMenu = new javax.swing.JPopupMenu();
213 cutMenuItem = new javax.swing.JMenuItem();
214 copyMenuItem = new javax.swing.JMenuItem();
215 pasteMenuItem = new javax.swing.JMenuItem();
216 selectAllMenuItem = new javax.swing.JMenuItem();
217 keywordTextField = new javax.swing.JTextField();
218 searchButton = new javax.swing.JButton();
219 exactRadioButton = new javax.swing.JRadioButton();
220 substringRadioButton = new javax.swing.JRadioButton();
221 regexRadioButton = new javax.swing.JRadioButton();
222 dataSourceCheckBox = new javax.swing.JCheckBox();
223 jScrollPane1 = new javax.swing.JScrollPane();
224 dataSourceList = new javax.swing.JList<>();
225 ingestIndexLabel = new javax.swing.JLabel();
226 jSaveSearchResults = new javax.swing.JCheckBox();
227
228 org.openide.awt.Mnemonics.setLocalizedText(cutMenuItem, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSearchPanel.cutMenuItem.text")); // NOI18N
230
231 org.openide.awt.Mnemonics.setLocalizedText(copyMenuItem, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSearchPanel.copyMenuItem.text")); // NOI18N
233
234 org.openide.awt.Mnemonics.setLocalizedText(pasteMenuItem, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSearchPanel.pasteMenuItem.text")); // NOI18N
236
237 org.openide.awt.Mnemonics.setLocalizedText(selectAllMenuItem, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSearchPanel.selectAllMenuItem.text")); // NOI18N
239
240 keywordTextField.setFont(keywordTextField.getFont().deriveFont(keywordTextField.getFont().getSize()+3f));
241 keywordTextField.setText(org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSearchPanel.keywordTextField.text")); // NOI18N
242 keywordTextField.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(192, 192, 192), 1, true));
243 keywordTextField.setMinimumSize(new java.awt.Dimension(2, 25));
244 keywordTextField.setPreferredSize(new java.awt.Dimension(2, 25));
245 keywordTextField.addMouseListener(new java.awt.event.MouseAdapter() {
246 public void mouseClicked(java.awt.event.MouseEvent evt) {
247 keywordTextFieldMouseClicked(evt);
248 }
249 });
250 keywordTextField.addActionListener(new java.awt.event.ActionListener() {
251 public void actionPerformed(java.awt.event.ActionEvent evt) {
252 keywordTextFieldActionPerformed(evt);
253 }
254 });
255
256 searchButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/search-icon.png"))); // NOI18N
257 org.openide.awt.Mnemonics.setLocalizedText(searchButton, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSearchPanel.searchButton.text")); // NOI18N
258 searchButton.addActionListener(new java.awt.event.ActionListener() {
259 public void actionPerformed(java.awt.event.ActionEvent evt) {
260 searchButtonActionPerformed(evt);
261 }
262 });
263
264 queryTypeButtonGroup.add(exactRadioButton);
265 org.openide.awt.Mnemonics.setLocalizedText(exactRadioButton, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSearchPanel.exactRadioButton.text")); // NOI18N
266
267 queryTypeButtonGroup.add(substringRadioButton);
268 org.openide.awt.Mnemonics.setLocalizedText(substringRadioButton, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSearchPanel.substringRadioButton.text")); // NOI18N
269
270 queryTypeButtonGroup.add(regexRadioButton);
271 org.openide.awt.Mnemonics.setLocalizedText(regexRadioButton, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSearchPanel.regexRadioButton.text")); // NOI18N
272
273 org.openide.awt.Mnemonics.setLocalizedText(dataSourceCheckBox, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSingleTermSearchPanel.dataSourceCheckBox.text")); // NOI18N
274 dataSourceCheckBox.addActionListener(new java.awt.event.ActionListener() {
275 public void actionPerformed(java.awt.event.ActionEvent evt) {
276 dataSourceCheckBoxActionPerformed(evt);
277 }
278 });
279
280 dataSourceList.setMinimumSize(new java.awt.Dimension(0, 200));
281 jScrollPane1.setViewportView(dataSourceList);
282
283 ingestIndexLabel.setFont(ingestIndexLabel.getFont().deriveFont(ingestIndexLabel.getFont().getSize()-1f));
284 org.openide.awt.Mnemonics.setLocalizedText(ingestIndexLabel, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSingleTermSearchPanel.ingestIndexLabel.text")); // NOI18N
285
286 org.openide.awt.Mnemonics.setLocalizedText(jSaveSearchResults, org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSingleTermSearchPanel.jSaveSearchResults.text")); // NOI18N
287 jSaveSearchResults.setToolTipText(org.openide.util.NbBundle.getMessage(DropdownSingleTermSearchPanel.class, "DropdownSingleTermSearchPanel.jSaveSearchResults.toolTipText")); // NOI18N
288
289 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
290 this.setLayout(layout);
291 layout.setHorizontalGroup(
292 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
293 .addGroup(layout.createSequentialGroup()
294 .addGap(5, 5, 5)
295 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
296 .addGroup(layout.createSequentialGroup()
297 .addComponent(exactRadioButton)
298 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
299 .addComponent(substringRadioButton)
300 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
301 .addComponent(regexRadioButton))
302 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 297, javax.swing.GroupLayout.PREFERRED_SIZE)
303 .addComponent(jSaveSearchResults)
304 .addGroup(layout.createSequentialGroup()
305 .addComponent(searchButton)
306 .addGap(18, 18, 18)
307 .addComponent(ingestIndexLabel))
308 .addComponent(keywordTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 296, javax.swing.GroupLayout.PREFERRED_SIZE)
309 .addComponent(dataSourceCheckBox))
310 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
311 );
312 layout.setVerticalGroup(
313 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
314 .addGroup(layout.createSequentialGroup()
315 .addContainerGap()
316 .addComponent(keywordTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
317 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
318 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
319 .addComponent(exactRadioButton)
320 .addComponent(substringRadioButton)
321 .addComponent(regexRadioButton))
322 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
323 .addComponent(dataSourceCheckBox)
324 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
325 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE)
326 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
327 .addComponent(jSaveSearchResults)
328 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
329 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
330 .addComponent(searchButton)
331 .addComponent(ingestIndexLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 13, javax.swing.GroupLayout.PREFERRED_SIZE))
332 .addContainerGap(22, Short.MAX_VALUE))
333 );
334 }// </editor-fold>//GEN-END:initComponents
335
341 private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed
343 }//GEN-LAST:event_searchButtonActionPerformed
344
350 private void keywordTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_keywordTextFieldActionPerformed
351 try {
352 search(jSaveSearchResults.isSelected());
353 } catch (Exception e) {
354 LOGGER.log(Level.SEVERE, "Error performing ad hoc single keyword search", e); //NON-NLS
355 }
356 }//GEN-LAST:event_keywordTextFieldActionPerformed
357
363 private void keywordTextFieldMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_keywordTextFieldMouseClicked
364 if (evt.isPopupTrigger()) {
365 rightClickMenu.show(evt.getComponent(), evt.getX(), evt.getY());
366 }
367 }//GEN-LAST:event_keywordTextFieldMouseClicked
368
369 private void dataSourceCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dataSourceCheckBoxActionPerformed
370 updateDataSourceListModel();
371 }//GEN-LAST:event_dataSourceCheckBoxActionPerformed
372
376 void updateDataSourceListModel() {
377 getDataSourceListModel().removeAllElements();
378 for (String dsName : getDataSourceArray()) {
379 getDataSourceListModel().addElement(dsName);
380 }
381 setComponentsEnabled();
382 firePropertyChange(Bundle.DropdownSingleTermSearchPanel_selected(), null, null);
383 }
384
388 private void setComponentsEnabled() {
389 if (getDataSourceListModel().size() > 1) {
390 this.dataSourceCheckBox.setEnabled(true);
391
392 boolean enabled = this.dataSourceCheckBox.isSelected();
393 this.dataSourceList.setEnabled(enabled);
394 if (enabled) {
395 this.dataSourceList.setSelectionInterval(0, this.dataSourceList.getModel().getSize()-1);
396 } else {
397 this.dataSourceList.setSelectedIndices(new int[0]);
398 }
399 } else {
400 this.dataSourceCheckBox.setEnabled(false);
401 this.dataSourceCheckBox.setSelected(false);
402 this.dataSourceList.setEnabled(false);
403 this.dataSourceList.setSelectedIndices(new int[0]);
404 }
405 }
406
411 @Override
412 Set<Long> getDataSourcesSelected() {
413 Set<Long> dataSourceObjIdSet = new HashSet<>();
414 for (Long key : getDataSourceMap().keySet()) {
415 String value = getDataSourceMap().get(key);
416 for (String dataSource : this.dataSourceList.getSelectedValuesList()) {
417 if (value.equals(dataSource)) {
418 dataSourceObjIdSet.add(key);
419 }
420 }
421 }
422 return dataSourceObjIdSet;
423 }
424
428 private void updateIngestIndexLabel() {
429 if (ingestRunning) {
430 ingestIndexLabel.setText(NbBundle.getMessage(this.getClass(), "KeywordSearchListsViewerPanel.initIngest.ongoingIngestMsg", filesIndexed));
431 } else {
432 ingestIndexLabel.setText(NbBundle.getMessage(this.getClass(), "KeywordSearchListsViewerPanel.initIngest.fileIndexCtMsg", filesIndexed));
433 }
434 }
435
436 // Variables declaration - do not modify//GEN-BEGIN:variables
437 private javax.swing.JMenuItem copyMenuItem;
438 private javax.swing.JMenuItem cutMenuItem;
439 private javax.swing.JCheckBox dataSourceCheckBox;
440 private javax.swing.JList<String> dataSourceList;
441 private javax.swing.JRadioButton exactRadioButton;
442 private javax.swing.JLabel ingestIndexLabel;
443 private javax.swing.JCheckBox jSaveSearchResults;
444 private javax.swing.JScrollPane jScrollPane1;
445 private javax.swing.JTextField keywordTextField;
446 private javax.swing.JMenuItem pasteMenuItem;
447 private javax.swing.ButtonGroup queryTypeButtonGroup;
448 private javax.swing.JRadioButton regexRadioButton;
449 private javax.swing.JPopupMenu rightClickMenu;
450 private javax.swing.JButton searchButton;
451 private javax.swing.JMenuItem selectAllMenuItem;
452 private javax.swing.JRadioButton substringRadioButton;
453 // End of variables declaration//GEN-END:variables
454}
synchronized static Logger getLogger(String name)
Definition Logger.java:124
static synchronized IngestManager getInstance()
void addIngestJobEventListener(final PropertyChangeListener listener)

Copyright © 2012-2024 Sleuth Kit Labs. Generated on:
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.