Autopsy  4.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
FilesIdentifierIngestJobSettingsPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2014 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.modules.interestingitems;
20 
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.Observable;
24 import java.util.Observer;
25 import java.util.TreeMap;
26 import javax.swing.JTable;
27 import javax.swing.table.AbstractTableModel;
28 import javax.swing.table.TableColumn;
29 import org.openide.util.Exceptions;
30 import org.openide.util.NbBundle.Messages;
34 
38 final class FilesIdentifierIngestJobSettingsPanel extends IngestModuleIngestJobSettingsPanel implements Observer {
39  @Messages({
40  "FilesIdentifierIngestJobSettingsPanel.updateError=Error updating interesting files sets settings file.",
41  "FilesIdentifierIngestJobSettingsPanel.getError=Error getting interesting files sets from settings file."
42  })
43 
44  private final FilesSetsTableModel tableModel;
45 
46  // This map of interesting interesting files set names to files sets is used
47  // both to sort interesting files sets by name and to detect when a new
48  // files set is defined, so that the new set can be enabled by default.
49  private TreeMap<String, FilesSet> filesSetSnapshot;
50 
58  static FilesIdentifierIngestJobSettingsPanel makePanel(FilesIdentifierIngestJobSettings settings) {
59  FilesIdentifierIngestJobSettingsPanel panel = new FilesIdentifierIngestJobSettingsPanel(settings);
60 
61  // Observe the interesting item definitions manager for changes to the
62  // interesting file set definitions. This is used to keep this panel in
63  // synch with changes made using the global settings/option panel for
64  // this module.
65  InterestingItemDefsManager.getInstance().addObserver(panel);
66 
67  return panel;
68  }
69 
74  private FilesIdentifierIngestJobSettingsPanel(FilesIdentifierIngestJobSettings settings) {
75  initComponents();
76 
77  /*
78  * Make a table row object for each interesting files set, bundling the
79  * set with an enabled flag. The files sets are loaded into a tree map
80  * so they are sorted by name. The keys set also serves as a cache of
81  * set names so that new sets can be easily detected in the override of
82  * Observer.update().
83  */
84  List<FilesSetRow> filesSetRows = new ArrayList<>();
85  try {
86  this.filesSetSnapshot = new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets());
87  } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) {
88  MessageNotifyUtil.Message.error(Bundle.FilesIdentifierIngestJobSettingsPanel_getError());
89  this.filesSetSnapshot = new TreeMap<>();
90  }
91  for (FilesSet set : this.filesSetSnapshot.values()) {
92  filesSetRows.add(new FilesSetRow(set, settings.interestingFilesSetIsEnabled(set.getName())));
93  }
94 
95  // Make a table model to manage the row objects.
96  this.tableModel = new FilesSetsTableModel(filesSetRows);
97 
98  // Set up the table component that presents the table model that allows
99  // users to enable and disable interesting files set definitions for an
100  // ingest job.
101  this.filesSetTable.setModel(tableModel);
102  this.filesSetTable.setTableHeader(null);
103  this.filesSetTable.setRowSelectionAllowed(false);
104  final int width = this.filesSetScrollPane.getPreferredSize().width;
105  this.filesSetTable.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
106  TableColumn column;
107  for (int i = 0; i < this.filesSetTable.getColumnCount(); i++) {
108  column = this.filesSetTable.getColumnModel().getColumn(i);
109  if (i == 0) {
110  column.setPreferredWidth(((int) (width * 0.07)));
111  } else {
112  column.setPreferredWidth(((int) (width * 0.92)));
113  }
114  }
115  }
116 
117  @Override
118  public IngestModuleIngestJobSettings getSettings() {
119  List<String> enabledInterestingFilesSets = new ArrayList<>();
120  List<String> disabledInterestingFilesSets = new ArrayList<>();
121  for (FilesSetRow rowModel : this.tableModel.filesSetRows) {
122  if (rowModel.isEnabled()) {
123  enabledInterestingFilesSets.add(rowModel.getFilesSet().getName());
124  } else {
125  disabledInterestingFilesSets.add(rowModel.getFilesSet().getName());
126  }
127  }
128  return new FilesIdentifierIngestJobSettings(enabledInterestingFilesSets, disabledInterestingFilesSets);
129  }
130 
131  @Override
132  public void update(Observable o, Object arg
133  ) {
134  // Get the user's current enabled/disabled settings.
135  FilesIdentifierIngestJobSettings settings = (FilesIdentifierIngestJobSettings) this.getSettings();
136 
137  // Refresh the view of the interesting files set definitions.
138  List<FilesSetRow> rowModels = new ArrayList<>();
139  TreeMap<String, FilesSet> newFilesSetSnapshot;
140  try {
141  newFilesSetSnapshot = new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets());
142  } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) {
143  MessageNotifyUtil.Message.error(Bundle.FilesIdentifierIngestJobSettingsPanel_updateError());
144  return;
145  }
146  for (FilesSet set : newFilesSetSnapshot.values()) {
147  if (this.filesSetSnapshot.keySet().contains(set.getName())) {
148  // Preserve the current enabled/diabled state of the set.
149  rowModels.add(new FilesSetRow(set, settings.interestingFilesSetIsEnabled(set.getName())));
150  } else {
151  // New sets are enabled by default.
152  rowModels.add(new FilesSetRow(set, true));
153  }
154  }
155  this.tableModel.resetTableData(rowModels);
156 
157  // Cache the snapshot so it will be avaialble for the next update.
158  this.filesSetSnapshot = newFilesSetSnapshot;
159  }
160 
165  private final static class FilesSetsTableModel extends AbstractTableModel {
166 
167  private List<FilesSetRow> filesSetRows;
168 
177  FilesSetsTableModel(List<FilesSetRow> filesSetRows) {
178  this.filesSetRows = filesSetRows;
179  }
180 
187  void resetTableData(List<FilesSetRow> filesSetRows) {
188  this.filesSetRows = filesSetRows;
189  this.fireTableDataChanged();
190  }
191 
192  @Override
193  public int getRowCount() {
194  return this.filesSetRows.size();
195  }
196 
197  @Override
198  public int getColumnCount() {
199  return 2;
200  }
201 
202  @Override
203  public Object getValueAt(int rowIndex, int columnIndex) {
204  if (columnIndex == 0) {
205  return this.filesSetRows.get(rowIndex).isEnabled();
206  } else {
207  return this.filesSetRows.get(rowIndex).getFilesSet().getName();
208  }
209  }
210 
211  @Override
212  public boolean isCellEditable(int rowIndex, int columnIndex) {
213  return (columnIndex == 0);
214  }
215 
216  @Override
217  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
218  if (columnIndex == 0) {
219  this.filesSetRows.get(rowIndex).setEnabled((Boolean) aValue);
220  }
221  }
222 
223  @Override
224  public Class<?> getColumnClass(int c) {
225  return getValueAt(0, c).getClass();
226  }
227  }
228 
232  private final static class FilesSetRow {
233 
234  private final FilesSet set;
235  private boolean enabled;
236 
237  FilesSetRow(FilesSet set, boolean enabled) {
238  this.set = set;
239  this.enabled = enabled;
240  }
241 
242  FilesSet getFilesSet() {
243  return this.set;
244  }
245 
246  boolean isEnabled() {
247  return this.enabled;
248  }
249 
250  void setEnabled(boolean enabled) {
251  this.enabled = enabled;
252  }
253  }
254 
260  @SuppressWarnings("unchecked")
261  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
262  private void initComponents() {
263 
264  filesSetScrollPane = new javax.swing.JScrollPane();
265  filesSetTable = new javax.swing.JTable();
266 
267  setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(FilesIdentifierIngestJobSettingsPanel.class, "FilesIdentifierIngestJobSettingsPanel.border.title"))); // NOI18N
268 
269  filesSetTable.setBackground(new java.awt.Color(240, 240, 240));
270  filesSetTable.setModel(new javax.swing.table.DefaultTableModel(
271  new Object [][] {
272 
273  },
274  new String [] {
275 
276  }
277  ));
278  filesSetTable.setShowHorizontalLines(false);
279  filesSetTable.setShowVerticalLines(false);
280  filesSetScrollPane.setViewportView(filesSetTable);
281 
282  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
283  this.setLayout(layout);
284  layout.setHorizontalGroup(
285  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
286  .addGroup(layout.createSequentialGroup()
287  .addContainerGap()
288  .addComponent(filesSetScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
289  .addContainerGap())
290  );
291  layout.setVerticalGroup(
292  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
293  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
294  .addContainerGap()
295  .addComponent(filesSetScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 165, Short.MAX_VALUE)
296  .addContainerGap())
297  );
298  }// </editor-fold>//GEN-END:initComponents
299 
300  // Variables declaration - do not modify//GEN-BEGIN:variables
301  private javax.swing.JScrollPane filesSetScrollPane;
302  private javax.swing.JTable filesSetTable;
303  // End of variables declaration//GEN-END:variables
304 }

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