19 package org.sleuthkit.autopsy.report;
21 import java.awt.Component;
22 import java.awt.event.MouseAdapter;
23 import java.awt.event.MouseEvent;
24 import java.sql.ResultSet;
25 import java.sql.SQLException;
26 import java.util.ArrayList;
27 import java.util.Collections;
28 import java.util.HashMap;
29 import java.util.LinkedHashMap;
30 import java.util.List;
32 import java.util.logging.Level;
33 import javax.swing.JCheckBox;
34 import javax.swing.JLabel;
35 import javax.swing.JList;
36 import javax.swing.JOptionPane;
37 import javax.swing.ListCellRenderer;
38 import javax.swing.ListModel;
39 import javax.swing.event.ListDataListener;
40 import org.openide.util.NbBundle;
52 @SuppressWarnings(
"PMD.SingularField")
53 class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel {
55 private List<String> setNames;
56 private final Map<String, Boolean> setNameSelections =
new LinkedHashMap<>();
57 private final SetNamesListModel setNamesListModel =
new SetNamesListModel();
58 private final SetNamesListCellRenderer setNamesRenderer =
new SetNamesListCellRenderer();
59 private Map<String, Long> setCounts;
61 private final ReportWizardPortableCaseOptionsPanel wizPanel;
62 private final PortableCaseReportModule.PortableCaseOptions options;
67 PortableCaseInterestingItemsListPanel(ReportWizardPortableCaseOptionsPanel wizPanel, PortableCaseReportModule.PortableCaseOptions options) {
68 this.wizPanel = wizPanel;
69 this.options = options;
71 customizeComponents();
75 "PortableCaseInterestingItemsListPanel.error.errorTitle=Error getting intesting item set names for case",
76 "PortableCaseInterestingItemsListPanel.error.noOpenCase=There is no case open",
77 "PortableCaseInterestingItemsListPanel.error.errorLoadingTags=Error loading interesting item set names",
79 private void customizeComponents() {
82 setNames =
new ArrayList<>();
85 String innerSelect =
"SELECT (value_text) AS set_name FROM blackboard_attributes WHERE (artifact_type_id = '" +
86 BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() +
"' OR artifact_type_id = '" +
87 BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() +
"') AND attribute_type_id = '" +
88 BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() +
"'";
91 String query =
"set_name, count(1) AS set_count FROM (" + innerSelect +
") set_names GROUP BY set_name";
93 GetInterestingItemSetNamesCallback callback =
new GetInterestingItemSetNamesCallback();
94 Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select(query, callback);
95 setCounts = callback.getSetCountMap();
96 setNames.addAll(setCounts.keySet());
97 }
catch (TskCoreException ex) {
98 Logger.getLogger(ReportWizardPortableCaseOptionsVisualPanel.class.getName()).log(Level.SEVERE,
"Failed to get interesting item set names", ex);
99 JOptionPane.showMessageDialog(
this, Bundle.PortableCaseInterestingItemsListPanel_error_errorLoadingTags(), Bundle.PortableCaseInterestingItemsListPanel_error_errorTitle(), JOptionPane.ERROR_MESSAGE);
100 }
catch (NoCurrentCaseException ex) {
101 Logger.getLogger(ReportWizardPortableCaseOptionsVisualPanel.class.getName()).log(Level.SEVERE,
"Exception while getting open case.", ex);
102 JOptionPane.showMessageDialog(
this, Bundle.PortableCaseInterestingItemsListPanel_error_noOpenCase(), Bundle.PortableCaseInterestingItemsListPanel_error_errorTitle(), JOptionPane.ERROR_MESSAGE);
104 Collections.sort(setNames);
109 for (String setName : setNames) {
110 setNameSelections.put(setName, Boolean.FALSE);
116 setNamesListBox.setModel(setNamesListModel);
117 setNamesListBox.setCellRenderer(setNamesRenderer);
118 setNamesListBox.setVisibleRowCount(-1);
119 setNamesListBox.addMouseListener(
new MouseAdapter() {
121 public void mousePressed(MouseEvent evt) {
122 JList<?> list = (JList) evt.getSource();
123 int index = list.locationToIndex(evt.getPoint());
125 String value = setNamesListModel.getElementAt(index);
126 setNameSelections.put(value, !setNameSelections.get(value));
137 private void updateSetNameList() {
138 options.updateSetNames(getSelectedSetNames());
139 wizPanel.setFinish(options.isValid());
149 return setNames.size();
154 return setNames.get(index);
172 private static final long serialVersionUID = 1L;
177 setEnabled(list.isEnabled());
178 setSelected(setNameSelections.get(value));
179 setFont(list.getFont());
180 setBackground(list.getBackground());
181 setForeground(list.getForeground());
182 setText(value +
" (" + setCounts.get(value) +
")");
194 private List<String> getSelectedSetNames() {
195 List<String> selectedSetNames =
new ArrayList<>();
196 for (String setName : setNames) {
197 if (setNameSelections.get(setName)) {
198 selectedSetNames.add(setName);
201 return selectedSetNames;
210 private final Map<String, Long> setCounts =
new HashMap<>();
217 Long setCount = rs.getLong(
"set_count");
218 String setName = rs.getString(
"set_name");
220 setCounts.put(setName, setCount);
222 }
catch (SQLException ex) {
223 logger.log(Level.WARNING,
"Unable to get data_source_obj_id or value from result set", ex);
226 }
catch (SQLException ex) {
227 logger.log(Level.WARNING,
"Failed to get next result for values by datasource", ex);
236 Map<String, Long> getSetCountMap() {
246 @SuppressWarnings(
"unchecked")
248 private
void initComponents() {
250 jPanel1 =
new javax.swing.JPanel();
251 jScrollPane1 =
new javax.swing.JScrollPane();
252 setNamesListBox =
new javax.swing.JList<>();
253 descLabel =
new javax.swing.JLabel();
254 selectButton =
new javax.swing.JButton();
255 deselectButton =
new javax.swing.JButton();
257 jScrollPane1.setViewportView(setNamesListBox);
259 org.openide.awt.Mnemonics.setLocalizedText(descLabel,
org.openide.util.NbBundle.getMessage(PortableCaseInterestingItemsListPanel.class,
"PortableCaseInterestingItemsListPanel.descLabel.text"));
261 org.openide.awt.Mnemonics.setLocalizedText(selectButton,
org.openide.util.NbBundle.getMessage(PortableCaseInterestingItemsListPanel.class,
"PortableCaseInterestingItemsListPanel.selectButton.text"));
262 selectButton.setMaximumSize(
new java.awt.Dimension(87, 23));
263 selectButton.setMinimumSize(
new java.awt.Dimension(87, 23));
264 selectButton.addActionListener(
new java.awt.event.ActionListener() {
265 public void actionPerformed(java.awt.event.ActionEvent evt) {
266 selectButtonActionPerformed(evt);
270 org.openide.awt.Mnemonics.setLocalizedText(deselectButton,
org.openide.util.NbBundle.getMessage(PortableCaseInterestingItemsListPanel.class,
"PortableCaseInterestingItemsListPanel.deselectButton.text"));
271 deselectButton.addActionListener(
new java.awt.event.ActionListener() {
272 public void actionPerformed(java.awt.event.ActionEvent evt) {
273 deselectButtonActionPerformed(evt);
277 javax.swing.GroupLayout jPanel1Layout =
new javax.swing.GroupLayout(jPanel1);
278 jPanel1.setLayout(jPanel1Layout);
279 jPanel1Layout.setHorizontalGroup(
280 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
281 .addGroup(jPanel1Layout.createSequentialGroup()
283 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
284 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
285 .addGroup(jPanel1Layout.createSequentialGroup()
286 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
287 .addComponent(descLabel)
288 .addGroup(jPanel1Layout.createSequentialGroup()
289 .addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
290 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
291 .addComponent(deselectButton)))
292 .addGap(0, 8, Short.MAX_VALUE)))
295 jPanel1Layout.setVerticalGroup(
296 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
297 .addGroup(jPanel1Layout.createSequentialGroup()
299 .addComponent(descLabel)
300 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
301 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE)
302 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
303 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
304 .addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
305 .addComponent(deselectButton)))
308 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
309 this.setLayout(layout);
310 layout.setHorizontalGroup(
311 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
312 .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
314 layout.setVerticalGroup(
315 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
316 .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
320 private void deselectButtonActionPerformed(java.awt.event.ActionEvent evt) {
321 for (String setName : setNames) {
322 setNameSelections.put(setName, Boolean.FALSE);
325 setNamesListBox.repaint();
328 private void selectButtonActionPerformed(java.awt.event.ActionEvent evt) {
329 for (String setName : setNames) {
330 setNameSelections.put(setName, Boolean.TRUE);
333 setNamesListBox.repaint();
338 private javax.swing.JLabel descLabel;
339 private javax.swing.JButton deselectButton;
340 private javax.swing.JPanel jPanel1;
341 private javax.swing.JScrollPane jScrollPane1;
342 private javax.swing.JButton selectButton;
343 private javax.swing.JList<String> setNamesListBox;
void addListDataListener(ListDataListener l)
void process(ResultSet rs)
void removeListDataListener(ListDataListener l)
String getElementAt(int index)
Component getListCellRendererComponent(JList<?extends String > list, String value, int index, boolean isSelected, boolean cellHasFocus)
synchronized static Logger getLogger(String name)