Autopsy  4.17.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
DiscoveryDialog.java
Go to the documentation of this file.
1 /*
2  * Autopsy
3  *
4  * Copyright 2020 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  */
19 package org.sleuthkit.autopsy.discovery.ui;
20 
22 import static java.awt.BorderLayout.CENTER;
23 import java.awt.Color;
24 import java.awt.event.ItemEvent;
25 import java.awt.event.ItemListener;
26 import java.beans.PropertyChangeEvent;
27 import java.beans.PropertyChangeListener;
28 import java.util.ArrayList;
29 import java.util.EnumSet;
30 import java.util.HashSet;
31 import java.util.List;
32 import java.util.Set;
33 import java.util.logging.Level;
34 import javax.swing.SwingUtilities;
35 import org.apache.commons.lang.StringUtils;
36 import org.openide.util.NbBundle.Messages;
37 import org.openide.windows.WindowManager;
54 import org.sleuthkit.datamodel.BlackboardArtifact;
55 import org.sleuthkit.datamodel.BlackboardAttribute;
56 import org.sleuthkit.datamodel.TskCoreException;
57 
62 final class DiscoveryDialog extends javax.swing.JDialog {
63 
64  private static final Set<Case.Events> CASE_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.CURRENT_CASE,
65  Case.Events.DATA_SOURCE_ADDED, Case.Events.DATA_SOURCE_DELETED);
66  private static final Set<IngestManager.IngestModuleEvent> INGEST_MODULE_EVENTS_OF_INTEREST = EnumSet.of(IngestManager.IngestModuleEvent.DATA_ADDED);
67  private static final long serialVersionUID = 1L;
68  private final static Logger logger = Logger.getLogger(DiscoveryDialog.class.getName());
69  private ImageFilterPanel imageFilterPanel = null;
70  private VideoFilterPanel videoFilterPanel = null;
71  private DocumentFilterPanel documentFilterPanel = null;
72  private DomainFilterPanel domainFilterPanel = null;
73  private static final Color SELECTED_COLOR = new Color(216, 230, 242);
74  private static final Color UNSELECTED_COLOR = new Color(240, 240, 240);
75  private SearchWorker searchWorker = null;
76  private static DiscoveryDialog discDialog;
77  private static volatile boolean shouldUpdate = false;
78  private SearchData.Type type = SearchData.Type.IMAGE;
79  private final PropertyChangeListener listener;
80  private final Set<BlackboardAttribute> objectsDetected = new HashSet<>();
81  private final Set<BlackboardAttribute> interestingItems = new HashSet<>();
82  private final Set<BlackboardAttribute> hashSets = new HashSet<>();
83 
89  static synchronized DiscoveryDialog getDiscoveryDialogInstance() {
90  if (discDialog == null) {
91  discDialog = new DiscoveryDialog();
92  }
93  if (shouldUpdate) {
94  discDialog.updateSearchSettings();
95  shouldUpdate = false;
96  }
97  return discDialog;
98  }
99 
103  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
104  @Messages("DiscoveryDialog.name.text=Discovery")
105  private DiscoveryDialog() {
106  super(WindowManager.getDefault().getMainWindow(), Bundle.DiscoveryDialog_name_text(), true);
107  initComponents();
108  listener = new PropertyChangeListener() {
109  @Override
110  public void propertyChange(PropertyChangeEvent evt) {
111  if (evt.getPropertyName().equals("FilterError") && evt.getNewValue() != null) {
112  setValid(evt.getNewValue().toString());
113  }
114  }
115  };
116  updateSearchSettings();
117  groupByCombobox.addItemListener(new ItemListener() {
118  @Override
119  public void itemStateChanged(ItemEvent event) {
120  if (event.getStateChange() == ItemEvent.SELECTED) {
121  getSelectedFilterPanel().setLastGroupingAttributeType(groupByCombobox.getItemAt(groupByCombobox.getSelectedIndex()));
122  }
123  }
124  });
125  orderByCombobox.addItemListener(new ItemListener() {
126  @Override
127  public void itemStateChanged(ItemEvent event) {
128  if (event.getStateChange() == ItemEvent.SELECTED) {
129  getSelectedFilterPanel().setLastSortingMethod(orderByCombobox.getItemAt(orderByCombobox.getSelectedIndex()));
130  }
131  }
132  });
133  groupSortingComboBox.addItemListener(new ItemListener() {
134  @Override
135  public void itemStateChanged(ItemEvent event) {
136  if (event.getStateChange() == ItemEvent.SELECTED) {
137  getSelectedFilterPanel().setLastGroupSortingAlg(groupSortingComboBox.getItemAt(groupSortingComboBox.getSelectedIndex()));
138  }
139  }
140  });
141  Case.addEventTypeSubscriber(CASE_EVENTS_OF_INTEREST, this.new CasePropertyChangeListener());
142  IngestManager.getInstance().addIngestModuleEventListener(INGEST_MODULE_EVENTS_OF_INTEREST, this.new ModuleChangeListener());
143  setPreferredSize(new java.awt.Dimension(1000, 650));
144  }
145 
149  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
150  void updateSearchSettings() {
151  removeAllPanels();
152  imageFilterPanel = null;
153  videoFilterPanel = null;
154  documentFilterPanel = null;
155  imageFilterPanel = new ImageFilterPanel();
156  videoFilterPanel = new VideoFilterPanel();
157  documentFilterPanel = new DocumentFilterPanel();
158  domainFilterPanel = new DomainFilterPanel();
159  unselectAllButtons();
160  imagesButton.setSelected(true);
161  imagesButton.setEnabled(false);
162  imagesButton.setBackground(SELECTED_COLOR);
163  imagesButton.setForeground(Color.BLACK);
164  type = SearchData.Type.IMAGE;
165  add(imageFilterPanel, CENTER);
166  imageFilterPanel.addPropertyChangeListener(listener);
167  updateComboBoxes();
168  pack();
169  repaint();
170  }
171 
175  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
176  private void unselectAllButtons() {
177  imagesButton.setSelected(false);
178  imagesButton.setEnabled(true);
179  imagesButton.setBackground(UNSELECTED_COLOR);
180  videosButton.setSelected(false);
181  videosButton.setEnabled(true);
182  videosButton.setBackground(UNSELECTED_COLOR);
183  documentsButton.setSelected(false);
184  documentsButton.setEnabled(true);
185  documentsButton.setBackground(UNSELECTED_COLOR);
186  domainsButton.setSelected(false);
187  domainsButton.setEnabled(true);
188  domainsButton.setBackground(UNSELECTED_COLOR);
189  }
190 
194  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
195  private void updateComboBoxes() {
196  // Set up the grouping attributes
197  List<GroupingAttributeType> groupingAttrs = new ArrayList<>();
198  List<SortingMethod> sortingMethods = new ArrayList<>();
199  groupByCombobox.removeAllItems();
200  if (type == SearchData.Type.DOMAIN) {
201  groupingAttrs.addAll(GroupingAttributeType.getOptionsForGroupingForDomains());
202  sortingMethods.addAll(SortingMethod.getOptionsForOrderingDomains());
203  } else {
204  groupingAttrs.addAll(GroupingAttributeType.getOptionsForGroupingForFiles());
205  sortingMethods.addAll(SortingMethod.getOptionsForOrderingFiles());
206  }
207  for (GroupingAttributeType groupingType : groupingAttrs) {
208  addTypeToGroupByComboBox(groupingType);
209  }
210  groupByCombobox.setSelectedItem(getSelectedFilterPanel().getLastGroupingAttributeType());
211  orderByCombobox.removeAllItems();
212  // Set up the file order list
213  for (SortingMethod method : sortingMethods) {
214  if (method != SortingMethod.BY_FREQUENCY || CentralRepository.isEnabled()) {
215  orderByCombobox.addItem(method);
216  }
217  }
218  orderByCombobox.setSelectedItem(getSelectedFilterPanel().getLastSortingMethod());
219  groupSortingComboBox.removeAllItems();
220  for (GroupSortingAlgorithm groupSortAlgorithm : GroupSortingAlgorithm.values()) {
221  groupSortingComboBox.addItem(groupSortAlgorithm);
222  }
223  groupSortingComboBox.setSelectedItem(getSelectedFilterPanel().getLastGroupSortingAlg());
224  }
225 
231  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
232  private AbstractFiltersPanel getSelectedFilterPanel() {
233  switch (type) {
234  case IMAGE:
235  return imageFilterPanel;
236  case VIDEO:
237  return videoFilterPanel;
238  case DOCUMENT:
239  return documentFilterPanel;
240  case DOMAIN:
241  return domainFilterPanel;
242  default:
243  return imageFilterPanel;
244  }
245  }
246 
253  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
254  private void addTypeToGroupByComboBox(GroupingAttributeType type) {
255  switch (type) {
256  case FREQUENCY:
257  if (!CentralRepository.isEnabled()) {
258  return;
259  }
260  break;
261  case OBJECT_DETECTED:
262  if (!imageFilterPanel.isObjectsFilterSupported()) {
263  return;
264  }
265  break;
266  case INTERESTING_ITEM_SET:
267  if (!imageFilterPanel.isInterestingItemsFilterSupported()) {
268  return;
269  }
270  break;
271  case HASH_LIST_NAME:
272  if (!imageFilterPanel.isHashSetFilterSupported()) {
273  return;
274  }
275  break;
276  default:
277  break;
278  }
279  groupByCombobox.addItem(type);
280  }
281 
285  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
286  void validateDialog() {
287  AbstractFiltersPanel panel = getSelectedFilterPanel();
288  if (panel != null) {
289  panel.validateFields();
290  }
291  }
292 
298  @SuppressWarnings("unchecked")
299  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
300  private void initComponents() {
301 
302  javax.swing.JPanel toolBarPanel = new javax.swing.JPanel();
303  imagesButton = new javax.swing.JButton();
304  videosButton = new javax.swing.JButton();
305  documentsButton = new javax.swing.JButton();
306  javax.swing.JLabel step1Label = new javax.swing.JLabel();
307  javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(104, 0), new java.awt.Dimension(104, 0), new java.awt.Dimension(104, 32767));
308  domainsButton = new javax.swing.JButton();
309  javax.swing.JPanel displaySettingsPanel = new javax.swing.JPanel();
310  searchButton = new javax.swing.JButton();
311  errorLabel = new javax.swing.JLabel();
312  javax.swing.JPanel sortingPanel = new javax.swing.JPanel();
313  groupByCombobox = new javax.swing.JComboBox<>();
314  orderByCombobox = new javax.swing.JComboBox<>();
315  javax.swing.JLabel orderGroupsByLabel = new javax.swing.JLabel();
316  javax.swing.JLabel orderByLabel = new javax.swing.JLabel();
317  javax.swing.JLabel groupByLabel = new javax.swing.JLabel();
318  groupSortingComboBox = new javax.swing.JComboBox<>();
319 
320  setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
321  setMinimumSize(new java.awt.Dimension(600, 300));
322 
323  imagesButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/pictures-icon.png"))); // NOI18N
324  org.openide.awt.Mnemonics.setLocalizedText(imagesButton, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.imagesButton.text")); // NOI18N
325  imagesButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/pictures-icon.png"))); // NOI18N
326  imagesButton.setFocusable(false);
327  imagesButton.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
328  imagesButton.setMaximumSize(new java.awt.Dimension(90, 43));
329  imagesButton.setMinimumSize(new java.awt.Dimension(90, 43));
330  imagesButton.setPreferredSize(new java.awt.Dimension(90, 43));
331  imagesButton.addActionListener(new java.awt.event.ActionListener() {
332  public void actionPerformed(java.awt.event.ActionEvent evt) {
333  imagesButtonActionPerformed(evt);
334  }
335  });
336 
337  videosButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/video-icon.png"))); // NOI18N
338  org.openide.awt.Mnemonics.setLocalizedText(videosButton, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.videosButton.text")); // NOI18N
339  videosButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/video-icon.png"))); // NOI18N
340  videosButton.setDisabledSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/video-icon.png"))); // NOI18N
341  videosButton.setFocusable(false);
342  videosButton.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
343  videosButton.setMaximumSize(new java.awt.Dimension(90, 43));
344  videosButton.setMinimumSize(new java.awt.Dimension(90, 43));
345  videosButton.setPreferredSize(new java.awt.Dimension(90, 43));
346  videosButton.addActionListener(new java.awt.event.ActionListener() {
347  public void actionPerformed(java.awt.event.ActionEvent evt) {
348  videosButtonActionPerformed(evt);
349  }
350  });
351 
352  documentsButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/documents-icon.png"))); // NOI18N
353  org.openide.awt.Mnemonics.setLocalizedText(documentsButton, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.documentsButton.text")); // NOI18N
354  documentsButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/documents-icon.png"))); // NOI18N
355  documentsButton.setDisabledSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/documents-icon.png"))); // NOI18N
356  documentsButton.setFocusable(false);
357  documentsButton.addActionListener(new java.awt.event.ActionListener() {
358  public void actionPerformed(java.awt.event.ActionEvent evt) {
359  documentsButtonActionPerformed(evt);
360  }
361  });
362 
363  org.openide.awt.Mnemonics.setLocalizedText(step1Label, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.step1Label.text")); // NOI18N
364 
365  domainsButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/domain-32.png"))); // NOI18N
366  org.openide.awt.Mnemonics.setLocalizedText(domainsButton, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.domainsButton.text")); // NOI18N
367  domainsButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/domain-32.png"))); // NOI18N
368  domainsButton.setDisabledSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/domain-32.png"))); // NOI18N
369  domainsButton.setFocusable(false);
370  domainsButton.addActionListener(new java.awt.event.ActionListener() {
371  public void actionPerformed(java.awt.event.ActionEvent evt) {
372  domainsButtonActionPerformed(evt);
373  }
374  });
375 
376  javax.swing.GroupLayout toolBarPanelLayout = new javax.swing.GroupLayout(toolBarPanel);
377  toolBarPanel.setLayout(toolBarPanelLayout);
378  toolBarPanelLayout.setHorizontalGroup(
379  toolBarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
380  .addGroup(toolBarPanelLayout.createSequentialGroup()
381  .addContainerGap()
382  .addGroup(toolBarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
383  .addGroup(toolBarPanelLayout.createSequentialGroup()
384  .addGap(10, 10, 10)
385  .addComponent(imagesButton, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
386  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
387  .addComponent(videosButton, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
388  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
389  .addComponent(documentsButton)
390  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
391  .addComponent(domainsButton)
392  .addContainerGap(190, Short.MAX_VALUE))
393  .addGroup(toolBarPanelLayout.createSequentialGroup()
394  .addComponent(step1Label, javax.swing.GroupLayout.PREFERRED_SIZE, 243, javax.swing.GroupLayout.PREFERRED_SIZE)
395  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
396  .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
397  .addContainerGap(391, Short.MAX_VALUE))))
398  );
399 
400  toolBarPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {documentsButton, domainsButton, imagesButton, videosButton});
401 
402  toolBarPanelLayout.setVerticalGroup(
403  toolBarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
404  .addGroup(toolBarPanelLayout.createSequentialGroup()
405  .addGap(8, 8, 8)
406  .addGroup(toolBarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
407  .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
408  .addComponent(step1Label))
409  .addGap(8, 8, 8)
410  .addGroup(toolBarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
411  .addComponent(videosButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
412  .addComponent(imagesButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
413  .addComponent(documentsButton, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
414  .addComponent(domainsButton, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
415  .addGap(8, 8, 8))
416  );
417 
418  getContentPane().add(toolBarPanel, java.awt.BorderLayout.PAGE_START);
419 
420  org.openide.awt.Mnemonics.setLocalizedText(searchButton, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.searchButton.text")); // NOI18N
421  searchButton.addActionListener(new java.awt.event.ActionListener() {
422  public void actionPerformed(java.awt.event.ActionEvent evt) {
423  searchButtonActionPerformed(evt);
424  }
425  });
426 
427  errorLabel.setForeground(new java.awt.Color(255, 0, 0));
428 
429  sortingPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.sortingPanel.border.title"))); // NOI18N
430  sortingPanel.setPreferredSize(new java.awt.Dimension(345, 112));
431 
432  org.openide.awt.Mnemonics.setLocalizedText(orderGroupsByLabel, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.orderGroupsByLabel.text")); // NOI18N
433 
434  org.openide.awt.Mnemonics.setLocalizedText(orderByLabel, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.orderByLabel.text")); // NOI18N
435 
436  org.openide.awt.Mnemonics.setLocalizedText(groupByLabel, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.groupByLabel.text")); // NOI18N
437 
438  javax.swing.GroupLayout sortingPanelLayout = new javax.swing.GroupLayout(sortingPanel);
439  sortingPanel.setLayout(sortingPanelLayout);
440  sortingPanelLayout.setHorizontalGroup(
441  sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
442  .addGroup(sortingPanelLayout.createSequentialGroup()
443  .addContainerGap()
444  .addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
445  .addComponent(orderGroupsByLabel)
446  .addComponent(groupByLabel))
447  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
448  .addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
449  .addComponent(groupSortingComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
450  .addComponent(groupByCombobox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
451  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
452  .addComponent(orderByLabel)
453  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
454  .addComponent(orderByCombobox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
455  .addContainerGap())
456  );
457  sortingPanelLayout.setVerticalGroup(
458  sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
459  .addGroup(sortingPanelLayout.createSequentialGroup()
460  .addGap(8, 8, 8)
461  .addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
462  .addComponent(groupByCombobox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
463  .addComponent(groupByLabel)
464  .addComponent(orderByCombobox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
465  .addComponent(orderByLabel))
466  .addGap(8, 8, 8)
467  .addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
468  .addComponent(groupSortingComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
469  .addComponent(orderGroupsByLabel))
470  .addGap(8, 8, 8))
471  );
472 
473  javax.swing.GroupLayout displaySettingsPanelLayout = new javax.swing.GroupLayout(displaySettingsPanel);
474  displaySettingsPanel.setLayout(displaySettingsPanelLayout);
475  displaySettingsPanelLayout.setHorizontalGroup(
476  displaySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
477  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, displaySettingsPanelLayout.createSequentialGroup()
478  .addGap(8, 8, 8)
479  .addGroup(displaySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
480  .addComponent(sortingPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 741, Short.MAX_VALUE)
481  .addGroup(displaySettingsPanelLayout.createSequentialGroup()
482  .addComponent(errorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 575, Short.MAX_VALUE)
483  .addGap(65, 65, 65)
484  .addComponent(searchButton, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)))
485  .addGap(8, 8, 8))
486  );
487  displaySettingsPanelLayout.setVerticalGroup(
488  displaySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
489  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, displaySettingsPanelLayout.createSequentialGroup()
490  .addGap(8, 8, 8)
491  .addComponent(sortingPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)
492  .addGap(8, 8, 8)
493  .addGroup(displaySettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
494  .addComponent(errorLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
495  .addComponent(searchButton))
496  .addGap(8, 8, 8))
497  );
498 
499  getContentPane().add(displaySettingsPanel, java.awt.BorderLayout.PAGE_END);
500 
501  pack();
502  }// </editor-fold>//GEN-END:initComponents
503 
504  private void imagesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_imagesButtonActionPerformed
505  removeAllPanels();
506  add(imageFilterPanel, CENTER);
507  unselectAllButtons();
508  imagesButton.setSelected(true);
509  imagesButton.setEnabled(false);
510  imagesButton.setBackground(SELECTED_COLOR);
511  imagesButton.setForeground(Color.BLACK);
512  type = SearchData.Type.IMAGE;
513  imageFilterPanel.addPropertyChangeListener(listener);
514  updateComboBoxes();
515  validateDialog();
516  pack();
517  repaint();
518  }//GEN-LAST:event_imagesButtonActionPerformed
519 
520  private void videosButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_videosButtonActionPerformed
521  removeAllPanels();
522  add(videoFilterPanel, CENTER);
523  unselectAllButtons();
524  videosButton.setSelected(true);
525  videosButton.setEnabled(false);
526  videosButton.setBackground(SELECTED_COLOR);
527  videosButton.setForeground(Color.BLACK);
528  videoFilterPanel.addPropertyChangeListener(listener);
529  type = SearchData.Type.VIDEO;
530  updateComboBoxes();
531  validateDialog();
532  pack();
533  repaint();
534  }//GEN-LAST:event_videosButtonActionPerformed
535 
536  private void documentsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_documentsButtonActionPerformed
537  removeAllPanels();
538  add(documentFilterPanel, CENTER);
539  unselectAllButtons();
540  documentsButton.setSelected(true);
541  documentsButton.setEnabled(false);
542  documentsButton.setBackground(SELECTED_COLOR);
543  documentsButton.setForeground(Color.BLACK);
544  type = SearchData.Type.DOCUMENT;
545  documentFilterPanel.addPropertyChangeListener(listener);
546  updateComboBoxes();
547  validateDialog();
548  pack();
549  repaint();
550  }//GEN-LAST:event_documentsButtonActionPerformed
551 
555  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
556  private void removeAllPanels() {
557  if (imageFilterPanel != null) {
558  remove(imageFilterPanel);
559  imageFilterPanel.removePropertyChangeListener(listener);
560  }
561  if (domainFilterPanel != null) {
562  remove(domainFilterPanel);
563  domainFilterPanel.removePropertyChangeListener(listener);
564  }
565  if (documentFilterPanel != null) {
566  remove(documentFilterPanel);
567  documentFilterPanel.removePropertyChangeListener(listener);
568  }
569  if (videoFilterPanel != null) {
570  remove(videoFilterPanel);
571  videoFilterPanel.removePropertyChangeListener(listener);
572  }
573  }
574 
575  private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed
576  // Get the selected filters
577  final DiscoveryTopComponent tc = DiscoveryTopComponent.getTopComponent();
578  if (tc == null) {
579  setValid("No Top Component Found");
580  return;
581  }
582  if (tc.isOpened() == false) {
583  tc.open();
584  }
585  tc.resetTopComponent();
586  List<AbstractFilter> filters;
587  if (videosButton.isSelected()) {
588  filters = videoFilterPanel.getFilters();
589  } else if (documentsButton.isSelected()) {
590  filters = documentFilterPanel.getFilters();
591  } else if (imagesButton.isSelected()) {
592  filters = imageFilterPanel.getFilters();
593  } else if (domainsButton.isSelected()) {
594  filters = domainFilterPanel.getFilters();
595  } else {
596  logger.log(Level.SEVERE, "No filter type selected");
597  filters = new ArrayList<>();
598  }
599 
600  DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.SearchStartedEvent(type));
601 
602  // Get the grouping attribute and group sorting method
603  DiscoveryAttributes.AttributeType groupingAttr = groupByCombobox.getItemAt(groupByCombobox.getSelectedIndex()).getAttributeType();
604  Group.GroupSortingAlgorithm groupSortAlgorithm = groupSortingComboBox.getItemAt(groupSortingComboBox.getSelectedIndex());
605 
606  // Get the file sorting method
607  ResultsSorter.SortingMethod fileSort = (ResultsSorter.SortingMethod) orderByCombobox.getSelectedItem();
608  CentralRepository centralRepoDb = null;
609  if (CentralRepository.isEnabled()) {
610  try {
611  centralRepoDb = CentralRepository.getInstance();
612  } catch (CentralRepoException ex) {
613  centralRepoDb = null;
614  logger.log(Level.SEVERE, "Error loading central repository database, no central repository options will be available for Discovery", ex);
615  }
616  }
617  searchWorker = new SearchWorker(centralRepoDb, type, filters, groupingAttr, groupSortAlgorithm, fileSort);
618  searchWorker.execute();
619  dispose();
620  tc.toFront();
621  tc.requestActive();
622  }//GEN-LAST:event_searchButtonActionPerformed
623 
624  private void domainsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_domainsButtonActionPerformed
625  removeAllPanels();
626  add(domainFilterPanel, CENTER);
627  unselectAllButtons();
628  domainsButton.setSelected(true);
629  domainsButton.setEnabled(false);
630  domainsButton.setBackground(SELECTED_COLOR);
631  domainsButton.setForeground(Color.BLACK);
632  type = SearchData.Type.DOMAIN;
633  domainFilterPanel.addPropertyChangeListener(listener);
634  updateComboBoxes();
635  validateDialog();
636  pack();
637  repaint();
638  }//GEN-LAST:event_domainsButtonActionPerformed
639 
640  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
641  @Override
642  public void dispose() {
643  setVisible(false);
644  }
645 
649  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
650  void cancelSearch() {
651  if (searchWorker != null) {
652  searchWorker.cancel(true);
653  }
654  }
655 
663  @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
664  private void setValid(String error) {
665  if (StringUtils.isBlank(error)) {
666  errorLabel.setText("");
667  searchButton.setEnabled(true);
668  } else {
669  errorLabel.setText(error);
670  searchButton.setEnabled(false);
671  }
672  }
673 
674 
675  // Variables declaration - do not modify//GEN-BEGIN:variables
676  private javax.swing.JButton documentsButton;
677  private javax.swing.JButton domainsButton;
678  private javax.swing.JLabel errorLabel;
679  private javax.swing.JComboBox<GroupingAttributeType> groupByCombobox;
680  private javax.swing.JComboBox<GroupSortingAlgorithm> groupSortingComboBox;
681  private javax.swing.JButton imagesButton;
682  private javax.swing.JComboBox<SortingMethod> orderByCombobox;
683  private javax.swing.JButton searchButton;
684  private javax.swing.JButton videosButton;
685  // End of variables declaration//GEN-END:variables
686 
691  private class CasePropertyChangeListener implements PropertyChangeListener {
692 
693  @Override
694  @SuppressWarnings("fallthrough")
695  public void propertyChange(PropertyChangeEvent evt) {
696  switch (Case.Events.valueOf(evt.getPropertyName())) {
697  case CURRENT_CASE: {
698  if (evt.getNewValue() == null) {
699  //do not refresh when a case is closed only when it is opened.
700  break;
701  }
702  //else fallthrough
703  }
704  case DATA_SOURCE_ADDED:
705  //fallthrough
706  case DATA_SOURCE_DELETED:
707  shouldUpdate = true;
708  break;
709  default:
710  //do nothing if the event is not one of the above events.
711  break;
712  }
713  }
714  }
715 
720  private class ModuleChangeListener implements PropertyChangeListener {
721 
722  @Override
723  @SuppressWarnings("fallthrough")
724  public void propertyChange(PropertyChangeEvent evt) {
725  if (!shouldUpdate) {
726  String eventType = evt.getPropertyName();
727  if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
734  try {
742  ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue();
743  if (null != eventData) {
744  if (eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_OBJECT_DETECTED.getTypeID() && eventData.getArtifacts() != null) {
745  shouldUpdate = shouldUpdateFilters(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION.getTypeID(), eventData, objectsDetected);
746  } else if (eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID()) {
747  shouldUpdate = shouldUpdateFilters(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID(), eventData, hashSets);
748  } else if (eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID()
749  || eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID()) {
750  shouldUpdate = shouldUpdateFilters(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID(), eventData, interestingItems);
751  }
752 
753  }
754  } catch (NoCurrentCaseException notUsed) {
755  // Case is closed, do nothing.
756  } catch (TskCoreException ex) {
757  logger.log(Level.WARNING, "Unable to determine if discovery UI should be updated", ex);
758  }
759  }
760  }
761  }
762 
780  private boolean shouldUpdateFilters(int attributeTypeId, ModuleDataEvent eventData, Set<BlackboardAttribute> filterSetToCheck) throws TskCoreException {
781  for (BlackboardArtifact artifact : eventData.getArtifacts()) {
782  if (artifact.getAttributes() != null) {
783  for (BlackboardAttribute attr : artifact.getAttributes()) {
784  if (attr.getAttributeType().getTypeID() == attributeTypeId && !filterSetToCheck.contains(attr)) {
785  filterSetToCheck.add(attr);
786  return true;
787  }
788  }
789  }
790  }
791  return false;
792  }
793  }
794 }
Collection< BlackboardArtifact > getArtifacts()
BlackboardArtifact.Type getBlackboardArtifactType()
boolean shouldUpdateFilters(int attributeTypeId, ModuleDataEvent eventData, Set< BlackboardAttribute > filterSetToCheck)

Copyright © 2012-2021 Basis Technology. Generated on: Tue Jan 19 2021
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.