Autopsy  4.0
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 
120  @Override
121  public IngestModuleIngestJobSettings getSettings() {
122  List<String> enabledInterestingFilesSets = new ArrayList<>();
123  List<String> disabledInterestingFilesSets = new ArrayList<>();
124  for (FilesSetRow rowModel : this.tableModel.filesSetRows) {
125  if (rowModel.isEnabled()) {
126  enabledInterestingFilesSets.add(rowModel.getFilesSet().getName());
127  } else {
128  disabledInterestingFilesSets.add(rowModel.getFilesSet().getName());
129  }
130  }
131  return new FilesIdentifierIngestJobSettings(enabledInterestingFilesSets, disabledInterestingFilesSets);
132  }
133 
137  @Override
138  public void update(Observable o, Object arg
139  ) {
140  // Get the user's current enabled/disabled settings.
141  FilesIdentifierIngestJobSettings settings = (FilesIdentifierIngestJobSettings) this.getSettings();
142 
143  // Refresh the view of the interesting files set definitions.
144  List<FilesSetRow> rowModels = new ArrayList<>();
145  TreeMap<String, FilesSet> newFilesSetSnapshot;
146  try {
147  newFilesSetSnapshot = new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets());
148  } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) {
149  MessageNotifyUtil.Message.error(Bundle.FilesIdentifierIngestJobSettingsPanel_updateError());
150  return;
151  }
152  for (FilesSet set : newFilesSetSnapshot.values()) {
153  if (this.filesSetSnapshot.keySet().contains(set.getName())) {
154  // Preserve the current enabled/diabled state of the set.
155  rowModels.add(new FilesSetRow(set, settings.interestingFilesSetIsEnabled(set.getName())));
156  } else {
157  // New sets are enabled by default.
158  rowModels.add(new FilesSetRow(set, true));
159  }
160  }
161  this.tableModel.resetTableData(rowModels);
162 
163  // Cache the snapshot so it will be avaialble for the next update.
164  this.filesSetSnapshot = newFilesSetSnapshot;
165  }
166 
171  private final static class FilesSetsTableModel extends AbstractTableModel {
172 
173  private List<FilesSetRow> filesSetRows;
174 
183  FilesSetsTableModel(List<FilesSetRow> filesSetRows) {
184  this.filesSetRows = filesSetRows;
185  }
186 
193  void resetTableData(List<FilesSetRow> filesSetRows) {
194  this.filesSetRows = filesSetRows;
195  this.fireTableDataChanged();
196  }
197 
201  @Override
202  public int getRowCount() {
203  return this.filesSetRows.size();
204  }
205 
209  @Override
210  public int getColumnCount() {
211  return 2;
212  }
213 
217  @Override
218  public Object getValueAt(int rowIndex, int columnIndex) {
219  if (columnIndex == 0) {
220  return this.filesSetRows.get(rowIndex).isEnabled();
221  } else {
222  return this.filesSetRows.get(rowIndex).getFilesSet().getName();
223  }
224  }
225 
229  @Override
230  public boolean isCellEditable(int rowIndex, int columnIndex) {
231  return (columnIndex == 0);
232  }
233 
237  @Override
238  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
239  if (columnIndex == 0) {
240  this.filesSetRows.get(rowIndex).setEnabled((Boolean) aValue);
241  }
242  }
243 
247  @Override
248  public Class<?> getColumnClass(int c) {
249  return getValueAt(0, c).getClass();
250  }
251  }
252 
256  private final static class FilesSetRow {
257 
258  private final FilesSet set;
259  private boolean enabled;
260 
261  FilesSetRow(FilesSet set, boolean enabled) {
262  this.set = set;
263  this.enabled = enabled;
264  }
265 
266  FilesSet getFilesSet() {
267  return this.set;
268  }
269 
270  boolean isEnabled() {
271  return this.enabled;
272  }
273 
274  void setEnabled(boolean enabled) {
275  this.enabled = enabled;
276  }
277  }
278 
284  @SuppressWarnings("unchecked")
285  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
286  private void initComponents() {
287 
288  filesSetScrollPane = new javax.swing.JScrollPane();
289  filesSetTable = new javax.swing.JTable();
290 
291  setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(FilesIdentifierIngestJobSettingsPanel.class, "FilesIdentifierIngestJobSettingsPanel.border.title"))); // NOI18N
292 
293  filesSetTable.setBackground(new java.awt.Color(240, 240, 240));
294  filesSetTable.setModel(new javax.swing.table.DefaultTableModel(
295  new Object [][] {
296 
297  },
298  new String [] {
299 
300  }
301  ));
302  filesSetTable.setShowHorizontalLines(false);
303  filesSetTable.setShowVerticalLines(false);
304  filesSetScrollPane.setViewportView(filesSetTable);
305 
306  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
307  this.setLayout(layout);
308  layout.setHorizontalGroup(
309  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
310  .addGroup(layout.createSequentialGroup()
311  .addContainerGap()
312  .addComponent(filesSetScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
313  .addContainerGap())
314  );
315  layout.setVerticalGroup(
316  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
317  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
318  .addContainerGap()
319  .addComponent(filesSetScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 165, Short.MAX_VALUE)
320  .addContainerGap())
321  );
322  }// </editor-fold>//GEN-END:initComponents
323 
324  // Variables declaration - do not modify//GEN-BEGIN:variables
325  private javax.swing.JScrollPane filesSetScrollPane;
326  private javax.swing.JTable filesSetTable;
327  // End of variables declaration//GEN-END:variables
328 }

Copyright © 2012-2015 Basis Technology. Generated on: Wed Apr 6 2016
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.