Autopsy  4.17.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
ReportVisualPanel1.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2012-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.report.infrastructure;
20 
26 import java.awt.BorderLayout;
27 import java.awt.Component;
28 import java.util.ArrayList;
29 import static java.util.Collections.swap;
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
33 import java.util.logging.Level;
34 import javax.swing.JList;
35 import javax.swing.JPanel;
36 import javax.swing.JRadioButton;
37 import javax.swing.ListCellRenderer;
38 import javax.swing.ListSelectionModel;
39 import javax.swing.event.ListSelectionEvent;
40 import javax.swing.event.ListSelectionListener;
41 import org.openide.DialogDisplayer;
42 import org.openide.NotifyDescriptor;
43 import org.openide.util.NbBundle;
46 
50 @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
51 final class ReportVisualPanel1 extends JPanel implements ListSelectionListener {
52 
53  private static final Logger logger = Logger.getLogger(ReportVisualPanel1.class.getName());
54  private final ReportWizardPanel1 wizPanel;
55  private final List<ReportModule> modules = new ArrayList<>();
56  private List<GeneralReportModule> generalModules = new ArrayList<>();
57  private List<TableReportModule> tableModules = new ArrayList<>();
58  private List<FileReportModule> fileModules = new ArrayList<>();
59  private PortableCaseReportModule portableCaseModule;
60  private Map<String, ReportModuleConfig> moduleConfigs;
61  private Integer selectedIndex;
62  private final boolean displayCaseSpecificData;
63 
67  ReportVisualPanel1(ReportWizardPanel1 wizPanel, Map<String, ReportModuleConfig> moduleConfigs, boolean displayCaseSpecificData) {
68  this.displayCaseSpecificData = displayCaseSpecificData;
69  this.wizPanel = wizPanel;
70  this.moduleConfigs = moduleConfigs;
71  initComponents();
72  configurationPanel.setLayout(new BorderLayout());
73  descriptionTextPane.setEditable(false);
74  initModules();
75  }
76 
77  // Initialize the list of ReportModules
78  private void initModules() {
79 
80  tableModules = ReportModuleLoader.getTableReportModules();
81  generalModules = ReportModuleLoader.getGeneralReportModules();
82  fileModules = ReportModuleLoader.getFileReportModules();
83 
84  for (TableReportModule module : tableModules) {
85  if (!moduleIsValid(module)) {
86  popupWarning(module);
87  tableModules.remove(module);
88  }
89  }
90 
91  for (GeneralReportModule module : generalModules) {
92  if (!moduleIsValid(module)) {
93  popupWarning(module);
94  generalModules.remove(module);
95  }
96  }
97 
98  for (FileReportModule module : fileModules) {
99  if (!moduleIsValid(module)) {
100  popupWarning(module);
101  fileModules.remove(module);
102  }
103  }
104 
105  // our theory is that the report table modules are more common, so they go on top
106  modules.addAll(tableModules);
107  modules.addAll(fileModules);
108  modules.addAll(generalModules);
109 
110  portableCaseModule = new PortableCaseReportModule();
111  if (moduleIsValid(portableCaseModule)) {
112  modules.add(portableCaseModule);
113  } else {
114  popupWarning(portableCaseModule);
115  }
116 
117  // Results-HTML should always be first in the list of Report Modules.
118  int indexOfHTMLReportModule = 0;
119  for (ReportModule module : modules) {
120  if (module instanceof HTMLReport) {
121  break;
122  }
123  indexOfHTMLReportModule++;
124  }
125  swap(modules, indexOfHTMLReportModule, 0);
126 
127  // set module configurations
128  selectedIndex = 0;
129  int indx = 0;
130  for (ReportModule module : modules) {
131  ReportModuleSettings settings = null;
132  if (moduleConfigs != null) {
133  // get configuration for this module
134  ReportModuleConfig config = moduleConfigs.get(FactoryClassNameNormalizer.normalize(module.getClass().getCanonicalName()));
135  if (config != null) {
136  // there is an existing configuration for this module
137  settings = config.getModuleSettings();
138 
139  // check if this module is enabled
140  if (config.isEnabled()) {
141  // make sure this module is the selected module in the UI panel
142  selectedIndex = indx;
143  }
144  }
145  }
146  if (settings == null) {
147  // get default module configuration
148  settings = module.getDefaultConfiguration();
149  }
150  // set module configuration
151  module.setConfiguration(settings);
152  indx++;
153  }
154 
155  modulesJList.getSelectionModel().addListSelectionListener(this);
156  modulesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
157  modulesJList.setCellRenderer(new ModuleCellRenderer());
158  modulesJList.setListData(modules.toArray(new ReportModule[modules.size()]));
159  modulesJList.setSelectedIndex(selectedIndex);
160  }
161 
162  // Make sure that the report module has a valid non-null name.
163  private boolean moduleIsValid(ReportModule module) {
164  return module.getName() != null && !module.getName().isEmpty();
165  }
166 
167  private void popupWarning(ReportModule module) {
168  String moduleClassName = module.getClass().getSimpleName();
169  logger.log(Level.WARNING, "Invalid ReportModule: {0}", moduleClassName); // NON_NLS NON-NLS
170  DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(
171  NbBundle.getMessage(ReportVisualPanel1.class, "ReportVisualPanel1.invalidModuleWarning", moduleClassName),
172  NotifyDescriptor.ERROR_MESSAGE));
173  }
174 
175  @Override
176  public String getName() {
177  return NbBundle.getMessage(this.getClass(), "ReportVisualPanel1.getName.text");
178  }
179 
180  public ReportModule getSelectedModule() {
181  return modules.get(selectedIndex);
182  }
183 
189  TableReportModule getTableModule() {
190  ReportModule mod = getSelectedModule();
191  if (tableModules.contains(mod)) {
192  return (TableReportModule) mod;
193  }
194  return null;
195  }
196 
202  GeneralReportModule getGeneralModule() {
203  ReportModule mod = getSelectedModule();
204  if (generalModules.contains(mod)) {
205  return (GeneralReportModule) mod;
206  }
207  return null;
208  }
209 
215  FileReportModule getFileModule() {
216  ReportModule mod = getSelectedModule();
217  if (fileModules.contains(mod)) {
218  return (FileReportModule) mod;
219  }
220  return null;
221  }
222 
228  PortableCaseReportModule getPortableCaseModule() {
229  ReportModule mod = getSelectedModule();
230  if (portableCaseModule.equals(mod)) {
231  return (PortableCaseReportModule) mod;
232  }
233  return null;
234  }
235 
241  Map<String, ReportModuleConfig> getUpdatedModuleConfigs() {
242  moduleConfigs = new HashMap<>();
243  for (ReportModule module : modules) {
244  // get updated module configuration
245  ReportModuleSettings settings = module.getConfiguration();
246  moduleConfigs.put(FactoryClassNameNormalizer.normalize(module.getClass().getCanonicalName()), new ReportModuleConfig(module, false, settings));
247  }
248 
249  // set "enabled" flag for the selected module
250  ReportModule mod = getSelectedModule();
251  ReportModuleConfig config = moduleConfigs.get(FactoryClassNameNormalizer.normalize(mod.getClass().getCanonicalName()));
252  config.setEnabled(true);
253 
254  return moduleConfigs;
255  }
256 
257  Map<String, ReportModule> getReportModules() {
258  Map<String, ReportModule> modulesMap = new HashMap<>();
259  for (ReportModule module : modules) {
260  modulesMap.put(FactoryClassNameNormalizer.normalize(module.getClass().getCanonicalName()), module);
261  }
262  return modulesMap;
263  }
264 
270  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
271  private void initComponents() {
272 
273  reportModulesLabel = new javax.swing.JLabel();
274  configurationPanel = new javax.swing.JPanel();
275  descriptionScrollPane = new javax.swing.JScrollPane();
276  descriptionTextPane = new javax.swing.JTextPane();
277  modulesScrollPane = new javax.swing.JScrollPane();
278  modulesJList = new javax.swing.JList<>();
279 
280  setPreferredSize(new java.awt.Dimension(650, 250));
281 
282  org.openide.awt.Mnemonics.setLocalizedText(reportModulesLabel, org.openide.util.NbBundle.getMessage(ReportVisualPanel1.class, "ReportVisualPanel1.reportModulesLabel.text")); // NOI18N
283 
284  configurationPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(125, 125, 125)));
285  configurationPanel.setOpaque(false);
286 
287  javax.swing.GroupLayout configurationPanelLayout = new javax.swing.GroupLayout(configurationPanel);
288  configurationPanel.setLayout(configurationPanelLayout);
289  configurationPanelLayout.setHorizontalGroup(
290  configurationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
291  .addGap(0, 432, Short.MAX_VALUE)
292  );
293  configurationPanelLayout.setVerticalGroup(
294  configurationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
295  .addGap(0, 168, Short.MAX_VALUE)
296  );
297 
298  descriptionScrollPane.setBorder(null);
299 
300  descriptionTextPane.setBackground(new java.awt.Color(240, 240, 240));
301  descriptionTextPane.setBorder(null);
302  descriptionTextPane.setOpaque(false);
303  descriptionScrollPane.setViewportView(descriptionTextPane);
304 
305  modulesJList.setBackground(new java.awt.Color(240, 240, 240));
306  modulesJList.setModel(new javax.swing.AbstractListModel<ReportModule>() {
307  ReportModule[] modules = {};
308  public int getSize() { return modules.length; }
309  public ReportModule getElementAt(int i) { return modules[i]; }
310  });
311  modulesJList.setOpaque(false);
312  modulesScrollPane.setViewportView(modulesJList);
313 
314  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
315  this.setLayout(layout);
316  layout.setHorizontalGroup(
317  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
318  .addGroup(layout.createSequentialGroup()
319  .addContainerGap()
320  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
321  .addComponent(reportModulesLabel)
322  .addComponent(modulesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE))
323  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
324  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
325  .addComponent(configurationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
326  .addComponent(descriptionScrollPane))
327  .addContainerGap())
328  );
329  layout.setVerticalGroup(
330  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
331  .addGroup(layout.createSequentialGroup()
332  .addContainerGap()
333  .addComponent(reportModulesLabel)
334  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
335  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
336  .addGroup(layout.createSequentialGroup()
337  .addComponent(descriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
338  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
339  .addComponent(configurationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
340  .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 208, Short.MAX_VALUE))
341  .addContainerGap())
342  );
343  }// </editor-fold>//GEN-END:initComponents
344  // Variables declaration - do not modify//GEN-BEGIN:variables
345  private javax.swing.JPanel configurationPanel;
346  private javax.swing.JScrollPane descriptionScrollPane;
347  private javax.swing.JTextPane descriptionTextPane;
348  private javax.swing.JList<ReportModule> modulesJList;
349  private javax.swing.JScrollPane modulesScrollPane;
350  private javax.swing.JLabel reportModulesLabel;
351  // End of variables declaration//GEN-END:variables
352 
353  @Override
354  public void valueChanged(ListSelectionEvent e) {
355  if (e.getValueIsAdjusting()) {
356  return;
357  }
358  configurationPanel.removeAll();
359  ListSelectionModel m = (ListSelectionModel) e.getSource();
360  // single selection, so max selection index is the only one selected.
361  selectedIndex = m.getMaxSelectionIndex();
362 
363  ReportModule module = modules.get(selectedIndex);
364  JPanel panel = module.getConfigurationPanel();
365  if (panel == null) {
366  panel = new JPanel();
367  }
368 
369  descriptionTextPane.setText(module.getDescription());
370  configurationPanel.add(panel, BorderLayout.CENTER);
371  configurationPanel.revalidate();
372  configurationPanel.repaint();
373 
374  // General modules that support data source selection will be presented
375  // a data source selection panel, so they should not be finished immediately.
376  boolean generalModuleSelected = (module instanceof GeneralReportModule) && (!((GeneralReportModule)module).supportsDataSourceSelection() || !displayCaseSpecificData);
377 
378  wizPanel.setNext(!generalModuleSelected);
379  wizPanel.setFinish(generalModuleSelected);
380  }
381 
382  private class ModuleCellRenderer extends JRadioButton implements ListCellRenderer<ReportModule> {
383 
384  @Override
385  public Component getListCellRendererComponent(JList<? extends ReportModule> list, ReportModule value, int index, boolean isSelected, boolean cellHasFocus) {
386  this.setText(value.getName());
387  this.setEnabled(true);
388  this.setSelected(isSelected);
389  return this;
390  }
391 
392  }
393 }
Component getListCellRendererComponent(JList<?extends ReportModule > list, ReportModule value, int index, boolean isSelected, boolean cellHasFocus)

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