Autopsy  4.15.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
IngestProgressSnapshotPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2014-2018 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.ingest;
20 
21 import java.text.SimpleDateFormat;
22 import java.util.ArrayList;
23 import java.util.Collections;
24 import java.util.Date;
25 import java.util.List;
26 import java.util.Map;
27 import javax.swing.JDialog;
28 import javax.swing.table.AbstractTableModel;
29 import javax.swing.table.TableColumn;
30 import org.apache.commons.lang3.time.DurationFormatUtils;
31 import org.openide.util.NbBundle;
32 
36 @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
37 class IngestProgressSnapshotPanel extends javax.swing.JPanel {
38 
39  private final JDialog parent;
40  private final IngestProgressSnapshotProvider snapshotProvider;
41  private final IngestThreadActivitySnapshotsTableModel threadActivityTableModel;
42  private final IngestJobTableModel jobTableModel;
43  private final ModuleTableModel moduleTableModel;
44 
45  IngestProgressSnapshotPanel(JDialog parent, IngestProgressSnapshotProvider snapshotProvider) {
46  this.parent = parent;
47  this.snapshotProvider = snapshotProvider;
48  threadActivityTableModel = new IngestThreadActivitySnapshotsTableModel();
49  jobTableModel = new IngestJobTableModel();
50  moduleTableModel = new ModuleTableModel();
51  initComponents();
52  customizeComponents();
53  }
54 
55  private void customizeComponents() {
56  threadActivitySnapshotsTable.setModel(threadActivityTableModel);
57  jobTable.setModel(jobTableModel);
58  moduleTable.setModel(moduleTableModel);
59 
60  int width = snapshotsScrollPane.getPreferredSize().width;
61  for (int i = 0; i < threadActivitySnapshotsTable.getColumnCount(); ++i) {
62  TableColumn column = threadActivitySnapshotsTable.getColumnModel().getColumn(i);
63  switch (i) {
64  case 0:
65  column.setPreferredWidth(((int) (width * 0.02)));
66  break;
67  case 1:
68  column.setPreferredWidth(((int) (width * 0.20)));
69  break;
70  case 2:
71  column.setPreferredWidth(((int) (width * 0.15)));
72  break;
73  case 3:
74  column.setPreferredWidth(((int) (width * 0.35)));
75  break;
76  case 4:
77  column.setPreferredWidth(((int) (width * 0.18)));
78  break;
79  case 5:
80  column.setPreferredWidth(((int) (width * 0.10)));
81  break;
82  }
83  }
84 
85  threadActivitySnapshotsTable.setFillsViewportHeight(true);
86  }
87 
88  private class IngestThreadActivitySnapshotsTableModel extends AbstractTableModel {
89 
90  private final String[] columnNames = {NbBundle.getMessage(this.getClass(),
91  "IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.threadID"),
92  NbBundle.getMessage(this.getClass(),
93  "IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.activity"),
94  NbBundle.getMessage(this.getClass(),
95  "IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.dataSource"),
96  NbBundle.getMessage(this.getClass(),
97  "IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.file"),
98  NbBundle.getMessage(this.getClass(),
99  "IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.startTime"),
100  NbBundle.getMessage(this.getClass(),
101  "IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.elapsedTime"),
102  NbBundle.getMessage(this.getClass(),
103  "IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.jobID")};
105 
107  refresh();
108  }
109 
110  private void refresh() {
111  snapshots = snapshotProvider.getIngestThreadActivitySnapshots();
112  fireTableDataChanged();
113  }
114 
115  @Override
116  public int getRowCount() {
117  return snapshots.size();
118  }
119 
120  @Override
121  public int getColumnCount() {
122  return columnNames.length;
123  }
124 
125  @Override
126  public String getColumnName(int col) {
127  return columnNames[col];
128  }
129 
130  @Override
131  public Object getValueAt(int rowIndex, int columnIndex) {
132  IngestManager.IngestThreadActivitySnapshot snapshot = snapshots.get(rowIndex);
133  Object cellValue;
134  switch (columnIndex) {
135  case 0:
136  cellValue = snapshot.getThreadId();
137  break;
138  case 1:
139  cellValue = snapshot.getActivity();
140  break;
141  case 2:
142  cellValue = snapshot.getDataSourceName();
143  break;
144  case 3:
145  cellValue = snapshot.getFileName();
146  break;
147  case 4:
148  cellValue = snapshot.getStartTime();
149  break;
150  case 5:
151  Date now = new Date();
152  long elapsedTime = now.getTime() - snapshot.getStartTime().getTime();
153  cellValue = DurationFormatUtils.formatDurationHMS(elapsedTime);
154  break;
155  case 6:
156  cellValue = snapshot.getIngestJobId();
157  break;
158  default:
159  cellValue = null;
160  break;
161  }
162  return cellValue;
163  }
164  }
165 
166  private class IngestJobTableModel extends AbstractTableModel {
167 
168  private final String[] columnNames = {NbBundle.getMessage(this.getClass(), "IngestJobTableModel.colName.jobID"),
169  NbBundle.getMessage(this.getClass(),
170  "IngestJobTableModel.colName.dataSource"),
171  NbBundle.getMessage(this.getClass(), "IngestJobTableModel.colName.start"),
172  NbBundle.getMessage(this.getClass(),
173  "IngestJobTableModel.colName.numProcessed"),
174  NbBundle.getMessage(this.getClass(),
175  "IngestJobTableModel.colName.filesPerSec"),
176  NbBundle.getMessage(this.getClass(),
177  "IngestJobTableModel.colName.inProgress"),
178  NbBundle.getMessage(this.getClass(),
179  "IngestJobTableModel.colName.filesQueued"),
180  NbBundle.getMessage(this.getClass(),
181  "IngestJobTableModel.colName.dirQueued"),
182  NbBundle.getMessage(this.getClass(),
183  "IngestJobTableModel.colName.rootQueued"),
184  NbBundle.getMessage(this.getClass(),
185  "IngestJobTableModel.colName.dsQueued")};
187 
189  refresh();
190  }
191 
192  private void refresh() {
193  jobSnapshots = snapshotProvider.getIngestJobSnapshots();
194  fireTableDataChanged();
195  }
196 
197  @Override
198  public int getRowCount() {
199  return jobSnapshots.size();
200  }
201 
202  @Override
203  public int getColumnCount() {
204  return columnNames.length;
205  }
206 
207  @Override
208  public String getColumnName(int col) {
209  return columnNames[col];
210  }
211 
212  @Override
213  public Object getValueAt(int rowIndex, int columnIndex) {
214  DataSourceIngestJob.Snapshot snapShot = jobSnapshots.get(rowIndex);
215  Object cellValue;
216  switch (columnIndex) {
217  case 0:
218  cellValue = snapShot.getJobId();
219  break;
220  case 1:
221  cellValue = snapShot.getDataSource();
222  break;
223  case 2:
224  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
225  cellValue = dateFormat.format(new Date(snapShot.getJobStartTime()));
226  break;
227  case 3:
228  cellValue = snapShot.getFilesProcessed();
229  break;
230  case 4:
231  cellValue = snapShot.getSpeed();
232  break;
233  case 5:
234  cellValue = snapShot.getRunningListSize();
235  break;
236  case 6:
237  cellValue = snapShot.getFileQueueSize();
238  break;
239  case 7:
240  cellValue = snapShot.getDirQueueSize();
241  break;
242  case 8:
243  cellValue = snapShot.getRootQueueSize();
244  break;
245  case 9:
246  cellValue = snapShot.getDsQueueSize();
247  break;
248  default:
249  cellValue = null;
250  break;
251  }
252  return cellValue;
253  }
254  }
255 
256  private class ModuleTableModel extends AbstractTableModel {
257 
258  private class ModuleStats implements Comparable<ModuleStats> {
259 
260  private final String name;
261  private final long duration;
262 
263  ModuleStats(String name, long duration) {
264  this.name = name;
265  this.duration = duration;
266  }
267 
271  protected String getName() {
272  return name;
273  }
274 
278  protected long getDuration() {
279  return duration;
280  }
281 
282  @Override
283  public int compareTo(ModuleStats o) {
284  if (duration > o.getDuration()) {
285  return -1;
286  } else if (duration == o.getDuration()) {
287  return 0;
288  } else {
289  return 1;
290  }
291  }
292 
293  }
294  private final String[] columnNames = {NbBundle.getMessage(this.getClass(), "ModuleTableModel.colName.module"),
295  NbBundle.getMessage(this.getClass(),
296  "ModuleTableModel.colName.duration")};
297  private final List<ModuleStats> moduleStats = new ArrayList<>();
298  private long totalTime;
299 
300  private ModuleTableModel() {
301  refresh();
302  }
303 
304  private void refresh() {
305  Map<String, Long> moduleStatMap = snapshotProvider.getModuleRunTimes();
306  moduleStats.clear();
307  totalTime = 0;
308  for (String k : moduleStatMap.keySet()) {
309  moduleStats.add(new ModuleStats(k, moduleStatMap.get(k)));
310  totalTime += moduleStatMap.get(k);
311  }
312  Collections.sort(moduleStats);
313  fireTableDataChanged();
314  }
315 
316  @Override
317  public int getRowCount() {
318  return moduleStats.size();
319  }
320 
321  @Override
322  public int getColumnCount() {
323  return columnNames.length;
324  }
325 
326  @Override
327  public String getColumnName(int col) {
328  return columnNames[col];
329  }
330 
331  @Override
332  public Object getValueAt(int rowIndex, int columnIndex) {
333  ModuleStats moduleStat = moduleStats.get(rowIndex);
334  Object cellValue;
335  switch (columnIndex) {
336  case 0:
337  cellValue = moduleStat.getName();
338  break;
339  case 1:
340  cellValue = DurationFormatUtils.formatDurationHMS(moduleStat.getDuration()) + " (" + (moduleStat.getDuration() * 100) / totalTime + "%)";
341  break;
342 
343  default:
344  cellValue = null;
345  break;
346  }
347  return cellValue;
348  }
349  }
350 
356  @SuppressWarnings("unchecked")
357  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
358  private void initComponents() {
359 
360  snapshotsScrollPane = new javax.swing.JScrollPane();
361  threadActivitySnapshotsTable = new javax.swing.JTable();
362  jobScrollPane = new javax.swing.JScrollPane();
363  jobTable = new javax.swing.JTable();
364  refreshButton = new javax.swing.JButton();
365  closeButton = new javax.swing.JButton();
366  moduleScrollPane = new javax.swing.JScrollPane();
367  moduleTable = new javax.swing.JTable();
368 
369  threadActivitySnapshotsTable.setModel(new javax.swing.table.DefaultTableModel(
370  new Object [][] {
371 
372  },
373  new String [] {
374 
375  }
376  ));
377  snapshotsScrollPane.setViewportView(threadActivitySnapshotsTable);
378 
379  jobTable.setModel(new javax.swing.table.DefaultTableModel(
380  new Object [][] {
381 
382  },
383  new String [] {
384 
385  }
386  ));
387  jobScrollPane.setViewportView(jobTable);
388 
389  org.openide.awt.Mnemonics.setLocalizedText(refreshButton, org.openide.util.NbBundle.getMessage(IngestProgressSnapshotPanel.class, "IngestProgressSnapshotPanel.refreshButton.text")); // NOI18N
390  refreshButton.addActionListener(new java.awt.event.ActionListener() {
391  public void actionPerformed(java.awt.event.ActionEvent evt) {
392  refreshButtonActionPerformed(evt);
393  }
394  });
395 
396  org.openide.awt.Mnemonics.setLocalizedText(closeButton, org.openide.util.NbBundle.getMessage(IngestProgressSnapshotPanel.class, "IngestProgressSnapshotPanel.closeButton.text")); // NOI18N
397  closeButton.addActionListener(new java.awt.event.ActionListener() {
398  public void actionPerformed(java.awt.event.ActionEvent evt) {
399  closeButtonActionPerformed(evt);
400  }
401  });
402 
403  moduleTable.setModel(new javax.swing.table.DefaultTableModel(
404  new Object [][] {
405 
406  },
407  new String [] {
408 
409  }
410  ));
411  moduleScrollPane.setViewportView(moduleTable);
412 
413  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
414  this.setLayout(layout);
415  layout.setHorizontalGroup(
416  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
417  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
418  .addContainerGap()
419  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
420  .addComponent(snapshotsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 881, Short.MAX_VALUE)
421  .addGroup(layout.createSequentialGroup()
422  .addGap(0, 0, Short.MAX_VALUE)
423  .addComponent(refreshButton)
424  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
425  .addComponent(closeButton))
426  .addComponent(jobScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 881, Short.MAX_VALUE)
427  .addComponent(moduleScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 881, Short.MAX_VALUE))
428  .addContainerGap())
429  );
430 
431  layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {closeButton, refreshButton});
432 
433  layout.setVerticalGroup(
434  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
435  .addGroup(layout.createSequentialGroup()
436  .addContainerGap()
437  .addComponent(snapshotsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 102, Short.MAX_VALUE)
438  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
439  .addComponent(jobScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 102, Short.MAX_VALUE)
440  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
441  .addComponent(moduleScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
442  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
443  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
444  .addComponent(refreshButton)
445  .addComponent(closeButton))
446  .addContainerGap())
447  );
448 
449  layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {closeButton, refreshButton});
450 
451  }// </editor-fold>//GEN-END:initComponents
452 
453  private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed
454  parent.dispose();
455  }//GEN-LAST:event_closeButtonActionPerformed
456 
457  private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed
458  threadActivityTableModel.refresh();
459  jobTableModel.refresh();
460  moduleTableModel.refresh();
461  }//GEN-LAST:event_refreshButtonActionPerformed
462  // Variables declaration - do not modify//GEN-BEGIN:variables
463  private javax.swing.JButton closeButton;
464  private javax.swing.JScrollPane jobScrollPane;
465  private javax.swing.JTable jobTable;
466  private javax.swing.JScrollPane moduleScrollPane;
467  private javax.swing.JTable moduleTable;
468  private javax.swing.JButton refreshButton;
469  private javax.swing.JScrollPane snapshotsScrollPane;
470  private javax.swing.JTable threadActivitySnapshotsTable;
471  // End of variables declaration//GEN-END:variables
472 }

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