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

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