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

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.