From 9ada09672a6fff6e3cdcb049c82dad396519b271 Mon Sep 17 00:00:00 2001 From: esaunders Date: Mon, 30 Sep 2019 10:29:30 -0400 Subject: [PATCH 01/37] Force LF line endings for shell scripts. --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 6cd046f17b..cd5271c982 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,7 @@ *.java text diff=java *.txt text -*.sh text +*.sh eol=lf *.mf text *.xml text *.form text From f7c50bc3822da5ab95e33513172d43496977e617 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 2 Oct 2019 15:49:33 -0400 Subject: [PATCH 02/37] inital pass cvt redesign --- .../communications/AccountsBrowser.form | 18 +- .../communications/AccountsBrowser.java | 19 +- .../autopsy/communications/Bundle.properties | 2 + .../communications/Bundle.properties-MERGED | 2 + .../communications/CVTTopComponent.form | 58 +- .../communications/CVTTopComponent.java | 71 ++- .../communications/VisualizationPanel.form | 586 ++++++++---------- .../communications/VisualizationPanel.java | 263 ++++---- .../autopsy/corecomponents/WrapLayout.java | 2 +- 9 files changed, 489 insertions(+), 532 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.form b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.form index 1c1bc033f5..e1375f2d5a 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.form +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.form @@ -16,28 +16,14 @@ - - - - + - - - - - - - - - - - - + diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java index 0cad213cd4..acabf3889c 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java @@ -65,7 +65,7 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro private final ExplorerManager accountsTableEM = new ExplorerManager(); - final RelationshipBrowser relationshipBrowser; + final private RelationshipBrowser relationshipBrowser; /* * This lookup proxies the selection lookup of both he accounts table and @@ -73,12 +73,10 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro */ private final ProxyLookup proxyLookup; - public AccountsBrowser() { + public AccountsBrowser(RelationshipBrowser relationshipBrowser) { + this.relationshipBrowser = relationshipBrowser; initComponents(); - jSplitPane1.setResizeWeight(0.5); - jSplitPane1.setDividerLocation(0.75); - outline = outlineView.getOutline(); outlineView.setPropertyColumns( "device", Bundle.AccountNode_device(), @@ -90,9 +88,6 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.AccountNode_accountName()); outline.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); outline.setColumnSorted(3, false, 1); //it would be nice if the column index wasn't hardcoded - - relationshipBrowser = new RelationshipBrowser(); - jSplitPane1.setRightComponent(relationshipBrowser); accountsTableEM.addPropertyChangeListener(evt -> { if (ExplorerManager.PROP_ROOT_CONTEXT.equals(evt.getPropertyName())) { @@ -174,20 +169,14 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro // //GEN-BEGIN:initComponents private void initComponents() { - jSplitPane1 = new javax.swing.JSplitPane(); outlineView = new org.openide.explorer.view.OutlineView(); setLayout(new java.awt.BorderLayout()); - - jSplitPane1.setDividerLocation(500); - jSplitPane1.setLeftComponent(outlineView); - - add(jSplitPane1, java.awt.BorderLayout.CENTER); + add(outlineView, java.awt.BorderLayout.CENTER); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JSplitPane jSplitPane1; private org.openide.explorer.view.OutlineView outlineView; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 1b2dd9ae37..747f0c82f7 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -49,3 +49,5 @@ VisualizationPanel.forwardButton.text= VisualizationPanel.zoomPercentLabel.text=100% VisualizationPanel.zoomLabel.text=Zoom: VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report. +CVTTopComponent.filtersPane.TabConstraints.tabTitle=Filters +CVTTopComponent.filterTabPanel.TabConstraints.tabTitle=Filters diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index 2ad2305d38..65c130bd6e 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -92,6 +92,8 @@ VisualizationPanel.forwardButton.text= VisualizationPanel.zoomPercentLabel.text=100% VisualizationPanel.zoomLabel.text=Zoom: VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report. +CVTTopComponent.filtersPane.TabConstraints.tabTitle=Filters +CVTTopComponent.filterTabPanel.TabConstraints.tabTitle=Filters VisualizationPanel_action_dialogs_title=Communications VisualizationPanel_action_name_text=Snapshot Report VisualizationPanel_module_name=Communications diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form index a7bc5379c3..c11d0c335c 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.form @@ -14,24 +14,52 @@ - + - + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - @@ -45,13 +73,16 @@ - + + + + @@ -66,6 +97,9 @@ + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java index 2a5dd8c0d1..db62579ad5 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java @@ -19,14 +19,15 @@ package org.sleuthkit.autopsy.communications; import com.google.common.eventbus.Subscribe; +import java.awt.BorderLayout; import java.awt.Component; import java.awt.Font; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.util.List; import java.util.stream.Collectors; import javax.swing.ImageIcon; +import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import org.openide.util.Lookup; @@ -35,6 +36,7 @@ import org.openide.windows.Mode; import org.openide.windows.RetainLocation; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.communications.relationships.RelationshipBrowser; import org.sleuthkit.autopsy.coreutils.ThreadConfined; /** @@ -48,10 +50,17 @@ import org.sleuthkit.autopsy.coreutils.ThreadConfined; public final class CVTTopComponent extends TopComponent { private static final long serialVersionUID = 1L; + private boolean filtersVisible = true; + private final RelationshipBrowser relationshipBrowser; @ThreadConfined(type = ThreadConfined.ThreadType.AWT) public CVTTopComponent() { + relationshipBrowser = new RelationshipBrowser(); initComponents(); + + splitPane.setRightComponent(relationshipBrowser); + splitPane.setDividerLocation(0.25); + setName(Bundle.CVTTopComponent_name()); /* @@ -79,9 +88,6 @@ public final class CVTTopComponent extends TopComponent { CVTEvents.getCVTEventBus().register(vizPanel); CVTEvents.getCVTEventBus().register(accountsBrowser); CVTEvents.getCVTEventBus().register(filtersPane); - - mainSplitPane.setResizeWeight(0.5); - mainSplitPane.setDividerLocation(0.25); } @Subscribe @@ -96,38 +102,65 @@ public final class CVTTopComponent extends TopComponent { */ // //GEN-BEGIN:initComponents private void initComponents() { - GridBagConstraints gridBagConstraints; - mainSplitPane = new JSplitPane(); + filterTabPane = new JTabbedPane(); + filterTabPanel = new JPanel(); filtersPane = new FiltersPanel(); + splitPane = new JSplitPane(); browseVisualizeTabPane = new JTabbedPane(); - accountsBrowser = new AccountsBrowser(); - vizPanel = new VisualizationPanel(); + accountsBrowser = new AccountsBrowser(relationshipBrowser); + vizPanel = new VisualizationPanel(relationshipBrowser); - setLayout(new GridBagLayout()); + setLayout(new BorderLayout()); - mainSplitPane.setLeftComponent(filtersPane); + filterTabPane.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent evt) { + filterTabPaneMouseClicked(evt); + } + }); + + filterTabPanel.add(filtersPane); + + filterTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.filterTabPanel.TabConstraints.tabTitle"), filterTabPanel); // NOI18N + + add(filterTabPane, BorderLayout.WEST); + + splitPane.setDividerLocation(1); + splitPane.setResizeWeight(0.25); browseVisualizeTabPane.setFont(new Font("Tahoma", 0, 18)); // NOI18N browseVisualizeTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.accountsBrowser.TabConstraints.tabTitle_1"), new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/table.png")), accountsBrowser); // NOI18N browseVisualizeTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.vizPanel.TabConstraints.tabTitle_1"), new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/emblem-web.png")), vizPanel); // NOI18N - mainSplitPane.setRightComponent(browseVisualizeTabPane); + splitPane.setLeftComponent(browseVisualizeTabPane); browseVisualizeTabPane.getAccessibleContext().setAccessibleName(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.browseVisualizeTabPane.AccessibleContext.accessibleName")); // NOI18N - gridBagConstraints = new GridBagConstraints(); - gridBagConstraints.fill = GridBagConstraints.BOTH; - gridBagConstraints.weightx = 1.0; - gridBagConstraints.weighty = 1.0; - add(mainSplitPane, gridBagConstraints); + add(splitPane, BorderLayout.CENTER); }// //GEN-END:initComponents + private void filterTabPaneMouseClicked(MouseEvent evt) {//GEN-FIRST:event_filterTabPaneMouseClicked + int index = filterTabPane.indexAtLocation(evt.getX(), evt.getY()); + if(index != -1) { + if(filtersVisible) { + filterTabPanel.removeAll(); + filterTabPanel.revalidate(); + filtersVisible = false; + } else { + filterTabPanel.add(filtersPane); + filterTabPanel.revalidate(); + filtersVisible = true; + } + } + }//GEN-LAST:event_filterTabPaneMouseClicked + // Variables declaration - do not modify//GEN-BEGIN:variables private AccountsBrowser accountsBrowser; private JTabbedPane browseVisualizeTabPane; + private JTabbedPane filterTabPane; + private JPanel filterTabPanel; private FiltersPanel filtersPane; - private JSplitPane mainSplitPane; + private JSplitPane splitPane; private VisualizationPanel vizPanel; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form index e85901a1ba..4d8b4860dc 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form @@ -1,6 +1,10 @@
+ + + + @@ -11,348 +15,282 @@ - + - - - - - + - + - + - - + + - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index 8a5404bb1a..4d689f0642 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -43,9 +43,12 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Desktop; import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -61,7 +64,6 @@ import java.nio.file.Paths; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Arrays; -import java.util.Collections; import java.util.Date; import java.util.EnumSet; import java.util.HashMap; @@ -86,7 +88,7 @@ import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; -import javax.swing.JSplitPane; +import javax.swing.JSeparator; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JToolBar; @@ -96,7 +98,6 @@ import javax.swing.SwingWorker; import org.apache.commons.lang3.StringUtils; import org.controlsfx.control.Notifications; import org.jdesktop.layout.GroupLayout; -import org.jdesktop.layout.LayoutStyle; import org.openide.util.NbBundle; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; @@ -112,6 +113,7 @@ import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsFilter; import org.sleuthkit.datamodel.CommunicationsManager; import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.autopsy.corecomponents.WrapLayout; /** * A panel that goes in the Visualize tab of the Communications Visualization * Tool. Hosts an JGraphX mxGraphComponent that implements the communications @@ -160,7 +162,8 @@ final public class VisualizationPanel extends JPanel { private final StateManager stateManager; @NbBundle.Messages("VisalizationPanel.paintingError=Problem painting visualization.") - public VisualizationPanel() { + public VisualizationPanel(RelationshipBrowser relationshipBrowser) { + this.relationshipBrowser = relationshipBrowser; initComponents(); //initialize invisible JFXPanel that is used to show JFXNotifications over this window. notificationsJFXPanel.setScene(new Scene(new Pane())); @@ -220,9 +223,6 @@ final public class VisualizationPanel extends JPanel { final GraphMouseListener graphMouseListener = new GraphMouseListener(); graphComponent.getGraphControl().addMouseWheelListener(graphMouseListener); graphComponent.getGraphControl().addMouseListener(graphMouseListener); - - relationshipBrowser = new RelationshipBrowser(); - splitPane.setRightComponent(relationshipBrowser); //feed selection to explorermanager graph.getSelectionModel().addListener(mxEvent.CHANGE, new SelectionListener()); @@ -247,6 +247,8 @@ final public class VisualizationPanel extends JPanel { stateManager = new StateManager(pinnedAccountModel); setStateButtonsEnabled(); + + toolbar.setLayout(new WrapLayout(FlowLayout.LEFT)); } @Subscribe @@ -373,32 +375,29 @@ final public class VisualizationPanel extends JPanel { // //GEN-BEGIN:initComponents private void initComponents() { - splitPane = new JSplitPane(); + jSeparator4 = new JSeparator(); borderLayoutPanel = new JPanel(); placeHolderPanel = new JPanel(); jTextArea1 = new JTextArea(); - toolbar = new JPanel(); - fastOrganicLayoutButton = new JButton(); - zoomOutButton = new JButton(); - zoomInButton = new JButton(); - zoomActualButton = new JButton(); - fitZoomButton = new JButton(); - zoomLabel = new JLabel(); - zoomPercentLabel = new JLabel(); - clearVizButton = new JButton(); - jSeparator2 = new JToolBar.Separator(); + notificationsJFXPanel = new JFXPanel(); + toolbar = new JToolBar(); backButton = new JButton(); forwardButton = new JButton(); - snapshotButton = new JButton(); jSeparator3 = new JToolBar.Separator(); - jSeparator4 = new JToolBar.Separator(); - notificationsJFXPanel = new JFXPanel(); + clearVizButton = new JButton(); + fastOrganicLayoutButton = new JButton(); + jSeparator2 = new JToolBar.Separator(); + zoomLabel = new JLabel(); + zoomPercentLabel = new JLabel(); + zoomOutButton = new JButton(); + fitZoomButton = new JButton(); + zoomActualButton = new JButton(); + zoomInButton = new JButton(); + jSeparator1 = new JToolBar.Separator(); + snapshotButton = new JButton(); setLayout(new BorderLayout()); - splitPane.setDividerLocation(800); - splitPane.setResizeWeight(0.5); - borderLayoutPanel.setLayout(new BorderLayout()); jTextArea1.setBackground(new Color(240, 240, 240)); @@ -411,9 +410,9 @@ final public class VisualizationPanel extends JPanel { placeHolderPanel.setLayout(placeHolderPanelLayout); placeHolderPanelLayout.setHorizontalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING) .add(placeHolderPanelLayout.createSequentialGroup() - .addContainerGap(250, Short.MAX_VALUE) + .addContainerGap(315, Short.MAX_VALUE) .add(jTextArea1, GroupLayout.PREFERRED_SIZE, 424, GroupLayout.PREFERRED_SIZE) - .addContainerGap(423, Short.MAX_VALUE)) + .addContainerGap(482, Short.MAX_VALUE)) ); placeHolderPanelLayout.setVerticalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING) .add(placeHolderPanelLayout.createSequentialGroup() @@ -423,12 +422,72 @@ final public class VisualizationPanel extends JPanel { ); borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER); + borderLayoutPanel.add(notificationsJFXPanel, BorderLayout.PAGE_END); + + add(borderLayoutPanel, BorderLayout.CENTER); + + toolbar.setRollover(true); + + backButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N + backButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N + backButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N + backButton.setFocusable(false); + backButton.setHorizontalTextPosition(SwingConstants.CENTER); + backButton.setVerticalTextPosition(SwingConstants.BOTTOM); + backButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + backButtonActionPerformed(evt); + } + }); + toolbar.add(backButton); + + forwardButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N + forwardButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N + forwardButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N + forwardButton.setFocusable(false); + forwardButton.setHorizontalTextPosition(SwingConstants.CENTER); + forwardButton.setVerticalTextPosition(SwingConstants.BOTTOM); + forwardButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + forwardButtonActionPerformed(evt); + } + }); + toolbar.add(forwardButton); + toolbar.add(jSeparator3); + + clearVizButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N + clearVizButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N + clearVizButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N + clearVizButton.setActionCommand(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N + clearVizButton.setFocusable(false); + clearVizButton.setHorizontalTextPosition(SwingConstants.CENTER); + clearVizButton.setVerticalTextPosition(SwingConstants.BOTTOM); + clearVizButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + clearVizButtonActionPerformed(evt); + } + }); + toolbar.add(clearVizButton); fastOrganicLayoutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N fastOrganicLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N fastOrganicLayoutButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.toolTipText")); // NOI18N fastOrganicLayoutButton.setFocusable(false); + fastOrganicLayoutButton.setHorizontalTextPosition(SwingConstants.CENTER); fastOrganicLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM); + fastOrganicLayoutButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + fastOrganicLayoutButtonActionPerformed(evt); + } + }); + toolbar.add(fastOrganicLayoutButton); + toolbar.add(jSeparator2); + + zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N + toolbar.add(zoomLabel); + + zoomPercentLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomPercentLabel.text")); // NOI18N + toolbar.add(zoomPercentLabel); zoomOutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"))); // NOI18N zoomOutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.text")); // NOI18N @@ -441,30 +500,7 @@ final public class VisualizationPanel extends JPanel { zoomOutButtonActionPerformed(evt); } }); - - zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N - zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N - zoomInButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N - zoomInButton.setFocusable(false); - zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER); - zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM); - zoomInButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - zoomInButtonActionPerformed(evt); - } - }); - - zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N - zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N - zoomActualButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N - zoomActualButton.setFocusable(false); - zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER); - zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM); - zoomActualButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - zoomActualButtonActionPerformed(evt); - } - }); + toolbar.add(zoomOutButton); fitZoomButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"))); // NOI18N fitZoomButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N @@ -477,116 +513,49 @@ final public class VisualizationPanel extends JPanel { fitZoomButtonActionPerformed(evt); } }); + toolbar.add(fitZoomButton); - zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N - - zoomPercentLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomPercentLabel.text")); // NOI18N - - clearVizButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N - clearVizButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N - clearVizButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N - clearVizButton.setActionCommand(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N - clearVizButton.addActionListener(new ActionListener() { + zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N + zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N + zoomActualButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N + zoomActualButton.setFocusable(false); + zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER); + zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM); + zoomActualButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { - clearVizButtonActionPerformed(evt); + zoomActualButtonActionPerformed(evt); } }); + toolbar.add(zoomActualButton); - jSeparator2.setOrientation(SwingConstants.VERTICAL); - - backButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N - backButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N - backButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N - backButton.addActionListener(new ActionListener() { + zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N + zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N + zoomInButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N + zoomInButton.setFocusable(false); + zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER); + zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM); + zoomInButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { - backButtonActionPerformed(evt); - } - }); - - forwardButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N - forwardButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N - forwardButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N - forwardButton.setHorizontalTextPosition(SwingConstants.LEADING); - forwardButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - forwardButtonActionPerformed(evt); + zoomInButtonActionPerformed(evt); } }); + toolbar.add(zoomInButton); + toolbar.add(jSeparator1); snapshotButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/report/images/image.png"))); // NOI18N snapshotButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.text_1")); // NOI18N snapshotButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.toolTipText")); // NOI18N + snapshotButton.setFocusable(false); + snapshotButton.setHorizontalTextPosition(SwingConstants.CENTER); + snapshotButton.setVerticalTextPosition(SwingConstants.BOTTOM); snapshotButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { snapshotButtonActionPerformed(evt); } }); + toolbar.add(snapshotButton); - jSeparator3.setOrientation(SwingConstants.VERTICAL); - - jSeparator4.setOrientation(SwingConstants.VERTICAL); - - GroupLayout toolbarLayout = new GroupLayout(toolbar); - toolbar.setLayout(toolbarLayout); - toolbarLayout.setHorizontalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING) - .add(toolbarLayout.createSequentialGroup() - .addContainerGap() - .add(backButton) - .addPreferredGap(LayoutStyle.RELATED) - .add(forwardButton) - .addPreferredGap(LayoutStyle.RELATED) - .add(jSeparator4, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(fastOrganicLayoutButton) - .addPreferredGap(LayoutStyle.RELATED) - .add(clearVizButton) - .addPreferredGap(LayoutStyle.RELATED) - .add(jSeparator2, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(zoomLabel) - .addPreferredGap(LayoutStyle.RELATED) - .add(zoomPercentLabel) - .addPreferredGap(LayoutStyle.RELATED) - .add(zoomOutButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(zoomInButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(zoomActualButton, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(fitZoomButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(jSeparator3, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(snapshotButton) - .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - toolbarLayout.setVerticalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING) - .add(toolbarLayout.createSequentialGroup() - .add(3, 3, 3) - .add(toolbarLayout.createParallelGroup(GroupLayout.CENTER) - .add(fastOrganicLayoutButton) - .add(zoomOutButton) - .add(zoomInButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(zoomActualButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(fitZoomButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(zoomLabel) - .add(zoomPercentLabel) - .add(clearVizButton) - .add(jSeparator2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(backButton) - .add(forwardButton) - .add(snapshotButton) - .add(jSeparator3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(jSeparator4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .add(3, 3, 3)) - ); - - borderLayoutPanel.add(toolbar, BorderLayout.PAGE_START); - borderLayoutPanel.add(notificationsJFXPanel, BorderLayout.PAGE_END); - - splitPane.setLeftComponent(borderLayoutPanel); - - add(splitPane, BorderLayout.CENTER); + add(toolbar, BorderLayout.NORTH); }// //GEN-END:initComponents private void fitZoomButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fitZoomButtonActionPerformed @@ -726,6 +695,10 @@ final public class VisualizationPanel extends JPanel { } }//GEN-LAST:event_snapshotButtonActionPerformed + private void fastOrganicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fastOrganicLayoutButtonActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_fastOrganicLayoutButtonActionPerformed + private void fitGraph() { graphComponent.zoomTo(1, true); mxPoint translate = graph.getView().getTranslate(); @@ -883,15 +856,15 @@ final public class VisualizationPanel extends JPanel { private JButton fastOrganicLayoutButton; private JButton fitZoomButton; private JButton forwardButton; + private JToolBar.Separator jSeparator1; private JToolBar.Separator jSeparator2; private JToolBar.Separator jSeparator3; - private JToolBar.Separator jSeparator4; + private JSeparator jSeparator4; private JTextArea jTextArea1; private JFXPanel notificationsJFXPanel; private JPanel placeHolderPanel; private JButton snapshotButton; - private JSplitPane splitPane; - private JPanel toolbar; + private JToolBar toolbar; private JButton zoomActualButton; private JButton zoomInButton; private JLabel zoomLabel; diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java b/Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java index be35ea0581..152d0e8647 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java @@ -32,7 +32,7 @@ import javax.swing.SwingUtilities; * Originally written by Rob Camick * https://tips4java.wordpress.com/2008/11/06/wrap-layout/ */ -class WrapLayout extends FlowLayout { +public class WrapLayout extends FlowLayout { /** * Constructs a new WrapLayout with a left alignment and a From ae90dbd2644f1dc62315aa6e8907ea50cfa96699 Mon Sep 17 00:00:00 2001 From: Joe Ho Date: Wed, 2 Oct 2019 20:00:04 -0400 Subject: [PATCH 03/37] Update ConfigVisualPanel1.java --- .../autopsy/logicalimager/configuration/ConfigVisualPanel1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/logicalimager/configuration/ConfigVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/logicalimager/configuration/ConfigVisualPanel1.java index f6336771bd..33272e0f6c 100644 --- a/Core/src/org/sleuthkit/autopsy/logicalimager/configuration/ConfigVisualPanel1.java +++ b/Core/src/org/sleuthkit/autopsy/logicalimager/configuration/ConfigVisualPanel1.java @@ -70,8 +70,8 @@ final class ConfigVisualPanel1 extends JPanel { ConfigVisualPanel1() { initComponents(); configFileTextField.getDocument().addDocumentListener(new MyDocumentListener(this)); - refreshDriveList(); SwingUtilities.invokeLater(() -> { + refreshDriveList(); updateControls(); }); } From fe5f587198cd9f2cee9f46c7e09fbe953cf642ff Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 3 Oct 2019 15:12:21 -0400 Subject: [PATCH 04/37] Cleaned up changes --- .../communications/CVTTopComponent.java | 40 ++++++++++++------ .../autopsy/communications/FiltersPanel.form | 11 ++--- .../autopsy/communications/FiltersPanel.java | 10 +++-- .../communications/VisualizationPanel.form | 6 +-- .../communications/VisualizationPanel.java | 8 ++-- .../communications/images/arrow-180.png | Bin 0 -> 1022 bytes .../autopsy/communications/images/arrow.png | Bin 0 -> 1062 bytes .../DataResultViewerThumbnail.java | 1 + .../WrapLayout.java | 2 +- 9 files changed, 48 insertions(+), 30 deletions(-) create mode 100755 Core/src/org/sleuthkit/autopsy/communications/images/arrow-180.png create mode 100755 Core/src/org/sleuthkit/autopsy/communications/images/arrow.png rename Core/src/org/sleuthkit/autopsy/{corecomponents => uicomponents}/WrapLayout.java (99%) mode change 100644 => 100755 diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java index db62579ad5..69ea42c8aa 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java @@ -24,6 +24,7 @@ import java.awt.Component; import java.awt.Font; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.HashSet; import java.util.List; import java.util.stream.Collectors; import javax.swing.ImageIcon; @@ -37,7 +38,9 @@ import org.openide.windows.RetainLocation; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.communications.relationships.RelationshipBrowser; +import org.sleuthkit.autopsy.communications.relationships.SelectionInfo; import org.sleuthkit.autopsy.coreutils.ThreadConfined; +import org.sleuthkit.datamodel.CommunicationsFilter; /** * Top component which displays the Communications Visualization Tool. @@ -51,11 +54,11 @@ public final class CVTTopComponent extends TopComponent { private static final long serialVersionUID = 1L; private boolean filtersVisible = true; - private final RelationshipBrowser relationshipBrowser; + private final RelationshipBrowser relationshipBrowser = new RelationshipBrowser(); + private CommunicationsFilter currentFilter; @ThreadConfined(type = ThreadConfined.ThreadType.AWT) public CVTTopComponent() { - relationshipBrowser = new RelationshipBrowser(); initComponents(); splitPane.setRightComponent(relationshipBrowser); @@ -77,6 +80,8 @@ public final class CVTTopComponent extends TopComponent { Lookup lookup = ((Lookup.Provider)selectedComponent).getLookup(); proxyLookup.setNewLookups(lookup); } + + relationshipBrowser.setSelectionInfo(new SelectionInfo(new HashSet<>(), new HashSet<>(), currentFilter)); }); @@ -88,12 +93,20 @@ public final class CVTTopComponent extends TopComponent { CVTEvents.getCVTEventBus().register(vizPanel); CVTEvents.getCVTEventBus().register(accountsBrowser); CVTEvents.getCVTEventBus().register(filtersPane); + + filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-180.png"))); + filterTabbedPane.setTitleAt(0, ""); } @Subscribe void pinAccount(CVTEvents.PinAccountsEvent pinEvent) { browseVisualizeTabPane.setSelectedIndex(1); } + + @Subscribe + void handle(final CVTEvents.FilterChangeEvent filterChangeEvent) { + currentFilter = filterChangeEvent.getNewFilter(); + } /** * This method is called from within the constructor to initialize the form. @@ -103,7 +116,7 @@ public final class CVTTopComponent extends TopComponent { // //GEN-BEGIN:initComponents private void initComponents() { - filterTabPane = new JTabbedPane(); + filterTabbedPane = new JTabbedPane(); filterTabPanel = new JPanel(); filtersPane = new FiltersPanel(); splitPane = new JSplitPane(); @@ -113,17 +126,18 @@ public final class CVTTopComponent extends TopComponent { setLayout(new BorderLayout()); - filterTabPane.addMouseListener(new MouseAdapter() { + filterTabbedPane.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { - filterTabPaneMouseClicked(evt); + filterTabbedPaneMouseClicked(evt); } }); - filterTabPanel.add(filtersPane); + filterTabPanel.setLayout(new BorderLayout()); + filterTabPanel.add(filtersPane, BorderLayout.CENTER); - filterTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.filterTabPanel.TabConstraints.tabTitle"), filterTabPanel); // NOI18N + filterTabbedPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.filterTabPanel.TabConstraints.tabTitle"), filterTabPanel); // NOI18N - add(filterTabPane, BorderLayout.WEST); + add(filterTabbedPane, BorderLayout.WEST); splitPane.setDividerLocation(1); splitPane.setResizeWeight(0.25); @@ -138,15 +152,17 @@ public final class CVTTopComponent extends TopComponent { add(splitPane, BorderLayout.CENTER); }// //GEN-END:initComponents - private void filterTabPaneMouseClicked(MouseEvent evt) {//GEN-FIRST:event_filterTabPaneMouseClicked - int index = filterTabPane.indexAtLocation(evt.getX(), evt.getY()); + private void filterTabbedPaneMouseClicked(MouseEvent evt) {//GEN-FIRST:event_filterTabPaneMouseClicked + int index = filterTabbedPane.indexAtLocation(evt.getX(), evt.getY()); if(index != -1) { if(filtersVisible) { + filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow.png"))); filterTabPanel.removeAll(); filterTabPanel.revalidate(); filtersVisible = false; } else { - filterTabPanel.add(filtersPane); + filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-180.png"))); + filterTabPanel.add(filtersPane, BorderLayout.CENTER); filterTabPanel.revalidate(); filtersVisible = true; } @@ -157,7 +173,7 @@ public final class CVTTopComponent extends TopComponent { // Variables declaration - do not modify//GEN-BEGIN:variables private AccountsBrowser accountsBrowser; private JTabbedPane browseVisualizeTabPane; - private JTabbedPane filterTabPane; + private JTabbedPane filterTabbedPane; private JPanel filterTabPanel; private FiltersPanel filtersPane; private JSplitPane splitPane; diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form index 33fe6d5228..c1b520127e 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.form @@ -18,6 +18,7 @@ + @@ -37,7 +38,7 @@ - + @@ -128,7 +129,7 @@ - + @@ -222,7 +223,7 @@ - + @@ -325,7 +326,7 @@ - + @@ -422,7 +423,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java index a9c6f58e4e..61485832b0 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java @@ -477,6 +477,7 @@ final public class FiltersPanel extends JPanel { setLayout(new java.awt.GridBagLayout()); + scrollPane.setAutoscrolls(true); scrollPane.setBorder(null); mainPanel.setLayout(new java.awt.GridBagLayout()); @@ -541,7 +542,7 @@ final public class FiltersPanel extends JPanel { gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; - gridBagConstraints.insets = new java.awt.Insets(15, 0, 15, 0); + gridBagConstraints.insets = new java.awt.Insets(15, 0, 15, 25); mainPanel.add(limitPane, gridBagConstraints); startDatePicker.setEnabled(false); @@ -608,7 +609,7 @@ final public class FiltersPanel extends JPanel { gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; - gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0); + gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25); mainPanel.add(dateRangePane, gridBagConstraints); devicesPane.setLayout(new java.awt.GridBagLayout()); @@ -686,7 +687,7 @@ final public class FiltersPanel extends JPanel { gridBagConstraints.ipady = 100; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; - gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0); + gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25); mainPanel.add(devicesPane, gridBagConstraints); accountTypesPane.setLayout(new java.awt.GridBagLayout()); @@ -760,7 +761,7 @@ final public class FiltersPanel extends JPanel { gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; - gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0); + gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25); mainPanel.add(accountTypesPane, gridBagConstraints); topPane.setLayout(new java.awt.GridBagLayout()); @@ -810,6 +811,7 @@ final public class FiltersPanel extends JPanel { gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END; gridBagConstraints.weightx = 1.0; + gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 25); mainPanel.add(topPane, gridBagConstraints); scrollPane.setViewportView(mainPanel); diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form index 4d8b4860dc..910b2a8bd3 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form @@ -15,7 +15,7 @@ - + @@ -40,9 +40,9 @@ - + - + diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index 4d689f0642..cd52af336c 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -47,8 +47,6 @@ import java.awt.FlowLayout; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -113,7 +111,7 @@ import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsFilter; import org.sleuthkit.datamodel.CommunicationsManager; import org.sleuthkit.datamodel.TskCoreException; -import org.sleuthkit.autopsy.corecomponents.WrapLayout; +import org.sleuthkit.autopsy.uicomponents.WrapLayout; /** * A panel that goes in the Visualize tab of the Communications Visualization * Tool. Hosts an JGraphX mxGraphComponent that implements the communications @@ -410,9 +408,9 @@ final public class VisualizationPanel extends JPanel { placeHolderPanel.setLayout(placeHolderPanelLayout); placeHolderPanelLayout.setHorizontalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING) .add(placeHolderPanelLayout.createSequentialGroup() - .addContainerGap(315, Short.MAX_VALUE) + .addContainerGap(316, Short.MAX_VALUE) .add(jTextArea1, GroupLayout.PREFERRED_SIZE, 424, GroupLayout.PREFERRED_SIZE) - .addContainerGap(482, Short.MAX_VALUE)) + .addContainerGap(481, Short.MAX_VALUE)) ); placeHolderPanelLayout.setVerticalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING) .add(placeHolderPanelLayout.createSequentialGroup() diff --git a/Core/src/org/sleuthkit/autopsy/communications/images/arrow-180.png b/Core/src/org/sleuthkit/autopsy/communications/images/arrow-180.png new file mode 100755 index 0000000000000000000000000000000000000000..4d2aa3ccb2d59ecf6cc1db2006bc330a7b32423c GIT binary patch literal 1022 zcmVRjB2*F4(xR45i}(ZdXOyZf!3Qo}2)YslD~eKZV@Gh)g_|}sRsu<1 zNhZl;9-eb2GfkSwyTyeUPVOCY=brC;=W)+)mSw@e96bEvA<|Fp{b>+Haa{xfcxNt% zv*vgncodvvd{sgQN2)1Uj>WwHK<0lwIBo-IV#toZjaoi%X^%u_zn=qqF58qzr@_$m z#)7aOV*>y!n{7yWy#Scycdj0gVlfS}S-Wl+Mkxd2Z!bn# z1;CUKT{|Q#F6L1Ay3Y-RcNLP=W`%fY1puRc`1%oPVIfE3`{rM-!o0>R!~O7N|ulGpOEI~RZvxLzZ!-GgIA79j`768`Wgyr z%UwGxInS@&&3ZB*qd(=*fs@kQT)Lui8u56JNuz^+w6}|Hwul>*-@SFZV7U%kHHd+Y z0GRT7Lub(E^(oi!fLx9;Ba3xGW6vxo@pO*kuuh0f{C>YH^h_67835BX$X!60R82W4 zNMof-rBY0}SM-x|`%II8qCNCp9!oRbs6L+$!35kCwl5saO2J9iWyACYRG(2Kb^~Hi(H&N>5MFwgO*RT3v<6;vZN_ra&X=c%g>y zpmV%E0|%sr&G@d4=jq5y9y7=*2pI^XX6*5lJUV<%n*I@m3|)Ji0LWj-*5Gy@v;{=4 z3Q^^zpyP^yJ9s8M2-L{Xn&%K4R{?-cSD5_wXmU#K>pv@f|CR8hI1~!Nw~va_Y$hN$ zrD7$t3QW9t@manwcwU-`B+K@+@qShbu{Apdg}~d~rj%mBG{f(oe^3s0cR<<~C>7Dq z0*V@sR_+46Mko^#;jd5MDhGFmKt;ulqy;}qC6YX4MU%H-Jv|`af$1NAngEJbH0UMhP#e4t@P%kp+dR4f@RP>ps(jdaC~iTQ`ml_N>GG~EjfJ;7+cU4yC5jwV&mbeA13r&5bEp%5o`Zu18|t2 sS*o^a4eyT~U0u}+(trPT{8xYh0B3Hci}D$em;e9(07*qoM6N<$g7{g=ssI20 literal 0 HcmV?d00001 diff --git a/Core/src/org/sleuthkit/autopsy/communications/images/arrow.png b/Core/src/org/sleuthkit/autopsy/communications/images/arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..12077d33242acb0933fb8a1eb1e9b283173bf3b6 GIT binary patch literal 1062 zcmV+>1ljwEP)d$S)&?kl^eV&NR`W^b9D_uDuB_hydyz7PMhDe#Y*Mqj)7EBzD;EG&31)W6H*DIij(Awk%dwK@v83a%?qRH*h@7lsGA5=Ww`IzUcc+g<_S zgXalp1Tiz?z|g?nL=a6EB2qu;f`<`^00IaPzJIr2u)llF<9O$~<$1j~ZyJDd*unEa zWwu0ZXB)umjXQ~)rv{*GDdUN#3MvHH-U=``dP_Q26F5%=K+a2r+M5*tbhe=Lk+H;Y zo(h1(wuGnRdaVU3&;0e9f%67}YYKo)Jxln%pix`6mX*#~O6Q3H3iI=84I$?_r3vRU gZU6g!$G-#^01aB=1TgL}r2qf`07*qoM6N<$g5+G`YXATM literal 0 HcmV?d00001 diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java index 3199dbd7e8..807acc5e07 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java @@ -56,6 +56,7 @@ import static org.sleuthkit.autopsy.corecomponents.Bundle.*; import org.sleuthkit.autopsy.corecomponents.ResultViewerPersistence.SortCriterion; import org.sleuthkit.autopsy.coreutils.ImageUtils; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.uicomponents.WrapLayout; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.TskCoreException; diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java b/Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java old mode 100644 new mode 100755 similarity index 99% rename from Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java rename to Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java index 152d0e8647..92d4af32db --- a/Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java +++ b/Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.corecomponents; +package org.sleuthkit.autopsy.uicomponents; import java.awt.Component; import java.awt.Container; From 1ac05409a04830314b4be97d911af0b18804d01d Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 3 Oct 2019 17:17:02 -0400 Subject: [PATCH 05/37] Fixed codacy issues --- .../org/sleuthkit/autopsy/communications/AccountsBrowser.java | 3 --- .../sleuthkit/autopsy/communications/VisualizationPanel.form | 4 ---- .../sleuthkit/autopsy/communications/VisualizationPanel.java | 2 -- Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java | 3 ++- 4 files changed, 2 insertions(+), 10 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java index acabf3889c..4ebcd9298e 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java @@ -64,8 +64,6 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro private final Outline outline; private final ExplorerManager accountsTableEM = new ExplorerManager(); - - final private RelationshipBrowser relationshipBrowser; /* * This lookup proxies the selection lookup of both he accounts table and @@ -74,7 +72,6 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro private final ProxyLookup proxyLookup; public AccountsBrowser(RelationshipBrowser relationshipBrowser) { - this.relationshipBrowser = relationshipBrowser; initComponents(); outline = outlineView.getOutline(); diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form index 910b2a8bd3..18d2d90b0d 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form @@ -1,10 +1,6 @@ - - - - diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index cd52af336c..eb271714df 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -373,7 +373,6 @@ final public class VisualizationPanel extends JPanel { // //GEN-BEGIN:initComponents private void initComponents() { - jSeparator4 = new JSeparator(); borderLayoutPanel = new JPanel(); placeHolderPanel = new JPanel(); jTextArea1 = new JTextArea(); @@ -857,7 +856,6 @@ final public class VisualizationPanel extends JPanel { private JToolBar.Separator jSeparator1; private JToolBar.Separator jSeparator2; private JToolBar.Separator jSeparator3; - private JSeparator jSeparator4; private JTextArea jTextArea1; private JFXPanel notificationsJFXPanel; private JPanel placeHolderPanel; diff --git a/Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java b/Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java index 92d4af32db..5daf8d5646 100755 --- a/Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java +++ b/Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java @@ -33,7 +33,8 @@ import javax.swing.SwingUtilities; * https://tips4java.wordpress.com/2008/11/06/wrap-layout/ */ public class WrapLayout extends FlowLayout { - + + private static final long serialVersionUID = 1L; /** * Constructs a new WrapLayout with a left alignment and a * default 5-unit horizontal and vertical gap. From 2d0711eb0ccd6435ac19db7f502f87ae85c02927 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Fri, 4 Oct 2019 09:19:08 -0400 Subject: [PATCH 06/37] Changed filter pane icons --- .../autopsy/communications/CVTTopComponent.java | 6 +++--- .../communications/VisualizationPanel.java | 1 - .../autopsy/communications/images/arrow-left.png | Bin 0 -> 1666 bytes .../communications/images/arrow-right.png | Bin 0 -> 1688 bytes 4 files changed, 3 insertions(+), 4 deletions(-) create mode 100755 Core/src/org/sleuthkit/autopsy/communications/images/arrow-left.png create mode 100755 Core/src/org/sleuthkit/autopsy/communications/images/arrow-right.png diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java index 69ea42c8aa..a11fde5622 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java @@ -94,7 +94,7 @@ public final class CVTTopComponent extends TopComponent { CVTEvents.getCVTEventBus().register(accountsBrowser); CVTEvents.getCVTEventBus().register(filtersPane); - filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-180.png"))); + filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-left.png"))); filterTabbedPane.setTitleAt(0, ""); } @@ -156,12 +156,12 @@ public final class CVTTopComponent extends TopComponent { int index = filterTabbedPane.indexAtLocation(evt.getX(), evt.getY()); if(index != -1) { if(filtersVisible) { - filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow.png"))); + filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-right.png"))); filterTabPanel.removeAll(); filterTabPanel.revalidate(); filtersVisible = false; } else { - filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-180.png"))); + filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-left.png"))); filterTabPanel.add(filtersPane, BorderLayout.CENTER); filterTabPanel.revalidate(); filtersVisible = true; diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index eb271714df..263bb200e6 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -86,7 +86,6 @@ import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; -import javax.swing.JSeparator; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JToolBar; diff --git a/Core/src/org/sleuthkit/autopsy/communications/images/arrow-left.png b/Core/src/org/sleuthkit/autopsy/communications/images/arrow-left.png new file mode 100755 index 0000000000000000000000000000000000000000..2e67c7c8071f6fe28cc2887bff49cb988dc5ee4e GIT binary patch literal 1666 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 O<-ez^pUXO@geCw*gTt)= literal 0 HcmV?d00001 From f92f47e28acd14c976a967424ec9ccd3f6469027 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Fri, 4 Oct 2019 09:55:19 -0400 Subject: [PATCH 07/37] updated icons --- .../communications/images/arrow-left.png | Bin 1666 -> 1769 bytes .../communications/images/arrow-right.png | Bin 1688 -> 1774 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/images/arrow-left.png b/Core/src/org/sleuthkit/autopsy/communications/images/arrow-left.png index 2e67c7c8071f6fe28cc2887bff49cb988dc5ee4e..e00d9903487e6a0cc234ac1ca082b53c949b2a62 100755 GIT binary patch delta 1736 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 q|PL7%csO`qdp@ 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 O<-ez^pUXO@geCw*gTt)= From 36bee81153b01d48d832e88189ea9e9b3143e43d Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Fri, 4 Oct 2019 10:19:31 -0400 Subject: [PATCH 08/37] Added new button to hide filter panel --- docs/doxygen-user/communications.dox | 2 +- docs/doxygen-user/images/cvt_main.png | Bin 88944 -> 99668 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/doxygen-user/communications.dox b/docs/doxygen-user/communications.dox index c7c77e6a30..9efd0f02f1 100644 --- a/docs/doxygen-user/communications.dox +++ b/docs/doxygen-user/communications.dox @@ -14,7 +14,7 @@ The Communications Visualization Tool is loaded through the Tools->Communication \image html cvt_main.png -From the left hand column, you can choose which devices to display, which types of data to display, and optionally select a time range. You can also choose to limit the display to only the most recent communications. After any changes to the filters, use the Apply button to update the tables. +From the left hand column, you can choose which devices to display, which types of data to display, and optionally select a time range. You can also choose to limit the display to only the most recent communications. After any changes to the filters, use the Apply button to update the tables. You can hide this column by clicking the left arrow at the top of the column. The middle column displays each account, its device and type, and the number of associated messages (emails, call logs, etc.). By default it will be sorted in descending order of frequency. The middle column and the right hand column both have a \ref ui_quick_search feature which can be used to quickly find a visible item in their section's table. diff --git a/docs/doxygen-user/images/cvt_main.png b/docs/doxygen-user/images/cvt_main.png index 9093f0e9f803586429ec91b0c2e2af6682d4229a..1c9ec9e903368d5187e5274caee98562b1e6807c 100644 GIT binary patch literal 99668 zcmYg%1ymhPu;wMWyAw3HySux)1$PJ#+zC#w03o;qcjw|kf`WNURNJ3T7pCohc zdw2b-?|raUG6eTx5Ya4#gh>5JO{W%95aL1!UF5GaO_8wCM@FI7thB6RgX zB1Gd;q=&LoGhujAQ7^Wy9yHEY+vm!4U9~Sz9-;sDEhFSnZ+@kt-47rTK$_2iyMAh`MW zN!$NkCxyFg;owCT{NDjctK<^ZHPe;{7Tv_)Bvq5KE$$@nGgps#PD^{Tg$C)pAA28G zvO-vBj{hTQl`bk8q0VuIfwpw3DU7?O#@XF(Zt?f+43;Ru<=Ah>hqK$!7REfyJ&%7|Hu&E3QGe4?wA}*~$9bZ~Bm*vWq$d@18^xw+=#H-DEW@Yr3S)O=% z+0>N${M=kNT$2bZzQ?eKsBrIVMsET>r;=Kl+zoJ+)UDo*}CZSM&Rrg`|j*4 z;h15+n&*JEm)F=?VdC?kz1q4{+ajCEZP(Jw4P&dY+cN$y|0Kc7Fs)6leb#TRyohW!^We!fYYL7#paQ#le?By<@8A7%xs;ldE5@d#{3)Q&ilqn2Qjm2JORfZ zk~=RASaOruv9YmL4ykqu&BK? zOF?EmaEjTZjN4)N{EN<~?>}7&C=webuQ7nFQgWMuT@ zV5zmjIeVu5zR=(S0~%VFUp=KP*I#k`V(rpN$9g=si+pSk!qS{m9&K`S=S}c^i8fh* z0F4<7vUZH)x~X)#{&-Zg)!uq`i|erW`FH$F5M`Bq$^W3FE+@z-#$^u1V z?fB?uw|!#B<)}#o0(shF`K^+G#sc^~rH^7re)`tXVRo72Tlap+(ba#00HvhvX+bws z*@V1Y_*Vqg`Moav;@2BLZgx5vhcR8{#}@Kki=mUB#YThneQwlKqe2CiRz}p2C~uvXQja53nv)>y(P5=&70Yi5;k}Cb*oplBI2iEi%ny2g-f~YX zg!uSOJ+>LZn>;&J zF#iKvsF;eH(M0cWElXQDI@dD;rNia%@LX(x4v_#vH)lu5i_b$mop#Hmx9Ki(*RY=V zFW;O+;h#|b{)9>Y5`MaUaC&0D%ao7)vdg=g?IrX&e*4MB`A?fuRh;e;q%8&n&CZwW zLkD8$x8qiRir4XmM}W<|Zk|KuR~P(c+ZN*w;EOAW_2){_B@7`UtlPc2=^TfOJCes7 zWKf1SC5HiYMJ-fggeP+++jH%qa^DJ6a;`8N2h^m<%;umJ~aI${8sCzSBC$^;hwD(qPJpFzk&=&3+xDmGKhUD#X0x2+_?n}7c zg4w`VpWD5yH~Tno(*LnoZCt!cs?g(dY_7ydf@#U$z3+D2#BEO2PIi|K-zY|L+B|4x zx?Q63vV`c{&2r#CGz<*p+yc}JCfsAs_44mMsrPbMHN=$ALFd=AH_JW3_;lUy>#34Y z7ugDN3yo38sa$5dO+x}jcDQE-?E4ugg_cs=jcrtRbF@)%0*_nmZ!T#%OPWT)2TPG$ z`NP9YS8pC)?)Fp5ZPfLy*C*28(bUr4i|tf0SlsANV_hVu-4O|}odNfo zt&r?o+p~+Z2l$m-Ym63`9LCrkQFn8D_^2`Gx*t-b6QAm`0jeAXB4K`zmoK}^@LWHK zb>OL3+ZjG^#Df0ga*Q-yu|y;Oo$!~)$$0oGkn({=5{=> zrUEDyIo01nI8@1UGinChe^kUyyFGC_O7K+`zm+aaf~*!Octa4j2BD3)M`~gu@A2OAoR`k+`lzpP zyois2zsni^lp3)w@{SC8)p&FnV>hLv_8-dQY-S{<+&(3qyEpW;1X3*#foz}Z!!3QfiLSwL&h&$^oT>Cg4M_Ed%&DH2>ST4_|Osr z`bb081P98w_YDdyP-1u|Vz|vIpKm``l{vl({&)e?Sbk%-$E?#9M9qTVg|*KdJkCwt zw3BvbI7cG;nc42Vt?xTRNovTWuiAbM-de<9STc}hqpIog`>6wimTbc;FdIT?|slOTy zOazsttRC5G6aLC|m@7lQq%q<-(|!a4j~Y9=5Q(rj)ezFVZWH4R=h<6mUvj z5Wn7P^C7V%iKpvnLg>ZuW61mAy{r>E1q#jy`w5Wxjt#{obT(;mh2&~Hmfm(n0J6De zx~pPrL@?%)+Q9y*J`=kzmh0zzUL&77wY)wN0e(jY#*ZIA5JSVr z2Xgw%1_KId<*9j3ZgaVx_jw&!zB%!93b#kD9KyNbk+Eri8 z<#k&GN}F=*e{CX{X-mE9I!sQGPmxA$NTLx|s`Qs6LgP}VaM2e}Bzz1@1r=Xzno73L z7Q8dEumP7}>pC?*G0Z)G3e`>c;cji_wbOAgT)MDm_*U0omz$wKGaPu+kHX7*Uu+0! zU2^LiJM+Y9mL}56ML6bs_)}wa*#9#*YogWA0V+Hp7gK7~F$D@lqIAynJt}d#^-b`Y z`vWNgsEhw`qaI=-@eT>$tn*!q()sDoZ)cAu7EgpT@W}mbu~ZJ=gzoAU`S(7youvZBfoRu zg^lpLreWRQ;taJ=5+XNf(=1NnzwP(o@uKn90yesT$1S~LieF3L-S_R6v}jdf1Y^gS zyA#9g0J55~QwfVfFcoD!v@J#1xl0rD>1;Kn%fAnL0}(jGqiK(QBw9 z;kKayp@{{ufXxGm37Zp8E1kByd}BfX1vR7w-nVA~&(~)dkv|>lIJvpc z7SVX9Fe>dakyyinFPOGjE~zG5?VP7u-gWM;qNe zI3uVW`(MOKDw8QbXMV!>zi*Mcq4d~ZcD}vppKWM{tN)RXz@a7&&%^w0zZMwu>s~2$ z+H42kxtsa!PwP=Wd)+DB+`9f$Y^R<=_zC~~a<}$-mFlfODq$WQjq{84bClA5f;dy{ z*0Y!lWjQiM{8)E#K{|)lXF^OnD>4;GnBr{oqtqOB912TxI?I=XM)+ zDAC->>!#r!ub{ltb8OOz#29eOpn2mU6{iqFg9#HQ8Hf8!S-ER-$!Vf43GYfyvvWfZ z>!pO~9X~Lp>}6BqI^a*6`Okg90OLwRh)mX>f7m>^x!m)o-CG#MHS)%A$aoeGiJw}i zBhP@SRVE7R;BG$%-G`c7276%lY)X zqiQ6a=EOcUyGNRO(nX90mLDp@J_iV$p?&jvWGQb&&&Sy?Vy!X4k^~r@#J;y7J5;iA zt}6~5GYVCQQRhL!{WZL-FuyKOFigtIO40`@W|dWumvB5reBeOWQgb7Z@ry>{?H6}* zbg^19s_|A|8zWR#%)0{lvcj~6(W!xq_PLyqaCTZnRVAVPjR9I9Rv&whcXF1Kw!iy( ze744zB6uO^z3vdwg4d-zRdj_<=G^83kN@@k0(<9crZ=Uf&+%G`_P4~?_rl&p{qO!` zgrE!9pnWA@8dcnxj-DRO+OSSF9aD%hI6i*1dDvpQ%1}w_@j z1fHH*kd-ga&RVfpZS5SAFNm@uoP?ynfB-QSwE9vrKipiMNr!=2Yuuv;WSW^$b}eGR zrO06~^Msi9BVC0X?-Zy>mT1)UrMqO@P`4Uh+RaI-Mq=%7oU|(XJvp^dB~ZgIL4e32 zA4jGJ1o-Ls?EeabSBZx6`3k>*4-ubRyDv2%XpHFTc10=H*2aORgMhK8Ih|(Ab-EwB# z#PvC01gvdrwFA?WB=hSd4gm)_*;^$~BGGYl_89Ys~B<4vLC30(* zs^bsZ3z;2bZyMh7b-XhBYUp~Ybo0mPD}LVt4IH+)lUDTY)~5lTf3V`(589?O(6 zmxVnF=e8}SMMZY#5C&2Si7yrBM4B5Fr4PYG0ZG(zR?m@jmL-Q1(ULC`;GvAC@CMGc zm=5ZFYo1>ez!ST}aUjv6bZl=EpEak>=G)=Bj1RhBGj^UBiXU9ORL$-o2(wunk3SYv z-)ki*M{)yE`N(HZ2gmPa(5%(D?!}a8Q|w8V8#SYIuVcyCaNJaK5vqA3H!t%3!eYO zn4ro|4!$TwMSeCj&9EBr;nTzu3IRMA3;}XJw(b?+LP>0QGg07DS+$FDWH|Am;Fr#y z6@P9mN60ukKC@tX75BS6!ux$A;%L85H)m!iSj<-r?X}v;POapB(f763$^G-ejNMw+ z8zKQa+rhT1TjM{QL|PTLJ9?ajgOhNmLWAWiWSpxKPjFseUF^lq?}qN6*D&OB{gVp* zidfKQsuX*!4Og~I5?CS(>O#0Nk9=6m5?u1ruYMPrGcs*1s9SV*AjP|KH4+_h$^r@j znTVJ{ia7D`j4fAN;-y=~t^Xlj{*jY_(`B=X;-<^O)WMcl_o;dGxikc-%fwQm+ACu8 z^t5hI{Uhvp`|o(K!;$xV-J4ABaUen0I<8yskbO5Gd?6R2z`0McJ9-!4yvWAvNp`|K zW7AwnrMACVBG(v|pz&r*nC&KSTS}n4l(0`Oe!;r#GF;rRe_5wB5%zEL>5mo6@+VpE zpZjM^z4|^MEFb*NezLhHA%wD^ zAfV9bbghV*`&@F;Rus@v9}bL9aQmzHGA;psfwvFi7#R-4qmzzmba50pkh_oYpRVPy z*x3m%ZuQ@Cm-7EL#Wz^(#oo%4$$xV?QIU|0O{k_};BtB=%w+hmw-NA$FFRkTS@!DZ zjY7gU|GOoU@0@qCaCOSR+LzJ6Ki6stFqHqIU??D|FG@jQb_a{<8*tv0q8$?BmKZ1X z7{D?4hFvt1$EO(U2k|fO3nglVGXAjY_Kzxn3r4k6(x_zr$-}_W#5T9 z>TAe{caU9FdUU6EHqTm|9O6BNR9yq z5h}PqKBZPUodWK1x0@+mRCvDy`u{SZ-Lf_hrg=m*)g`L;p%wz(B+2-3cO*JtY=4pf zY5k_L@2E4>Q%Wjc&+Za8Aj5zuB^_Yw>(klQ-Z zJmJ)*wMNgzzml|ZTCl}sA@^8X%&;b76Ytk>-HFjnV+bQ*(N2q7V#`LX?d!%s zzZrg=9PY#z*~#m6)>#&}tmk??`|Unmz2hzAscBPYx8iL`77{uD1#VJ>6HGv57oO69 zQT1N;#%<&P3k~Xmx)wxgGL=y&Dmt`YUJQ{|L{I_x(t4!o5DK^wCO=Bli)zo@%(8|1Eky~COlgrp{Vun(c%i{s1NfmC-|63` z5V$_&0-j4`UKoDih;uGm=`7Lg61~RhXaj{dvHNH1wbAaOg)s>_tJ-YZH2sTFXbopd zbvjKc%rq6yIcewhdGb^AbLNqvq>KCGtu8`Y)dvMP&kg=NPxL@iWVQIRaDK6Gd$+uN zmqSxfuu<{bU{_bX-?{#2Cs^Qe`Ucuxol~XPqffh{p9Iik;9LiFq#~Hh(!b;j&BKzp zwq%jx`axiHch}bDX}P-BLHJTIf0F@$WZ?3-C?$T2{)ncN(wYujKfD@&`BZs|^bPZ9 z%Btijs7P55NXdTN8XII0Y-isS7~{Rg9vJi9tge!s>lV&KoH$`-z1}5i69J$J(c3 zccy&lwvOWMDu2fAYU(5O!)Q8pPj`1zbo5NHZ%-I6epU3oP2U> zYUa!b5gy(|Sbog^J#spM>hR|+O& z4dWE;$f}>oo^B5#4DAQAwTMUmZlqEhTk%jWj{`KYa(ToAm^GWo#?I~tGhNZD|8ahC zQHqLvWH{Y=6YuI7dSe_yl%SMB`)vsRvwNdez}e}V@77p^sh_W@{K{Nudm=F6ejN^{FKY(bnuRwmvR1Q@LEGh_BQ&1K>)8&Q!3m2G0jqH8Ld@FzN)(6&t+uCl(W(%D<1a7+yjC>RFmy0 zYv)W`THPBtD4wUka!5Wb0Bi9?!xgnGBMcH(t@8so_H_4vxRjSIb)>iV13f)G2S+^+ zCL7i|Iyki3Ocf?jNWTj-V9I8<0u~TCyqbw)gyYQT+krAKT=70nV zzoj~Dqk_y~IKfn7ucD41$IJ{+lHF1dhK9DJiCpfOA>V*5L2*g$X?8)ONiA(|0;^m&M5>x^fi_Ic#v~w-I020u5Cy+LS?TMTN*vc=qXE(~Cq= z^yV4zktpiB{xCTLQ+A(jfl2+OyxmpW&o?b9U#FY5e>EJz1@FH<1%*BN-S*5|jvnuR zaD5lK%hi>7+p<=I~@5fM6^ zi--zGUXH^Pt&;OMtz3KfM3DQ5*1XbJKFS4F<)(Kz`>zv9!;wKqCqs7pJ}m)sEz^Z) zYQ|IF0zU1`vd-*iT?@O6(q;{PX6A82xVoUwMDljpnAMMMuwRP%YPPY8N_@-V?L62D zO!iPx_6RbO;HUTwJox*hy3^HCsljgUCbdW(t!NMdSO?jydSlh$l$EBf|7%G#ir$O~ z-h@(TO|@_~@>drR6=|V^R2_aqcnH#4^<8(P7C~LC)`QzpIOTU;1gX5-*%eO%X6XEN z2kd&QDo^TjOL`uZQr?T5XLk$9W|8D!5c@feTqcKq(zJo2Z0$ApCyqQ_DBq$jf_2xV zU8yGsv1IL=!P?>t!H`RdhOMQgI}kh%CQ=LgJx&h|mFDG%(O@wdH2+y!BLP{bWeNJY zySUV*rs6-1JnT>8Yggz&H=Dn=X{NE>d91nklJ<5vm&gjKU)>tcB=}I=>GEV#B4H%1 zm{o0~grLCN=f!`@By5ZODYS8z=u}d5hzOU?-*vZ7#;Qok5p;mByMBZOigzOyf+pRu z7R#t&2JxpuIEucG#iL0*oJ`ViQc@6h>2hBg`eW@IN>!=Q$jQs|wz_n)PzkVXvA!%_ zTDXMnmy}zWC2A=u;DtRDvyXR&+*MCrAATA7CRbQ&Fr+B&jY^0pOvLkibaR2p|LJ?S zAt zZ>?*vUghB5IDhg_ZrJknYqslF0rQ#U5>Mo@eV@|4F@S2;-nmVnzM{A~5N%+xxm;ow zwN@B1P|7MuPj?&=VDQt4Xz-YW^!_%rIG?-Jo&D6^bR54FQx5GOM&Ux=jhw#r5KGfA z>rnk0S;{xI$UJHN*2zh=ioQdzPrYAW&d^Y#m}qhdIsN;})lo&|vl?@=GvN8q>}Xkk zEk(but425t#S$M+SFQ7Cfluuml3_;%|6&>Jx$WqbetgSdL}sn7JnycJ_TE|mDt!{K z26nGhql2LxBDRXwqR;%i^VZ|9dBKH7i#2*ImG44>!EkFh##<+Q>ip~1 zY1gcP!o`u1}{lTw>RfJ1~hi9V1EonD$uSPvcug9g+|~1$2%bwUrD{ z3*yHi+L+c?=Z>K#2m(yvR6vK!(LtW=oAAhdzzEBw6>F-AzqYN!d&+t!RAuaj(ebde zINULHbU-QeEsVrBvw7zd8vI=zYy*#f%!{+WSmFxS4B~jv--HMx?&w)$<;bk#|1-h* z$pb}^{i|(LRM!e`y;er4b!q$>4!>>neN*YBu0v&N$gENhgKR1|3_dzQ9Xm=G7Rn}` zg)jbB89RF?p%3W=cbEw*+RUds-vsQE#R{s7!G-tR&O>(!mVi^fo7yMX%vuIB2pPFI zPECw=#4FSDRc|Kv-CFa==z+f`;!n0r{-8^wZ48onr`V!d$L-q6p_lcqm5%l(MH-?^ zu4=aNMY-cunlrhEu(+ca+3(Ge?n5>rzP%x^xv^L{GrAl8vQ z1*^|hR$P2?adAoeEaF#6<$b8{$9eOU?b)nk_1^Zc<-4@BzTET7cm_mes!(xwbkxGQ zz|q#056F_o$D@JbkMC+vWt<^!OVL_2{sE%zis4jw4P+Z!EnrNlKExgM@DT+`0ee<`D zY6aUd>dLbp5RwpGCFuoIsLSa-`>#y_yYz5xqO{2wj4Kb?38|pvW5#4);rYP<=6wviK{%jVbj3#MMhVkJh_?BQU-fqF;Mo7Cjf$ku%@CKHOpPAR`<4Mbg zWNrwWn9JSQ366~}^OSBDZ$Un*cP{+to!jpPP62jVf1?7ta@ZT zQL{}>uJ>|?K8WL5C}m}UX+B5X=2`ghNE=N*VuAU3c`x($F8X9}clcc0$MNeu%5Ir| z_Zdzj@Nq)7xR;7%%`{_u1oE9aMe-=hT-@o%)fe?5ZRm z>fIWO{a6-ks8ul}sz>FG2ir!tL<*Cg5KT+DJm+7BHEK7El<75R`7muP{%|@oxBS~y zAKXV8LR`Ve4@#O1dYbA>@?rj1Ex(VvWPTD9ZFGfBlYFf-ta_nG&CkzwT4@2I#J&zW zzxA%53}0WSfhc zQjh}C*AKF=tI|*!bJN$aj$Lgz`1axP%TfmK-;PYB-l9PLc+BcJywf!H{?N4i>1TUc zUHpTF7O|bxkVZC>#l;`yf+YfJTD(s$IM6#g*cjkHAx$GqZc0JdofzPZ-G=I5eJ|`$ zf>fP!n*g)~Bp1|R<4w%59bX)KWmV88vIE?}(^c^$Hl%!S3I-Fvf(imXIn7IDVJ_h; zGbb)wD6J6*=?Hk?p+)Rs$20Iu3`bbE@{>;Vu*eWG)`t#k_hnzdR%s-+pIhuzd%~qX z>guPxo-Db|wJ-~`8z&QjTRqyw=lDCaIe2=Bnco4)B!tUS4}+%nhnWXko86~w#-5LR zwFv`#kc1xuJGm?b6@bna+9c!#?8ie{BcZ;H5*>YI4dmIOQ8>UDSiiF@%^SQ zr&zS%C7wOv_#5xZCmo$XtIq-m*Vw?{#=_3Nb>RsBrBAEvJ_}whPEKcK+EuS-0dMS_ zoY-(sl9H12+Ld2pV;ifhfz&XMax90rV&z9TGAiHmg9(O*NA);I_aQ<}8|WAQMGg!E z(E8XH4EZ{OSA-0T6vfo7CVD^;Z37ze{eKe0p1L3oeYS-5@s+|6kwR#8u$*ag-Il~C z@pt!4A!$G?%pkwIUM4N3?c4cg*ePtgHeLSnTP*n8)BemdPQF(?yk4QzIP12$dv(@8 z6f=rNL}nNBVr@Y(v5ixj&bC+@t+zj0D1aFd2RLv%5h@xMv1!%Ys)^RAAfBypbV57< z0Y)CyxJ^Tcdt0lMua3ZHKtjrLvHH?rjGsO~>al0-69)>u5&@EA>k=yV!aB^A{p`7w zSo)=2EcZPWNca^_Wa@LeG6xq@DDb<(?Z_~f_@zbTvfslPvnsIy8v**pyM2RDTE<|d zMI%lh8=+66U1;L+tGnGF4(^bc!l8)gn!KZhTL=7@uVBkh*iH?*L6)M2g&Ng0noAko z9A)_ybbk<_sV|F2X1m24C(_93D+4|+mv+Ls2$m;2bnS4%*y@%o==?5&KhG^pL3*RH z&Ro;vB%XC9uyy&FMZv-_SC*@o&eiIE@_0R^e74d`jfDUNY}`((%f+hsaYBy+y}jlS zmpeda^!Ur7l?DI1sNKhjm&}Cj=RfTON~u z&h75q`v5)d-zp+6Ty}x{<6S%(^^d26+I3!9P1LBm(v@+i6h26+H`1o0d(8{lQXXAZ zNRBLRkJD*Q3Rm3IU%>xD=9Oya0x&I=_P}OPu^q(0RE5QzHGP{D---6w7CA zrsOF#UcaYKHn0K8qa^RoOrd}jG>UH-dB@_nR?9-|)%>j_B(p$T%>uWyRp!O-Zq5dT zhUEb`8uQdl#ZncbOblj41Dq*C9>$(}smj=#&76Ux1L<%jut?9Bk13G3zkCBOuv?Y- zQXtFdTVCt$)9p+IKjQ{ZqiR-Gv}&Gt<_DJU$ge6WDq66mwzt0k{5&~6rlX^qKT8aF z*hv90xKJRWY?AlyPYw=fljXbwvLYh~bH&5IGaHW)ivbcS1K2&dgUPYOi8{G{obKiR zodvG~58|Y@rNwJNuiT=3t;n79J>zT5@*OJSc|n}>+p9U#^_Yk_YxK%u)^32jb8!5d zS)iq*Ep^I*1a&b9pO&q9(B{{r+7V4ZbEIt$VzS|v4bm4}j`Z)anY!@CjnU-rw^JmQ z)q58xsA@3f+vt%c9$+qsC+9t9seMB&KtfSS@*8;l`t>VP0Z*Lr>q@iNolBia!+jf$ zc8teeZS-s>ienXu{o1e81`Hpe;5I>)8|=>q@-CJyPL41(&7CMeA?REX0@X^LZVHM; z$fYlpN7 z1t6f)6Nv@rz9W6AJvjTrL)luKBcZC{$mFf2YQUsUv+b??{mb$fQlZ!D?s<+t(mPR2 z=4!IzCkMD57G7b6^Wju)y8;)K%zB_?T*ho|2nJ+heAaP(Fhqt0LUVU)<2S*Bfdl=_ zd}X|=`{)BA?PNxc*4}~BOm%Itxi<^_dzS03ij?i5s~u-8&6YQlzTpKnbCoh}}o08vbN4F5`6_3gp6$Y$6jlV|)* zfLHsw$H62e6VoXGr!dpfnpiw6gIyIB6#)Q)2@9dgVF`zb$am{Evb?;!*g%Kh)5z%P z-dJXIEs>3yJ8o9G`td#Ps6V*HwJ{AWy`K3u`zkD!0MyXXq; zx-yX6e3irwHj+exVjT-}GA+g4J||xjQ#Ug;B~KjmzC8v5Itxh40ojJXK#7KiLMETv zT8E#bqoZOP$HVQCQ-ADxpSM>(V8xLVwRUq%uC7-R5pY7;<19#V{XH<^@i5}@gk`~- zz8x0oAZzmN{vx5IlEP8-T7>s$`Y31iKI~Q3?ndCYw(5eID4hMok*qlb>A__dC&-xCW?)fHDP$? z<>@XiHa3gb)e;Eb>4*15)0=>G1MK6rn?3F)3CQ4a&I7{czfgkxQlkUlu_sb1ONqvk zB7cnt?9fMfxe>V@SxyRQ7NDdqitxE6=wig|5OJ~2cY`JR zOCa`0La!!2pKYp-HJnx4B%hWh+8xMh=@YHD3jiwpUtqO;F6N_7V&^(66K#~~TA`5n zKs@mM)mSEfQ(j(oclRb>H_*}1*Zl4b0SN;P%?(gtR#&^+-7Q9*V82)|OM|8Kg9Ty< zMs(F0j%?Ygdxfukt8qI&joPW0+4xse+y8urG?V9l)&et5J-o2jBPb|1S7`{ODu7}t z`e6X^^L%-916j|MY8n_Aq;om+nzBBvTmr$x^Zi!bJQCbx;g_?|eg8XDsionHVgJ!@ zF9Bl3sn^%n;S^?WcJ@TM0s!MAPXInu!vpo2)&Qy;SjAsePEQXU9e6V3Y@xnJ06ism zKBVvX{`I*x%a*D7W5oh*ad zffVx3pXR$j7-TipYbgTYuo*c2Q`Z)6dtHmJXk?XV!1;chWu)183rNhRbJ%R2oK*OO z`JPVdflYQ=ZoXJ-u%j73{|OODB0Yonmx@)1^CJTQ!5*N;*>Mw49?SDjeoUfOuNTwN zMFI5y2VTgRhYKNi{f0i6R7OzrPQ3On+kpascSZgGuQn#WDYf0_PRRRO zhAz1ya|U3i-9oK}jEsyS-6fr((VGPCA<0jpAXI#EH$;D0i~|Uqbo*L=ZjS`&XSZj({lMdEdRb zsKohHt?hRgex%@xj1nv^TF5osmGdNX{!h#|tChKj~!3M9( zy!$gNH;;eciw{GnjFT+No%-{4*-o3J56fHTCX`oxe1cU~gG;_?o;_LrU%>%EAdR1v z>}!f79zDC*e$#@Fw;Q*AHjyaWb_{PeFbMoU$2A_nK06X>JNeunt3Kgec8fZ6sshq3 zfAPqfB_MYI7PB?J?X4$W@A3Th0B=uHIx!fNMDWd61oQ!ne zhAj}nHtmD`Zj<32A?NYy-DfGt8;ej3rXY7?SdN;ZcQm z=c7`TQ?gye#BfWcDk_&x7IXYbiAY6d}|+NJHOYw>C^X##$9$ud|jshhng2rHf8ln66}D`d}~fg*v8Df+UfYhAyc zgDF4*O<@v@70q2AI%errxV{1Q!@s?-A%gO0n+#9TMMz+e2K#P|Kc1bBt|8 z7|^`Wh@PKpJ8Ufbc!5)Mjk`Qf&k3V=qh(F&Mx?!yiIVh>@a!>-Taum?`+-@8!dyPZ zVK<~iuv@WBuT4Whn7wQ)F&Bq`sdchdl5joDcE%!~V(}q$OTeSnKDwC9=2)m-fgPia1QMMUuN~ zdXa1Xjg>U)Q4slS=5xKVp=3okGTo&$5_oCKO}Ub0wU$wOeOGQ9skw(U;^YYW zg15>}d=?7XfR2)@v#;?$2e!2MUHKB-yP|_Nhy6LHo=($2C-%&V6J(NprL)3S^n_k~ z!!rg9`QGHosOyPvYA0;oF$1iYC+)_$5AT;S`G%rRpK=|!r(}M-xElzlCS6@i=K91^ zmps>bO8Ep%r@!x1e@S~sj*&X$ROC7hOn4k{n$2gxoVDbi2?av))?h%_{_Ppnh=Mx5 z;`D+%TNcmvcIB{8T644_X*$?>^aOc~!XqSSKr2Xq5YH#f2VdKSf;^9GPv=}vpNnFV z&>jn8z(~i$#6-uppO*S0_Ojrtr#8vazi5aUp6(kf9RgzC-I*|u_8lMea(VOLNTjwH&ypP)#zp`y z4X~gAz=fS;YDZEpezqaq+8b^8X;#Rg9Xx8t)za3UcX!p$W zZGTL0{{2T2M>3AOV?JTd8zq#$J-C8h0oUhUZ@2!*6H7k$HJl=^n6&yQ9Skz7*t0B- zZbVSdnzga?3|X_+UK2m^2=Dj?hjYQSn04W516mqB`nGp?yGGzNv>`)?<#&iy2vSb< zoj(8fGqq*eLeRepy#wrK(^p2n=4xbN?V!Iu`2|BMwfHH;!L=~RirP-GzLrb^Ym4(q zVHSnC>c?^Udm|%O*18Jh?HqpO(@hePG^Q(P{kXBO5&~jqc)#?6QMu_H5-E&_=7k$# z1()&+wy%qMRbPsUQ%+0_r#?mIVgHEMDS-#mT%sO)41T^kbh=SAvo=`LOQW?szxviT zDg3Z>fr4*QkXp+yuh#8H`TTib3N!Pmh1nMPlHP*frEt!Q`sm_k+WnV;Bs3QP`ou!0324+tj2(I^dW@?>l@pRdmLr<4HHmZ&)8tMBu++4 zUsaCqz%BURA8)SBtIl#X?M~l)XDB8eKnLgY+tWDhX3KT2oP|ZaA8!KQ6t(-UTpJyB zK*C?`gtk0oWwUpNpOTVis`U^;H$#;;9zS~+`Xd5kpS-?2QBqQJDAHp^ZEkK}UbE>Nj3KjEs!vHQM82V3^W~4J8MB zP&#3rd$=@6Uuzs+f?KT#81mhj1D}5s(a|>zFGKGKj7h12I=ORL9iD#E9(s zz7%N&dfb$%E;R;dzv=Zi7+(|hJn`T3h zjuN2Zk}aP@VRQI9pag1^T$Ug|HNPc=6*q2|nV#AO2MF{{V99c6;hZL7nxTGCz!ich zc`lV$ReNp~A$-2~6D$v*4Q8?G3%(|H`ERhE|Gen>C5A;rEbD6IM(m8{FCJ;;)-ewj z`!6(>6d+07(EdunAuUGg*(YYw5B#ì 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

!w>5ESdK%7`)e5r4X?&-`>5bdQel%~
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


From 81966fabb088c8b0ea26cada4b6e7a5780ef5bd0 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 11:39:50 -0400
Subject: [PATCH 09/37] Fix backwards compatibility issue for reports

---
 .../CommandLineIngestManager.java             |  63 ++-
 .../autopsy/report/Bundle.properties          |  15 +-
 .../autopsy/report/Bundle.properties-MERGED   |  15 +-
 .../autopsy/report/Bundle_ja.properties       |   4 +
 .../autopsy/report/ReportBranding.java        |   2 +-
 ...ssDialog.form => ReportProgressPanel.form} |   8 +-
 .../autopsy/report/ReportProgressPanel.java   | 349 ++++++++++++++-
 .../report/infrastructure/Bundle.properties   |  13 -
 .../infrastructure/Bundle.properties-MERGED   |  19 +-
 .../infrastructure/Bundle_ja.properties       |   4 -
 .../infrastructure/ReportGenerationPanel.java |  14 +-
 .../infrastructure/ReportGenerator.java       | 129 +++---
 .../infrastructure/ReportProgressDialog.java  | 405 ------------------
 .../ReportProgressIndicator.java              | 140 ++++++
 .../infrastructure/ReportProgressLogger.java  | 172 --------
 .../infrastructure/ReportWizardAction.java    |  20 +-
 .../infrastructure/ReportingConfigLoader.java |  48 ++-
 .../infrastructure/TableReportGenerator.java  |  16 +-
 .../modules/bodyfile/BodyFileReport.java      |   2 +-
 .../caseuco/CaseUcoFormatExporter.java        |   2 +-
 .../autopsy/report/modules/kml/KMLReport.java |   2 +-
 .../PortableCaseReportModule.java             |   2 +-
 .../report/modules/stix/STIXReportModule.java |   2 +-
 .../SaveTaggedHashesToHashDb.java             |   2 +-
 24 files changed, 693 insertions(+), 755 deletions(-)
 rename Core/src/org/sleuthkit/autopsy/report/{infrastructure/ReportProgressDialog.form => ReportProgressPanel.form} (86%)
 mode change 100755 => 100644 Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
 delete mode 100644 Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressDialog.java
 create mode 100755 Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java
 delete mode 100755 Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressLogger.java

diff --git a/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java b/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java
index 9768547546..578ffd5ef3 100755
--- a/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java
+++ b/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java
@@ -62,15 +62,16 @@ import org.sleuthkit.autopsy.ingest.IngestModuleError;
 import org.sleuthkit.autopsy.ingest.IngestProfiles;
 import org.sleuthkit.autopsy.modules.interestingitems.FilesSet;
 import org.sleuthkit.autopsy.modules.interestingitems.FilesSetsManager;
-import org.sleuthkit.autopsy.report.infrastructure.ReportProgressLogger;
+import org.sleuthkit.autopsy.progress.LoggingProgressIndicator;
 import org.sleuthkit.autopsy.report.infrastructure.ReportGenerator;
+import org.sleuthkit.autopsy.report.infrastructure.ReportProgressIndicator;
 import org.sleuthkit.datamodel.Content;
 import org.sleuthkit.datamodel.TskCoreException;
 
 /**
- * Allows Autopsy to be invoked with a command line arguments. Causes Autopsy to
- * create a case, add a specified data source, run ingest on that data source, 
- * list all data source in a case, generate reports.
+ * Allows Autopsy to be invoked with a command line arguments. Arguments exist
+ * to cause Autopsy to create a case, add a specified data source, run ingest on
+ * that data source, list all data sources in a case, and generate reports.
  */
 public class CommandLineIngestManager {
 
@@ -285,7 +286,8 @@ public class CommandLineIngestManager {
                                     }
 
                                     // generate reports
-                                    ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), new ReportProgressLogger()); //NON-NLS
+                                    ReportProgressIndicator progressIndicator = new ReportProgressIndicator(new LoggingProgressIndicator());
+                                    ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), progressIndicator); //NON-NLS
                                     generator.generateReports();
                                 } catch (CaseActionException ex) {
                                     String caseDirPath = command.getInputs().get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
@@ -332,9 +334,10 @@ public class CommandLineIngestManager {
          * Creates a new case using arguments passed in from command line
          * CREATE_CASE command.
          *
-         * @param baseCaseName Case name
+         * @param baseCaseName        Case name
          * @param rootOutputDirectory Full path to directory in which case
-         * output folder will be created
+         *                            output folder will be created
+         *
          * @throws CaseActionException
          */
         private void openCase(String baseCaseName, String rootOutputDirectory) throws CaseActionException {
@@ -363,6 +366,7 @@ public class CommandLineIngestManager {
          * Opens existing case.
          *
          * @param caseFolderPath full path to case directory
+         *
          * @throws CaseActionException
          */
         private void openCase(String caseFolderPath) throws CaseActionException {
@@ -415,11 +419,34 @@ public class CommandLineIngestManager {
          * @param dataSource The data source.
          *
          * @throws
-         * AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException if
-         * there was a DSP processing error
+         * AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorExceptioif
+         *                                                                     there
+         *                                                                     was
+         *                                                                     a
+         *                                                                     DSP
+         *                                                                     processing
+         *                                                                     error
          *
-         * @throws InterruptedException  if the thread running the job processing 
-         * task is interrupted while blocked, i.e., if auto ingest is shutting down.
+         * @throws
+         *                                                                               InterruptedException                                                  if
+         *                                                                               the
+         *                                                                               thread
+         *                                                                               running
+         *                                                                               the
+         *                                                                               job
+         *                                                                               processing
+         *                                                                               task
+         *                                                                               is
+         *                                                                               interrupted
+         *                                                                               while
+         *                                                                               blocked,
+         *                                                                               i.e.,
+         *                                                                               if
+         *                                                                               auto
+         *                                                                               ingest
+         *                                                                               is
+         *                                                                               shutting
+         *                                                                               down.
          */
         private void runDataSourceProcessor(Case caseForJob, AutoIngestDataSource dataSource) throws InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException {
 
@@ -520,14 +547,15 @@ public class CommandLineIngestManager {
          * profile (profile = ingest context + ingest filter) for ingest.
          * Otherwise use baseline configuration.
          *
-         * @param dataSource The data source to analyze.
+         * @param dataSource        The data source to analyze.
          * @param ingestProfileName Name of ingest profile to use (optional)
          *
          * @throws AnalysisStartupException if there is an error analyzing the
-         * data source.
-         * @throws InterruptedException if the thread running the job processing
-         * task is interrupted while blocked, i.e., if auto ingest is shutting
-         * down.
+         *                                  data source.
+         * @throws InterruptedException     if the thread running the job
+         *                                  processing task is interrupted while
+         *                                  blocked, i.e., if auto ingest is
+         *                                  shutting down.
          */
         private void analyze(AutoIngestDataSource dataSource, String ingestProfileName) throws AnalysisStartupException, InterruptedException {
 
@@ -628,6 +656,7 @@ public class CommandLineIngestManager {
          * ingest profiles.
          *
          * @param ingestProfileName Ingest profile name
+         *
          * @return IngestProfile object, or NULL if the profile doesn't exist
          */
         private IngestProfiles.IngestProfile getSelectedProfile(String ingestProfileName) {
@@ -649,6 +678,7 @@ public class CommandLineIngestManager {
          * filters (custom and standard).
          *
          * @param filterName Name of the file filter
+         *
          * @return FilesSet object, or NULL if the filter doesn't exist
          */
         private FilesSet getSelectedFilter(String filterName) {
@@ -711,6 +741,7 @@ public class CommandLineIngestManager {
          * Returns full path to directory where command outputs should be saved.
          *
          * @param caseForJob Case object
+         *
          * @return Full path to directory where command outputs should be saved
          */
         private String getOutputDirPath(Case caseForJob) {
diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties
index 2a296c830d..7ad1d6fca4 100644
--- a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties
@@ -1,4 +1,17 @@
 OpenIDE-Module-Name=Report
 DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
 ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
-ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
\ No newline at end of file
+ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
+ReportProgressPanel.pathLabel.text=pathLabel
+ReportProgressPanel.reportLabel.text=reportLabel
+ReportProgressPanel.statusMessageLabel.text=processingLabel
+ReportProgressPanel.separationLabel.text=:
+ReportProgressPanel.progress.queuing=Queuing...
+ReportProgressPanel.initPathLabel.noFile=No report file
+ReportProgressPanel.start.cancelButton.text=Cancel
+ReportProgressPanel.start.progress.text=Starting report...
+ReportProgressPanel.complete.processLbl.text=Complete
+ReportProgressPanel.complete.processLb2.text=Completed with error
+ReportProgressPanel.complete.cancelButton.text=Complete
+ReportProgressPanel.cancel.cancelButton.toolTipText=Canceled
+ReportProgressPanel.cancel.procLbl.text=Canceled
diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED
index 2a296c830d..7ad1d6fca4 100755
--- a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED
@@ -1,4 +1,17 @@
 OpenIDE-Module-Name=Report
 DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
 ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
-ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
\ No newline at end of file
+ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
+ReportProgressPanel.pathLabel.text=pathLabel
+ReportProgressPanel.reportLabel.text=reportLabel
+ReportProgressPanel.statusMessageLabel.text=processingLabel
+ReportProgressPanel.separationLabel.text=:
+ReportProgressPanel.progress.queuing=Queuing...
+ReportProgressPanel.initPathLabel.noFile=No report file
+ReportProgressPanel.start.cancelButton.text=Cancel
+ReportProgressPanel.start.progress.text=Starting report...
+ReportProgressPanel.complete.processLbl.text=Complete
+ReportProgressPanel.complete.processLb2.text=Completed with error
+ReportProgressPanel.complete.cancelButton.text=Complete
+ReportProgressPanel.cancel.cancelButton.toolTipText=Canceled
+ReportProgressPanel.cancel.procLbl.text=Canceled
diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties
index 3e5659464f..f666513e92 100644
--- a/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties
@@ -2,3 +2,7 @@ OpenIDE-Module-Name=\u30ec\u30dd\u30fc\u30c8
 DefaultReportConfigurationPanel.infoLabel.text=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u6b21\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u3067\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002
 ReportBranding.defaultReportTitle.text=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30ec\u30dd\u30fc\u30c8
 ReportBranding.defaultReportFooter.text=Autopsy\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30fb\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306b\u3088\u308a\u63d0\u4f9b - www.sleuthkit.org
+ReportProgressPanel.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
+ReportProgressPanel.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
+ReportProgressPanel.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
+ReportProgressPanel.separationLabel.text=:
diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java b/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java
index ba50f34726..93b4ee0081 100644
--- a/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java
+++ b/Core/src/org/sleuthkit/autopsy/report/ReportBranding.java
@@ -63,7 +63,7 @@ public final class ReportBranding implements ReportBrandingProviderI {
         //initialize with extracting of resource files if needed, ensure 1 writer at a time
         synchronized (ReportBranding.class) {
 
-            reportsBrandingDir = PlatformUtil.getUserConfigDirectory() + File.separator + ReportGenerator.REPORTS_DIR + File.separator
+            reportsBrandingDir = PlatformUtil.getUserConfigDirectory() + File.separator + ReportGenerator.getReportsDirectory() + File.separator
                     + "branding"; //NON-NLS
             File brandingDir = new File(reportsBrandingDir);
             if (!brandingDir.exists()) {
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressDialog.form b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.form
similarity index 86%
rename from Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressDialog.form
rename to Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.form
index 08cd8ec3f4..597dd89df4 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressDialog.form
+++ b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.form
@@ -79,7 +79,7 @@
           
         
         
-          
+          
         
       
     
@@ -91,7 +91,7 @@
           
         
         
-          
+          
         
         
       
@@ -104,14 +104,14 @@
           
         
         
-          
+          
         
       
     
     
       
         
-          
+          
         
       
     
diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
old mode 100755
new mode 100644
index 486e54789f..f3128a7290
--- a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
@@ -1,7 +1,7 @@
 /*
  * Autopsy Forensic Browser
  *
- * Copyright 2011-2019 Basis Technology Corp.
+ * Copyright 2012-2019 Basis Technology Corp.
  * Contact: carrier  sleuthkit  org
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,11 +18,30 @@
  */
 package org.sleuthkit.autopsy.report;
 
+import org.openide.util.NbBundle;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Desktop;
+import java.awt.EventQueue;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.autopsy.report.infrastructure.ReportProgressIndicator;
+
 /**
- * This interface is necessary in order to not break backwards compatibility of
- * GeneralReportModule interface. See JIRA-5354.
+ * A panel used by a report generation module to show progress.
  */
-public interface ReportProgressPanel {
+@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
+public class ReportProgressPanel extends javax.swing.JPanel {
+
+    private static final long serialVersionUID = 1L;
+    private static final Logger logger = Logger.getLogger(ReportProgressPanel.class.getName());
+    private static final Color GREEN = new Color(50, 205, 50);
+    private static final Color RED = new Color(178, 34, 34);
+    private volatile ReportStatus status;
 
     /**
      * Used by a report generation module to communicate report generation
@@ -37,46 +56,155 @@ public interface ReportProgressPanel {
         ERROR
     }
 
+    /**
+     * Constructs a panel used by report generation module to show progress.
+     */
+    public ReportProgressPanel() {
+        initComponents();
+        reportProgressBar.setIndeterminate(true);
+        reportProgressBar.setMaximum(100);
+        statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.progress.queuing"));
+        status = ReportStatus.QUEUING;
+        reportLabel.setText("");
+        pathLabel.setText(""); //NON-NLS
+    }
+
+    /**
+     * Sets label text.
+     *
+     * @param reportName The name of the report being generated.
+     * @param reportPath The path to the report file.
+     */
+    public void setLabels(String reportName, String reportPath) {
+        reportLabel.setText(reportName);
+        if (null != reportPath) {
+            pathLabel.setText("" + shortenPath(reportPath) + ""); //NON-NLS
+            pathLabel.setToolTipText(reportPath);
+            String linkPath = reportPath;
+            pathLabel.addMouseListener(new MouseListener() {
+
+                @Override
+                public void mouseClicked(MouseEvent mouseEvent) {
+                }
+
+                @Override
+                public void mousePressed(MouseEvent mouseEvent) {
+                }
+
+                @Override
+                public void mouseReleased(MouseEvent mouseEvent) {
+                    File file = new File(linkPath);
+                    try {
+                        Desktop.getDesktop().open(file);
+                    } catch (IOException ioex) {
+                        logger.log(Level.SEVERE, "Error opening report file", ioex);
+                    } catch (IllegalArgumentException iaEx) {
+                        logger.log(Level.SEVERE, "Error opening report file", iaEx);
+                        try {
+                            Desktop.getDesktop().open(file.getParentFile());
+                        } catch (IOException ioEx2) {
+                            logger.log(Level.SEVERE, "Error opening report file parent", ioEx2);
+                        }
+                    }
+                }
+
+                @Override
+                public void mouseEntered(MouseEvent e3) {
+                    pathLabel.setForeground(Color.DARK_GRAY);
+                    setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+                }
+
+                @Override
+                public void mouseExited(MouseEvent e4) {
+                    pathLabel.setForeground(Color.BLACK);
+                    setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+                }
+            });
+        } else {
+            pathLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.initPathLabel.noFile"));
+        }
+    }
+
     /**
      * Gets the current status of the generation of the report.
      *
      * @return The report generation status as a ReportStatus enum.
      */
-    public ReportStatus getStatus();
+    public ReportStatus getStatus() {
+        return status;
+    }
+
+    /**
+     * Sets the current status of the generation of the report.
+     *
+     * @param status The current status.
+     */
+    protected void setStatus(ReportStatus status) {
+        this.status = status;
+    }
 
     /**
      * Starts the progress bar component of this panel.
      */
-    public void start();
+    public void start() {
+        EventQueue.invokeLater(() -> {
+            statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.start.progress.text"));
+            status = ReportStatus.RUNNING;
+        });
+    }
 
     /**
      * Sets the maximum value of the progress bar component of this panel.
      *
      * @param max The maximum value.
      */
-    public void setMaximumProgress(int max);
+    public void setMaximumProgress(int max) {
+        EventQueue.invokeLater(() -> {
+            if (status != ReportStatus.CANCELED) {
+                reportProgressBar.setMaximum(max);
+            }
+        });
+    }
 
     /**
      * Increments the current value of the progress bar component of this panel
      * by one unit.
      */
-    public void increment();
+    public void increment() {
+        EventQueue.invokeLater(() -> {
+            if (status != ReportStatus.CANCELED) {
+                reportProgressBar.setValue(reportProgressBar.getValue() + 1);
+            }
+        });
+    }
 
     /**
      * Sets the current value of the progress bar component of this panel.
      *
      * @param value The value to be set.
      */
-    public void setProgress(int value);
+    public void setProgress(int value) {
+        EventQueue.invokeLater(() -> {
+            if (status != ReportStatus.CANCELED) {
+                reportProgressBar.setValue(value);
+            }
+        });
+    }
 
     /**
      * Changes the the progress bar component of this panel to be determinate or
      * indeterminate.
      *
      * @param indeterminate True if the progress bar should be set to
-     * indeterminate.
+     *                      indeterminate.
      */
-    public void setIndeterminate(boolean indeterminate);
+    public void setIndeterminate(boolean indeterminate) {
+        EventQueue.invokeLater(() -> {
+            if (status != ReportStatus.CANCELED) {
+                reportProgressBar.setIndeterminate(indeterminate);
+            }
+        });
+    }
 
     /**
      * Changes the status message label component of this panel to show a given
@@ -85,7 +213,13 @@ public interface ReportProgressPanel {
      *
      * @param statusMessage String to use as label text.
      */
-    public void updateStatusLabel(String statusMessage);
+    public void updateStatusLabel(String statusMessage) {
+        EventQueue.invokeLater(() -> {
+            if (status != ReportStatus.CANCELED) {
+                statusMessageLabel.setText(statusMessage);
+            }
+        });
+    }
 
     /**
      * Makes the components of this panel indicate the final status of
@@ -93,16 +227,196 @@ public interface ReportProgressPanel {
      *
      * @param reportStatus The final status, must be COMPLETE or ERROR.
      */
-    public void complete(ReportStatus reportStatus);
+    public void complete(ReportStatus reportStatus) {
+
+        switch (reportStatus) {
+            case COMPLETE:
+                complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLbl.text"));
+                break;
+            case ERROR:
+                complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLb2.text"));
+                break;
+            default:
+                complete(reportStatus, "");
+                break;
+        }
+    }
 
     /**
      * Makes the components of this panel indicate the final status of
      * generation of the report.
      *
-     * @param reportStatus The final status, must be COMPLETE or ERROR.
+     * @param reportStatus  The final status, must be COMPLETE or ERROR.
      * @param statusMessage String to use as label or error text.
      */
-    public void complete(ReportStatus reportStatus, String statusMessage);
+    public void complete(ReportStatus reportStatus, String statusMessage) {
+        EventQueue.invokeLater(() -> {
+            reportProgressBar.setIndeterminate(false);
+            if (status != ReportStatus.CANCELED) {
+                switch (reportStatus) {
+                    case COMPLETE: {
+                        ReportStatus oldValue = status;
+                        status = ReportStatus.COMPLETE;
+                        statusMessageLabel.setForeground(Color.BLACK);
+                        statusMessageLabel.setText(statusMessage);
+                        reportProgressBar.setValue(reportProgressBar.getMaximum());
+                        reportProgressBar.setStringPainted(true);
+                        reportProgressBar.setForeground(GREEN);
+                        reportProgressBar.setString("Complete"); //NON-NLS
+                        firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
+                        break;
+                    }
+                    case ERROR: {
+                        ReportStatus oldValue = status;
+                        status = ReportStatus.ERROR;
+                        statusMessageLabel.setForeground(RED);
+                        statusMessageLabel.setText(statusMessage);
+                        reportProgressBar.setValue(reportProgressBar.getMaximum());
+                        reportProgressBar.setStringPainted(true);
+                        reportProgressBar.setForeground(RED);
+                        reportProgressBar.setString("Error"); //NON-NLS
+                        firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
+                        break;
+                    }
+                    default: {
+                        break;
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * Makes the components of this panel indicate generation of the report was
+     * cancelled.
+     */
+    public void cancel() {
+        switch (status) {
+            case COMPLETE:
+                break;
+            case CANCELED:
+                break;
+            case ERROR:
+                break;
+            default:
+                ReportStatus oldValue = status;
+                status = ReportStatus.CANCELED;
+                reportProgressBar.setIndeterminate(false);
+                reportProgressBar.setValue(0);
+                reportProgressBar.setStringPainted(true);
+                reportProgressBar.setForeground(RED); // Red
+                reportProgressBar.setString("Cancelled"); //NON-NLS
+                firePropertyChange(ReportStatus.CANCELED.toString(), oldValue, status);
+                statusMessageLabel.setForeground(RED);
+                statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.cancel.procLbl.text"));
+                break;
+        }
+    }
+
+    /**
+     * Gets a shortened version of a file path.
+     *
+     * @param path The path to shorten.
+     *
+     * @return The shortened path.
+     */
+    private String shortenPath(String path) {
+        if (path.length() > 100) {
+            return path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) + "..."
+                    + path.substring((path.length() - 70) + path.substring(path.length() - 70).indexOf(File.separator));
+        } else {
+            return path;
+        }
+    }
+
+    /**
+     * This method is called from within the constructor to initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // //GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        reportProgressBar = new javax.swing.JProgressBar();
+        reportLabel = new javax.swing.JLabel();
+        pathLabel = new javax.swing.JLabel();
+        separationLabel = new javax.swing.JLabel();
+        statusMessageLabel = new javax.swing.JLabel();
+
+        setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
+        setMinimumSize(new java.awt.Dimension(486, 68));
+
+        reportProgressBar.setFont(reportProgressBar.getFont().deriveFont(reportProgressBar.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
+
+        reportLabel.setFont(reportLabel.getFont().deriveFont(reportLabel.getFont().getStyle() | java.awt.Font.BOLD, 11));
+        org.openide.awt.Mnemonics.setLocalizedText(reportLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.reportLabel.text")); // NOI18N
+
+        pathLabel.setFont(pathLabel.getFont().deriveFont(pathLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
+        org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.pathLabel.text")); // NOI18N
+        pathLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
+
+        separationLabel.setFont(separationLabel.getFont().deriveFont(separationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
+        org.openide.awt.Mnemonics.setLocalizedText(separationLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.separationLabel.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(statusMessageLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.statusMessageLabel.text")); // NOI18N
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(statusMessageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addComponent(reportProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(reportLabel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(separationLabel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE)))
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(reportProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(reportLabel)
+                    .addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addComponent(separationLabel))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(statusMessageLabel)
+                .addGap(13, 13, 13))
+        );
+    }// //GEN-END:initComponents
+
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JLabel pathLabel;
+    private javax.swing.JLabel reportLabel;
+    private javax.swing.JProgressBar reportProgressBar;
+    private javax.swing.JLabel separationLabel;
+    private javax.swing.JLabel statusMessageLabel;
+    // End of variables declaration//GEN-END:variables
+
+    /**
+     * Constructs a panel used by a report generation module to show progress.
+     *
+     * @param reportName The report name.
+     * @param reportPath The report path.
+     *
+     * @deprecated Use {@link #ReportProgressPanel()} and {@link #setLabels()}
+     * instead.
+     */
+    @Deprecated
+    public ReportProgressPanel(String reportName, String reportPath) {
+        this();
+        setLabels(reportName, reportPath);
+    }
 
     /**
      * Makes the components of this panel indicate the generation of the report
@@ -111,5 +425,8 @@ public interface ReportProgressPanel {
      * @deprecated Use {@link #complete(ReportStatus)}
      */
     @Deprecated
-    public void complete();
+    public void complete() {
+        complete(ReportStatus.COMPLETE);
+    }
+
 }
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties
index 38c1f3696d..c6f840be32 100755
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties
@@ -6,10 +6,6 @@ ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
 ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
 ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
 ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
-ReportProgressDialog.reportLabel.text=reportLabel
-ReportProgressDialog.statusMessageLabel.text=processingLabel
-ReportProgressDialog.separationLabel.text=:
-ReportProgressDialog.pathLabel.text=pathLabel
 PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
 PortableCaseTagsListPanel.deselectButton.text=Deselect All
 PortableCaseTagsListPanel.selectButton.text=Select All
@@ -151,15 +147,6 @@ ReportGenerator.artTableColHdr.localPath=Local path
 ReportGenerator.artTableColHdr.remotePath=Remote path
 ReportGenerator.errors.reportErrorTitle=Error generating report
 ReportGenerator.errors.reportErrorText=Error generating report: 
-ReportProgressDialog.progress.queuing=Queuing...
-ReportProgressDialog.initPathLabel.noFile=No report file
-ReportProgressDialog.start.cancelButton.text=Cancel
-ReportProgressDialog.start.progress.text=Starting report...
-ReportProgressDialog.complete.processLbl.text=Complete
-ReportProgressDialog.complete.processLb2.text=Completed with error
-ReportProgressDialog.complete.cancelButton.text=Complete
-ReportProgressDialog.cancel.cancelButton.toolTipText=Canceled
-ReportProgressDialog.cancel.procLbl.text=Canceled
 ReportVisualPanel1.getName.text=Select and Configure Report Modules
 ReportVisualPanel2.getName.text=Configure Report
 ReportWizardAction.actionName.text=Generate Report
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED
index b2ca427081..c3bca8db45 100755
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED
@@ -9,16 +9,18 @@ PortableCaseTagsListPanel.error.noOpenCase=There is no case open
 ReportGenerator.artTableColHdr.comment=Comment
 ReportGenerator.errList.noOpenCase=No open case available.
 ReportGenerator.tagTable.header.userName=User Name
+ReportProgressIndicator.cancelledMessage=Report generation cancelled
+ReportProgressIndicator.completedMessage=Report generation completed
+ReportProgressIndicator.completedWithErrorsMessage=Report generation completed with errors
+ReportProgressIndicator.startMessage=Report generation started
+ReportProgressIndicator.switchToDeterminateMessage=Report generation progress switched to determinate
+ReportProgressIndicator.switchToIndeterminateMessage=Report generation progress switched to indeterminate
 ReportWizardFileOptionsVisualPanel.jLabel1.text=Select items to include in File Report:
 ReportWizardFileOptionsVisualPanel.deselectAllButton.text=Deselect All
 ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
 ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
 ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
 ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
-ReportProgressDialog.reportLabel.text=reportLabel
-ReportProgressDialog.statusMessageLabel.text=processingLabel
-ReportProgressDialog.separationLabel.text=:
-ReportProgressDialog.pathLabel.text=pathLabel
 PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
 PortableCaseTagsListPanel.deselectButton.text=Deselect All
 PortableCaseTagsListPanel.selectButton.text=Select All
@@ -160,15 +162,6 @@ ReportGenerator.artTableColHdr.localPath=Local path
 ReportGenerator.artTableColHdr.remotePath=Remote path
 ReportGenerator.errors.reportErrorTitle=Error generating report
 ReportGenerator.errors.reportErrorText=Error generating report: 
-ReportProgressDialog.progress.queuing=Queuing...
-ReportProgressDialog.initPathLabel.noFile=No report file
-ReportProgressDialog.start.cancelButton.text=Cancel
-ReportProgressDialog.start.progress.text=Starting report...
-ReportProgressDialog.complete.processLbl.text=Complete
-ReportProgressDialog.complete.processLb2.text=Completed with error
-ReportProgressDialog.complete.cancelButton.text=Complete
-ReportProgressDialog.cancel.cancelButton.toolTipText=Canceled
-ReportProgressDialog.cancel.procLbl.text=Canceled
 ReportVisualPanel1.getName.text=Select and Configure Report Modules
 ReportVisualPanel2.getName.text=Configure Report
 ReportWizardAction.actionName.text=Generate Report
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle_ja.properties
index 6aefb4b05b..c911dd381d 100755
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle_ja.properties
@@ -2,10 +2,6 @@ CTL_ReportWizardAction=\u30ec\u30dd\u30fc\u30c8\u3092\u5b9f\u884c
 ReportWizardFileOptionsVisualPanel.selectAllButton.text=\u5168\u3066\u9078\u629e
 ReportWizardFileOptionsVisualPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u306b\u542b\u3081\u308b\u30a2\u30a4\u30c6\u30e0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
 ReportWizardFileOptionsVisualPanel.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
-ReportProgressDialog.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
-ReportProgressDialog.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
-ReportProgressDialog.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
-ReportProgressDialog.separationLabel.text=:
 ReportGenerationPanel.closeButton.text=\u9589\u3058\u308b
 ReportGenerationPanel.cancelButton.actionCommand=\u30ad\u30e3\u30f3\u30bb\u30eb
 ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerationPanel.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerationPanel.java
index ec391d6d93..021c330372 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerationPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerationPanel.java
@@ -1,7 +1,7 @@
 /*
  * Autopsy Forensic Browser
  *
- * Copyright 2011-2018 Basis Technology Corp.
+ * Copyright 2012-2018 Basis Technology Corp.
  * Contact: carrier  sleuthkit  org
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,21 +25,21 @@ import javax.swing.Box;
 import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
 import org.openide.util.NbBundle;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  * A panel that displays a panel used by a report generation module to show
  * progress. It provides OK and Cancel buttons.
  */
 @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
-class ReportGenerationPanel extends javax.swing.JPanel {
+final class ReportGenerationPanel extends javax.swing.JPanel {
 
     private static final long serialVersionUID = 1L;
     private final GridBagConstraints constraints;
     private final Component glue;
     private ActionListener actionListener;
-    ReportProgressDialog progressPanel;
+    private final ReportProgressPanel progressPanel;
 
     /**
      * Constructs a panel that displays a panel used by a report generation
@@ -54,10 +54,10 @@ class ReportGenerationPanel extends javax.swing.JPanel {
         constraints.gridy = 0;
         constraints.weightx = 1.0;
         glue = Box.createVerticalGlue();
-        progressPanel = new ReportProgressDialog();
+        progressPanel = new ReportProgressPanel();
     }
-    
-    ReportProgressDialog getProgressPanel() {
+
+    ReportProgressPanel getProgressPanel() {
         return progressPanel;
     }
 
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
index 68d69ed88f..8e21086b55 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
@@ -41,7 +41,6 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.logging.Level;
 import javax.swing.JDialog;
-import javax.swing.JFrame;
 import org.openide.filesystems.FileUtil;
 import org.openide.util.NbBundle;
 import org.openide.windows.WindowManager;
@@ -55,24 +54,33 @@ import org.sleuthkit.datamodel.SleuthkitCase;
 import org.sleuthkit.datamodel.TskCoreException;
 import org.sleuthkit.datamodel.TskData;
 
+/**
+ * A report generator that generates one or more reports by running
+ * user-selected report modules.
+ */
 public class ReportGenerator {
 
     private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
-
-    private ReportProgressPanel progressPanel = null;
-    private ReportGenerationPanel reportGenerationPanel = null;
-
     private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
-
+    private static final String REPORTS_DIR = "Reports"; //NON-NLS
     private final String configName;
-
-    public static final String REPORTS_DIR = "Reports"; //NON-NLS
-
-    private List errorList;
+    private final ReportGenerationPanel reportGenerationPanel;
+    private final ReportProgressPanel progressIndicator;
+    private List errorList = new ArrayList<>();
 
     /**
-     * Displays the list of errors during report generation in user-friendly
-     * way.
+     * Gets the name of the reports directory within the case direcotry
+     * hierarchy.
+     *
+     * @return The directory name.
+     */
+    public static String getReportsDirectory() {
+        return REPORTS_DIR;
+    }
+
+    /**
+     * Displays a list of errors emitted by report modules during report
+     * generation using this report generator's report progress indicator.
      */
     private void displayReportErrors() {
         if (!errorList.isEmpty()) {
@@ -80,41 +88,41 @@ public class ReportGenerator {
             for (String error : errorList) {
                 errorString += error + "\n";
             }
-            progressPanel.updateStatusLabel(errorString);
+            progressIndicator.updateStatusLabel(errorString);
         }
     }
 
     /**
-     * Creates a report generator. This constructor uses a logger instead of UI
-     * panel.
+     * Constructs a report generator that generates one or more reports by
+     * running user-selected report modules and uses a report generation panel
+     * to display progress.
      *
-     * @param configName Name of the reporting configuration to use
-     * @param progress Fully instantiated progress logger
-     */
-    public ReportGenerator(String configName, ReportProgressLogger progress) {
-        this.errorList = new ArrayList<>();
-        this.progressPanel = progress;
-        this.reportGenerationPanel = null;
-        this.configName = configName;
-    }
-
-    /**
-     * Creates a report generator. This constructor uses UI panel to display
-     * progress.
-     *
-     * @param configName Name of the reporting configuration to use
-     * @param panel Fully instantiated progress panel
+     * @param configName The name of the reporting configuration to use.
+     * @param panel      The report generation panel.
      */
     public ReportGenerator(String configName, ReportGenerationPanel panel) {
-        this.errorList = new ArrayList<>();
-        this.reportGenerationPanel = panel;
-        this.progressPanel = panel.getProgressPanel();
         this.configName = configName;
+        this.reportGenerationPanel = panel;
+        this.progressIndicator = panel.getProgressPanel();
     }
 
     /**
-     * Generate reports according to previously specified reporting
-     * configuration.
+     * Constructs a report generator that generates one or more reports by
+     * running user-selected report modules and uses a report progress indicator
+     * to display progress.
+     *
+     * @param configName        The name of the reporting configuration to use.
+     * @param progressIndicator The report progress indicator.
+     */
+    public ReportGenerator(String configName, ReportProgressIndicator progressIndicator) {
+        this.configName = configName;
+        this.reportGenerationPanel = null;
+        this.progressIndicator = progressIndicator;
+    }
+
+    /**
+     * Generates the reports specified by the reporting configuration passed in
+     * via the constructor.
      */
     public void generateReports() {
         ReportingConfig config = null;
@@ -122,13 +130,13 @@ public class ReportGenerator {
             config = ReportingConfigLoader.loadConfig(configName);
         } catch (ReportConfigException ex) {
             logger.log(Level.SEVERE, "Unable to load reporting configuration " + configName + ". Exiting", ex);
-            progressPanel.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
+            progressIndicator.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
             return;
         }
 
         if (config == null) {
             logger.log(Level.SEVERE, "Unable to load reporting configuration {0}. Exiting", configName);
-            progressPanel.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
+            progressIndicator.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
             return;
         }
 
@@ -162,7 +170,7 @@ public class ReportGenerator {
                 ReportModule module = modules.get(moduleName);
                 if (module == null) {
                     logger.log(Level.SEVERE, "Report module {0} not found", moduleName);
-                    progressPanel.updateStatusLabel("Report module " + moduleName + " not found");
+                    progressIndicator.updateStatusLabel("Report module " + moduleName + " not found");
                     continue;
                 }
 
@@ -189,7 +197,7 @@ public class ReportGenerator {
                         TableReportSettings tableSettings = config.getTableReportSettings();
                         if (tableSettings == null) {
                             logger.log(Level.SEVERE, "No table report settings for report module {0}", moduleName);
-                            progressPanel.updateStatusLabel("No table report settings for report module " + moduleName);
+                            progressIndicator.updateStatusLabel("No table report settings for report module " + moduleName);
                             continue;
                         }
 
@@ -201,7 +209,7 @@ public class ReportGenerator {
                         FileReportSettings fileSettings = config.getFileReportSettings();
                         if (fileSettings == null) {
                             logger.log(Level.SEVERE, "No file report settings for report module {0}", moduleName);
-                            progressPanel.updateStatusLabel("No file report settings for report module " + moduleName);
+                            progressIndicator.updateStatusLabel("No file report settings for report module " + moduleName);
                             continue;
                         }
 
@@ -213,7 +221,7 @@ public class ReportGenerator {
                             settings = new PortableCaseReportModuleSettings();
                         } else if (!(settings instanceof PortableCaseReportModuleSettings)) {
                             logger.log(Level.SEVERE, "Invalid settings for report module {0}", moduleName);
-                            progressPanel.updateStatusLabel("Invalid settings for report module " + moduleName);
+                            progressIndicator.updateStatusLabel("Invalid settings for report module " + moduleName);
                             continue;
                         }
 
@@ -221,12 +229,11 @@ public class ReportGenerator {
 
                     } else {
                         logger.log(Level.SEVERE, "Report module {0} has unsupported report module type", moduleName);
-                        progressPanel.updateStatusLabel("Report module " + moduleName + " has unsupported report module type");
-                        continue;
+                        progressIndicator.updateStatusLabel("Report module " + moduleName + " has unsupported report module type");
                     }
                 } catch (IOException e) {
                     logger.log(Level.SEVERE, "Exception while running report module {0}: {1}", new Object[]{moduleName, e.getMessage()});
-                    progressPanel.updateStatusLabel("Exception while running report module " + moduleName);
+                    progressIndicator.updateStatusLabel("Exception while running report module " + moduleName);
                 }
             }
         } finally {
@@ -244,7 +251,7 @@ public class ReportGenerator {
             return;
         }
 
-        final JDialog dialog = new JDialog((JFrame) WindowManager.getDefault().getMainWindow(), true);
+        final JDialog dialog = new JDialog(WindowManager.getDefault().getMainWindow(), true);
         dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
         dialog.setTitle(NbBundle.getMessage(this.getClass(), "ReportGenerator.displayProgress.title.text"));
         dialog.add(this.reportGenerationPanel);
@@ -275,7 +282,7 @@ public class ReportGenerator {
         if (generalReportModule != null) {
             String reportDir = createReportDirectory(generalReportModule);
             setupProgressPanel(generalReportModule, reportDir);
-            generalReportModule.generateReport(reportDir, progressPanel);
+            generalReportModule.generateReport(reportDir, progressIndicator);
         }
     }
 
@@ -290,11 +297,11 @@ public class ReportGenerator {
             String reportDir = createReportDirectory(tableReport);
             setupProgressPanel(tableReport, reportDir);
             tableReport.startReport(reportDir);
-            TableReportGenerator generator = new TableReportGenerator(tableReportSettings, progressPanel, tableReport);
+            TableReportGenerator generator = new TableReportGenerator(tableReportSettings, progressIndicator, tableReport);
             generator.execute();
             tableReport.endReport();
             // finish progress, wrap up
-            progressPanel.complete(ReportProgressPanel.ReportStatus.COMPLETE);
+            progressIndicator.complete(ReportProgressPanel.ReportStatus.COMPLETE);
             errorList = generator.getErrorList();
         }
     }
@@ -315,34 +322,34 @@ public class ReportGenerator {
                 }
             }
             setupProgressPanel(fileReportModule, reportDir);
-            if (progressPanel.getStatus() != ReportStatus.CANCELED) {
-                progressPanel.start();
-                progressPanel.updateStatusLabel(
+            if (progressIndicator.getStatus() != ReportStatus.CANCELED) {
+                progressIndicator.start();
+                progressIndicator.updateStatusLabel(
                         NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.queryingDb.text"));
             }
 
             List files = getFiles();
             int numFiles = files.size();
-            if (progressPanel.getStatus() != ReportStatus.CANCELED) {
+            if (progressIndicator.getStatus() != ReportStatus.CANCELED) {
                 fileReportModule.startReport(reportDir);
                 fileReportModule.startTable(enabled);
             }
-            progressPanel.setIndeterminate(false);
-            progressPanel.setMaximumProgress(numFiles);
+            progressIndicator.setIndeterminate(false);
+            progressIndicator.setMaximumProgress(numFiles);
 
             int i = 0;
             // Add files to report.
             for (AbstractFile file : files) {
                 // Check to see if any reports have been cancelled.
-                if (progressPanel.getStatus() == ReportStatus.CANCELED) {
+                if (progressIndicator.getStatus() == ReportStatus.CANCELED) {
                     return;
                 } else {
                     fileReportModule.addRow(file, enabled);
-                    progressPanel.increment();
+                    progressIndicator.increment();
                 }
 
                 if ((i % 100) == 0) {
-                    progressPanel.updateStatusLabel(
+                    progressIndicator.updateStatusLabel(
                             NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.processingFile.text",
                                     file.getName()));
                 }
@@ -351,7 +358,7 @@ public class ReportGenerator {
 
             fileReportModule.endTable();
             fileReportModule.endReport();
-            progressPanel.complete(ReportStatus.COMPLETE);
+            progressIndicator.complete(ReportStatus.COMPLETE);
         }
     }
 
@@ -362,7 +369,7 @@ public class ReportGenerator {
         if (portableCaseReportModule != null) {
             String reportDir = createReportDirectory(portableCaseReportModule);
             setupProgressPanel(portableCaseReportModule, reportDir);
-            portableCaseReportModule.generateReport(reportDir, settings, progressPanel);
+            portableCaseReportModule.generateReport(reportDir, settings, progressIndicator);
         }
     }
 
@@ -378,7 +385,7 @@ public class ReportGenerator {
             absFiles = skCase.findAllFilesWhere("meta_type != " + TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue()); //NON-NLS
             return absFiles;
         } catch (TskCoreException | NoCurrentCaseException ex) {
-            progressPanel.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage());
+            progressIndicator.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage());
             logger.log(Level.SEVERE, "failed to generate reports. Unable to get all files in the image.", ex); //NON-NLS
             return Collections.emptyList();
         }
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressDialog.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressDialog.java
deleted file mode 100644
index 6116edc3d0..0000000000
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressDialog.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2011-2019 Basis Technology Corp.
- * Contact: carrier  sleuthkit  org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.report.infrastructure;
-
-import org.openide.util.NbBundle;
-import java.awt.Color;
-import java.awt.Cursor;
-import java.awt.Desktop;
-import java.awt.EventQueue;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.io.File;
-import java.io.IOException;
-import java.util.logging.Level;
-import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
-
-/**
- * A panel used by a report generation module to show progress.
- */
-@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
-class ReportProgressDialog extends javax.swing.JPanel implements ReportProgressPanel {
-
-    private static final long serialVersionUID = 1L;
-    private static final Logger logger = Logger.getLogger(ReportProgressDialog.class.getName());
-    private static final Color GREEN = new Color(50, 205, 50);
-    private static final Color RED = new Color(178, 34, 34);
-    private volatile ReportProgressPanel.ReportStatus status;
-
-    /**
-     * Constructs a panel used by report generation module to show progress.
-     */
-    ReportProgressDialog() {
-        initComponents();
-        reportProgressBar.setIndeterminate(true);
-        reportProgressBar.setMaximum(100);
-        statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.progress.queuing"));
-        status = ReportStatus.QUEUING;
-        reportLabel.setText("");
-        pathLabel.setText(""); //NON-NLS
-    }
-
-    /**
-     * Sets label text.
-     *
-     * @param reportName The name of the report being generated.
-     * @param reportPath The path to the report file.
-     */
-    void setLabels(String reportName, String reportPath) {
-        reportLabel.setText(reportName);
-        if (null != reportPath) {
-            pathLabel.setText("" + shortenPath(reportPath) + ""); //NON-NLS
-            pathLabel.setToolTipText(reportPath);
-            String linkPath = reportPath;
-            pathLabel.addMouseListener(new MouseListener() {
-
-                @Override
-                public void mouseClicked(MouseEvent mouseEvent) {
-                }
-
-                @Override
-                public void mousePressed(MouseEvent mouseEvent) {
-                }
-
-                @Override
-                public void mouseReleased(MouseEvent mouseEvent) {
-                    File file = new File(linkPath);
-                    try {
-                        Desktop.getDesktop().open(file);
-                    } catch (IOException ioex) {
-                        logger.log(Level.SEVERE, "Error opening report file", ioex);
-                    } catch (IllegalArgumentException iaEx) {
-                        logger.log(Level.SEVERE, "Error opening report file", iaEx);
-                        try {
-                            Desktop.getDesktop().open(file.getParentFile());
-                        } catch (IOException ioEx2) {
-                            logger.log(Level.SEVERE, "Error opening report file parent", ioEx2);
-                        }
-                    }
-                }
-
-                @Override
-                public void mouseEntered(MouseEvent e3) {
-                    pathLabel.setForeground(Color.DARK_GRAY);
-                    setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
-                }
-
-                @Override
-                public void mouseExited(MouseEvent e4) {
-                    pathLabel.setForeground(Color.BLACK);
-                    setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
-                }
-            });
-        } else {
-            pathLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.initPathLabel.noFile"));
-        }
-    }
-
-    /**
-     * Gets the current status of the generation of the report.
-     *
-     * @return The report generation status as a ReportStatus enum.
-     */
-    @Override
-    public ReportStatus getStatus() {
-        return status;
-    }
-
-    /**
-     * Starts the progress bar component of this panel.
-     */
-    @Override
-    public void start() {
-        EventQueue.invokeLater(() -> {
-            statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.start.progress.text"));
-            status = ReportStatus.RUNNING;
-        });
-    }
-
-    /**
-     * Sets the maximum value of the progress bar component of this panel.
-     *
-     * @param max The maximum value.
-     */
-    @Override
-    public void setMaximumProgress(int max) {
-        EventQueue.invokeLater(() -> {
-            if (status != ReportStatus.CANCELED) {
-                reportProgressBar.setMaximum(max);
-            }
-        });
-    }
-
-    /**
-     * Increments the current value of the progress bar component of this panel
-     * by one unit.
-     */
-    @Override
-    public void increment() {
-        EventQueue.invokeLater(() -> {
-            if (status != ReportStatus.CANCELED) {
-                reportProgressBar.setValue(reportProgressBar.getValue() + 1);
-            }
-        });
-    }
-
-    /**
-     * Sets the current value of the progress bar component of this panel.
-     *
-     * @param value The value to be set.
-     */
-    @Override
-    public void setProgress(int value) {
-        EventQueue.invokeLater(() -> {
-            if (status != ReportStatus.CANCELED) {
-                reportProgressBar.setValue(value);
-            }
-        });
-    }
-
-    /**
-     * Changes the the progress bar component of this panel to be determinate or
-     * indeterminate.
-     *
-     * @param indeterminate True if the progress bar should be set to
-     * indeterminate.
-     */
-    @Override
-    public void setIndeterminate(boolean indeterminate) {
-        EventQueue.invokeLater(() -> {
-            if (status != ReportStatus.CANCELED) {
-                reportProgressBar.setIndeterminate(indeterminate);
-            }
-        });
-    }
-
-    /**
-     * Changes the status message label component of this panel to show a given
-     * processing status message. For example, updateStatusLabel("Now processing
-     * files...") sets the label text to "Now processing files..."
-     *
-     * @param statusMessage String to use as label text.
-     */
-    @Override
-    public void updateStatusLabel(String statusMessage) {
-        EventQueue.invokeLater(() -> {
-            if (status != ReportStatus.CANCELED) {
-                statusMessageLabel.setText(statusMessage);
-            }
-        });
-    }
-    
-    /**
-     * Makes the components of this panel indicate the final status of
-     * generation of the report.
-     *
-     * @param reportStatus The final status, must be COMPLETE or ERROR.
-     */
-    @Override
-    public void complete(ReportStatus reportStatus) {
-        
-        switch (reportStatus) {
-            case COMPLETE:
-                complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressDialog.complete.processLbl.text"));
-                break;
-            case ERROR:
-                complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressDialog.complete.processLb2.text"));
-                break;
-            default:
-                complete(reportStatus, "");
-                break;
-        }        
-    }
-
-    /**
-     * Makes the components of this panel indicate the final status of
-     * generation of the report.
-     *
-     * @param reportStatus The final status, must be COMPLETE or ERROR.
-     * @param statusMessage String to use as label or error text.
-     */
-    @Override
-    public void complete(ReportStatus reportStatus, String statusMessage) {
-        EventQueue.invokeLater(() -> {
-            reportProgressBar.setIndeterminate(false);
-            if (status != ReportStatus.CANCELED) {
-                switch (reportStatus) {
-                    case COMPLETE: {
-                        ReportStatus oldValue = status;
-                        status = ReportStatus.COMPLETE;
-                        statusMessageLabel.setForeground(Color.BLACK);
-                        statusMessageLabel.setText(statusMessage);
-                        reportProgressBar.setValue(reportProgressBar.getMaximum());
-                        reportProgressBar.setStringPainted(true);
-                        reportProgressBar.setForeground(GREEN);
-                        reportProgressBar.setString("Complete"); //NON-NLS
-                        firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
-                        break;
-                    }
-                    case ERROR: {
-                        ReportStatus oldValue = status;
-                        status = ReportStatus.ERROR;
-                        statusMessageLabel.setForeground(RED);
-                        statusMessageLabel.setText(statusMessage);
-                        reportProgressBar.setValue(reportProgressBar.getMaximum());
-                        reportProgressBar.setStringPainted(true);
-                        reportProgressBar.setForeground(RED);
-                        reportProgressBar.setString("Error"); //NON-NLS
-                        firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
-                        break;
-                    }
-                    default: {
-                        break;
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * Makes the components of this panel indicate generation of the report was
-     * cancelled.
-     */
-    void cancel() {
-        switch (status) {
-            case COMPLETE:
-                break;
-            case CANCELED:
-                break;
-            case ERROR:
-                break;
-            default:
-                ReportStatus oldValue = status;
-                status = ReportStatus.CANCELED;
-                reportProgressBar.setIndeterminate(false);
-                reportProgressBar.setValue(0);
-                reportProgressBar.setStringPainted(true);
-                reportProgressBar.setForeground(RED); // Red
-                reportProgressBar.setString("Cancelled"); //NON-NLS
-                firePropertyChange(ReportStatus.CANCELED.toString(), oldValue, status);
-                statusMessageLabel.setForeground(RED);
-                statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.cancel.procLbl.text"));
-                break;
-        }
-    }
-
-    /**
-     * Gets a shortened version of a file path.
-     *
-     * @param path The path to shorten.
-     *
-     * @return The shortened path.
-     */
-    private String shortenPath(String path) {
-        if (path.length() > 100) {
-            return path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) + "..."
-                    + path.substring((path.length() - 70) + path.substring(path.length() - 70).indexOf(File.separator));
-        } else {
-            return path;
-        }
-    }
-
-    /**
-     * This method is called from within the constructor to initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is always
-     * regenerated by the Form Editor.
-     */
-    @SuppressWarnings("unchecked")
-    // //GEN-BEGIN:initComponents
-    private void initComponents() {
-
-        reportProgressBar = new javax.swing.JProgressBar();
-        reportLabel = new javax.swing.JLabel();
-        pathLabel = new javax.swing.JLabel();
-        separationLabel = new javax.swing.JLabel();
-        statusMessageLabel = new javax.swing.JLabel();
-
-        setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
-        setMinimumSize(new java.awt.Dimension(486, 68));
-
-        reportProgressBar.setFont(reportProgressBar.getFont().deriveFont(reportProgressBar.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
-
-        reportLabel.setFont(reportLabel.getFont().deriveFont(reportLabel.getFont().getStyle() | java.awt.Font.BOLD, 11));
-        org.openide.awt.Mnemonics.setLocalizedText(reportLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.reportLabel.text")); // NOI18N
-
-        pathLabel.setFont(pathLabel.getFont().deriveFont(pathLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
-        org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.pathLabel.text")); // NOI18N
-        pathLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
-
-        separationLabel.setFont(separationLabel.getFont().deriveFont(separationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
-        org.openide.awt.Mnemonics.setLocalizedText(separationLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.separationLabel.text")); // NOI18N
-
-        org.openide.awt.Mnemonics.setLocalizedText(statusMessageLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.statusMessageLabel.text")); // NOI18N
-
-        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
-        this.setLayout(layout);
-        layout.setHorizontalGroup(
-            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(layout.createSequentialGroup()
-                .addContainerGap()
-                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                    .addComponent(statusMessageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-                    .addComponent(reportProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-                    .addGroup(layout.createSequentialGroup()
-                        .addComponent(reportLabel)
-                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                        .addComponent(separationLabel)
-                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                        .addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE)))
-                .addContainerGap())
-        );
-        layout.setVerticalGroup(
-            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(layout.createSequentialGroup()
-                .addContainerGap()
-                .addComponent(reportProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(reportLabel)
-                    .addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-                    .addComponent(separationLabel))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(statusMessageLabel)
-                .addGap(13, 13, 13))
-        );
-    }// //GEN-END:initComponents
-
-
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JLabel pathLabel;
-    private javax.swing.JLabel reportLabel;
-    private javax.swing.JProgressBar reportProgressBar;
-    private javax.swing.JLabel separationLabel;
-    private javax.swing.JLabel statusMessageLabel;
-    // End of variables declaration//GEN-END:variables
-
-    /**
-     * Makes the components of this panel indicate the generation of the report
-     * is completed.
-     *
-     * @deprecated Use {@link #complete(ReportStatus)}
-     */
-    @Deprecated
-    @Override
-    public void complete() {
-        complete(ReportStatus.COMPLETE);
-    }
-
-}
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java
new file mode 100755
index 0000000000..a3f0ec17d4
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java
@@ -0,0 +1,140 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2019 Basis Technology Corp.
+ * Contact: carrier  sleuthkit  org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.report.infrastructure;
+
+import org.openide.util.NbBundle;
+import org.sleuthkit.autopsy.progress.ProgressIndicator;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
+
+/**
+ * An adapter that adapts the ReportProgressPanel interface to the
+ * ProgressIndicator interface so that a given progress indicator can be used
+ * where a ReportProgressPanel is expected.
+ */
+public class ReportProgressIndicator extends ReportProgressPanel {
+
+    private static final long serialVersionUID = 1L;
+    private final ProgressIndicator progressIndicator;
+
+    /**
+     * Constructs an adapter that adapts the ReportProgressPanel interface to
+     * the ProgressIndicator interface so that a given progress indicator can be
+     * used where a ReportProgressPanel is expected.
+     *
+     * @param progressIndicator The progress indicator tobe adapted.
+     */
+    public ReportProgressIndicator(ProgressIndicator progressIndicator) {
+        this.progressIndicator = progressIndicator;
+    }
+
+    @Override
+    public void setLabels(String reportName, String reportPath) {
+        /*
+         * Not expected to be called, method exists for ReportGenerationPanel,
+         * which is not expected to be instantiated when this class is used.
+         */
+    }
+
+    @Override
+    @NbBundle.Messages({
+        "ReportProgressIndicator.startMessage=Report generation started"
+    })
+    public void start() {
+        setStatus(ReportStatus.RUNNING);
+        progressIndicator.start(Bundle.ReportProgressIndicator_startMessage());
+    }
+
+    @Override
+    @NbBundle.Messages({
+        "ReportProgressIndicator.switchToDeterminateMessage=Report generation progress switched to determinate"
+    })
+    public void setMaximumProgress(int max) {
+        progressIndicator.switchToDeterminate(Bundle.ReportProgressIndicator_switchToDeterminateMessage(), 0, max);
+    }
+
+    @Override
+    public void setProgress(int value) {
+        progressIndicator.progress(value);
+    }
+
+    @Override
+    @NbBundle.Messages({
+        "ReportProgressIndicator.switchToIndeterminateMessage=Report generation progress switched to indeterminate"
+    })
+    public void setIndeterminate(boolean indeterminate) {
+        progressIndicator.switchToIndeterminate(Bundle.ReportProgressIndicator_switchToIndeterminateMessage());
+    }
+
+    @Override
+    public void updateStatusLabel(String statusMessage) {
+        if (getStatus() != ReportStatus.CANCELED) {
+            progressIndicator.progress(statusMessage);
+        }
+    }
+
+    @Override
+    @NbBundle.Messages({
+        "ReportProgressIndicator.completedMessage=Report generation completed",
+        "ReportProgressIndicator.completedWithErrorsMessage=Report generation completed with errors",})
+    public void complete(ReportStatus reportStatus) {
+        if (getStatus() != ReportStatus.CANCELED) {
+            switch (reportStatus) {
+                case COMPLETE: {
+                    progressIndicator.progress(Bundle.ReportProgressIndicator_completedMessage());
+                    break;
+                }
+                case ERROR: {
+                    progressIndicator.progress(Bundle.ReportProgressIndicator_completedWithErrorsMessage());
+                    break;
+                }
+                default: {
+                    break;
+                }
+            }
+        }
+        progressIndicator.finish();
+    }
+
+    @Override
+    public void complete(ReportStatus reportStatus, String statusMessage) {
+        if (getStatus() != ReportStatus.CANCELED) {
+            progressIndicator.progress(statusMessage);
+        }
+        complete(reportStatus);
+    }
+
+    @Override
+    @NbBundle.Messages({
+        "ReportProgressIndicator.cancelledMessage=Report generation cancelled",})
+    public void cancel() {
+        switch (getStatus()) {
+            case COMPLETE:
+                break;
+            case CANCELED:
+                break;
+            case ERROR:
+                break;
+            default:
+                setStatus(ReportStatus.CANCELED);
+                progressIndicator.progress(Bundle.ReportProgressIndicator_cancelledMessage());
+                break;
+        }
+    }
+
+}
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressLogger.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressLogger.java
deleted file mode 100755
index 697050052c..0000000000
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressLogger.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2019 Basis Technology Corp.
- * Contact: carrier  sleuthkit  org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.report.infrastructure;
-
-import java.util.logging.Level;
-import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
-
-/**
- * Writes progress and status messages to the application log.
- */
-public class ReportProgressLogger implements ReportProgressPanel {
-
-    private static final Logger logger = Logger.getLogger(ReportProgressLogger.class.getName());
-    private volatile ReportProgressPanel.ReportStatus status;
-
-    public ReportProgressLogger() {
-        status = ReportStatus.QUEUING;
-    }
-
-    /**
-     * Gets the current status of the generation of the report.
-     *
-     * @return The report generation status as a ReportStatus enum.
-     */
-    @Override
-    public ReportStatus getStatus() {
-        return status;
-    }
-
-    /**
-     * Logs that the report has been started.
-     */
-    @Override
-    public void start() {
-        status = ReportStatus.RUNNING;
-        logger.log(Level.INFO, "Report started");
-    }
-
-    /**
-     * NO-OP.
-     *
-     * @param max The maximum value.
-     */
-    @Override
-    public void setMaximumProgress(int max) {
-    }
-
-    /**
-     * NO-OP.
-     */
-    @Override
-    public void increment() {
-    }
-
-    /**
-     * NO-OP.
-     *
-     * @param value The value to be set.
-     */
-    @Override
-    public void setProgress(int value) {
-    }
-
-    /**
-     * NO-OP.
-     *
-     * @param indeterminate True if the progress bar should be set to
-     * indeterminate.
-     */
-    @Override
-    public void setIndeterminate(boolean indeterminate) {
-    }
-
-    /**
-     * Logs the status message.
-     *
-     * @param statusMessage String to use as label text.
-     */
-    @Override
-    public void updateStatusLabel(String statusMessage) {
-        if (status != ReportStatus.CANCELED) {
-            logger.log(Level.INFO, statusMessage);
-        }
-    }
-
-    /**
-     * Logs the final status of the report generation.
-     *
-     * @param reportStatus The final status, must be COMPLETE or ERROR.
-     * @param statusMessage String to use as label or error text.
-     */
-    @Override
-    public void complete(ReportStatus reportStatus, String statusMessage) {
-        if (!statusMessage.isEmpty()) {
-            logger.log(Level.INFO, statusMessage);
-        }
-        if (status != ReportStatus.CANCELED) {
-            switch (reportStatus) {
-                case COMPLETE: {
-                    status = ReportStatus.COMPLETE;
-                    logger.log(Level.INFO, "Report completed");
-                    break;
-                }
-                case ERROR: {
-                    status = ReportStatus.ERROR;
-                    logger.log(Level.INFO, "Report completed with errors");
-                    break;
-                }
-                default: {
-                    break;
-                }
-            }
-        }
-    }
-    
-    /**
-     * Logs the final status of the report generation.
-     *
-     * @param reportStatus The final status, must be COMPLETE or ERROR.
-     */
-    @Override
-    public void complete(ReportStatus reportStatus) {
-        complete(reportStatus, "");
-    }
-
-    /**
-     * Logs that the generation of the report was cancelled.
-     */
-    void cancel() {
-        switch (status) {
-            case COMPLETE:
-                break;
-            case CANCELED:
-                break;
-            case ERROR:
-                break;
-            default:
-                status = ReportStatus.CANCELED;
-                logger.log(Level.INFO, "Report cancelled");
-                break;
-        }
-    }
-
-    /**
-     * Logs the final status of the report generation.
-     *
-     * @deprecated Use {@link #complete(ReportStatus)}
-     */
-    @Deprecated
-    @Override
-    public void complete() {
-        complete(ReportStatus.COMPLETE);
-    }
-
-}
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java
index 1e5ffea430..1058c4d382 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java
@@ -1,19 +1,19 @@
 /*
  *
  * Autopsy Forensic Browser
- * 
+ *
  * Copyright 2013-2018 Basis Technology Corp.
- * 
+ *
  * Copyright 2012 42six Solutions.
  * Contact: aebadirad  42six  com
  * Project Contact/Architect: carrier  sleuthkit  org
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -74,10 +74,11 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
      * reporting wizard. When the wizard is finished, create a ReportGenerator
      * with the wizard information, and start all necessary reports.
      *
-     * @param configName Name of the reporting configuration to use
+     * @param configName              Name of the reporting configuration to use
      * @param displayCaseSpecificData Flag whether to use case specific data in
-     * UI panels or to use all possible result types
-     * @param runReports Flag whether to produce report(s)
+     *                                UI panels or to use all possible result
+     *                                types
+     * @param runReports              Flag whether to produce report(s)
      */
     @SuppressWarnings("unchecked")
     public static void doReportWizard(String configName, boolean displayCaseSpecificData, boolean runReports) {
@@ -92,7 +93,7 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
             } catch (ReportConfigException ex) {
                 logger.log(Level.SEVERE, "Failed to save reporting configuration " + configName, ex); //NON-NLS
                 NotifyDescriptor descriptor = new NotifyDescriptor.Message(
-                        NbBundle.getMessage(ReportWizardAction.class, "ReportWizardAction.unableToSaveConfig.errorLabel.text"), 
+                        NbBundle.getMessage(ReportWizardAction.class, "ReportWizardAction.unableToSaveConfig.errorLabel.text"),
                         NotifyDescriptor.ERROR_MESSAGE);
                 DialogDisplayer.getDefault().notify(descriptor);
             }
@@ -110,6 +111,7 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
         }
     }
 
+    @SuppressWarnings(value = "unchecked")
     private static void saveReportingConfiguration(String configName, WizardDescriptor wiz) throws ReportConfigException {
 
         ReportingConfig reportingConfig = new ReportingConfig(configName);
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportingConfigLoader.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportingConfigLoader.java
index 6ab57f8578..6472105888 100755
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportingConfigLoader.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportingConfigLoader.java
@@ -55,11 +55,14 @@ final class ReportingConfigLoader {
      * an atomic, thread safe way.
      *
      * @param configName Name of the reporting configuration
+     *
      * @return ReportingConfig object if a persisted configuration exists, null
-     * otherwise
+     *         otherwise
+     *
      * @throws ReportConfigException if an error occurred while reading the
-     * configuration
+     *                               configuration
      */
+    @SuppressWarnings("unchecked")
     static synchronized ReportingConfig loadConfig(String configName) throws ReportConfigException {
 
         // construct the configuration directory path
@@ -77,7 +80,7 @@ final class ReportingConfigLoader {
 
         // read in the configuration
         ReportingConfig config = new ReportingConfig(configName);
-        
+
         // read table report settings
         String filePath = reportDirPath.toString() + File.separator + TABLE_REPORT_CONFIG_FILE;
         try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
@@ -85,7 +88,7 @@ final class ReportingConfigLoader {
         } catch (IOException | ClassNotFoundException ex) {
             throw new ReportConfigException("Unable to read table report settings " + filePath, ex);
         }
-        
+
         // read file report settings
         filePath = reportDirPath.toString() + File.separator + FILE_REPORT_CONFIG_FILE;
         try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
@@ -93,7 +96,7 @@ final class ReportingConfigLoader {
         } catch (IOException | ClassNotFoundException ex) {
             throw new ReportConfigException("Unable to read file report settings " + filePath, ex);
         }
-        
+
         // read map of module configuration objects
         Map moduleConfigs = null;
         filePath = reportDirPath.toString() + File.separator + MODULE_CONFIG_FILE;
@@ -102,11 +105,11 @@ final class ReportingConfigLoader {
         } catch (IOException | ClassNotFoundException ex) {
             throw new ReportConfigException("Unable to read module configurations map " + filePath, ex);
         }
-        
+
         if (moduleConfigs == null || moduleConfigs.isEmpty()) {
             return config;
         }
-        
+
         // read each ReportModuleSettings object individually
         for (Iterator> iterator = moduleConfigs.entrySet().iterator(); iterator.hasNext();) {
             ReportModuleConfig moduleConfig = iterator.next().getValue();
@@ -114,16 +117,19 @@ final class ReportingConfigLoader {
             try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
                 moduleConfig.setModuleSettings((ReportModuleSettings) in.readObject());
             } catch (IOException | ClassNotFoundException ex) {
-                /* NOTE: we do not want to re-throw the exception because we do not 
-                want a single error while reading in a (3rd party) report module 
-                to prevent us from reading the entire reporting configuration.*/
+                /*
+                 * NOTE: we do not want to re-throw the exception because we do
+                 * not want a single error while reading in a (3rd party) report
+                 * module to prevent us from reading the entire reporting
+                 * configuration.
+                 */
                 logger.log(Level.SEVERE, "Unable to read module settings " + filePath, ex);
                 iterator.remove();
             }
         }
-        
+
         config.setModuleConfigs(moduleConfigs);
-        
+
         return config;
     }
 
@@ -132,15 +138,16 @@ final class ReportingConfigLoader {
      * an atomic, thread safe way.
      *
      * @param reportConfig ReportingConfig object to serialize to disk
+     *
      * @throws ReportConfigException if an error occurred while saving the
-     * configuration
+     *                               configuration
      */
     static synchronized void saveConfig(ReportingConfig reportConfig) throws ReportConfigException {
 
         if (reportConfig == null) {
             throw new ReportConfigException("Reporting configuration is NULL");
         }
-        
+
         // construct the configuration directory path
         Path pathToConfigDir = Paths.get(ReportingConfigLoader.REPORT_CONFIG_FOLDER_PATH, reportConfig.getName());
 
@@ -168,7 +175,7 @@ final class ReportingConfigLoader {
         }
 
         // save map of module configuration objects
-        filePath = pathToConfigDir.toString() + File.separator + MODULE_CONFIG_FILE;        
+        filePath = pathToConfigDir.toString() + File.separator + MODULE_CONFIG_FILE;
         try (NbObjectOutputStream out = new NbObjectOutputStream(new FileOutputStream(filePath))) {
             out.writeObject(reportConfig.getModuleConfigs());
         } catch (IOException ex) {
@@ -176,10 +183,13 @@ final class ReportingConfigLoader {
         }
 
         // save each ReportModuleSettings object individually
-        /* NOTE: This is done to protect us from errors in reading/writing 3rd 
-        party report module settings. If we were to serialize the entire ReportingConfig 
-        object, then a single error while reading in a 3rd party report module 
-        would prevent us from reading the entire reporting configuration.*/
+        /*
+         * NOTE: This is done to protect us from errors in reading/writing 3rd
+         * party report module settings. If we were to serialize the entire
+         * ReportingConfig object, then a single error while reading in a 3rd
+         * party report module would prevent us from reading the entire
+         * reporting configuration.
+         */
         if (reportConfig.getModuleConfigs() == null) {
             return;
         }
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
index 8432526e4e..4836b03d37 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
@@ -46,8 +46,8 @@ import org.sleuthkit.autopsy.casemodule.services.TagsManager;
 import org.sleuthkit.autopsy.coreutils.ImageUtils;
 import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.datamodel.ContentUtils;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import static org.sleuthkit.autopsy.casemodule.services.TagsManager.getNotableTagLabel;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.datamodel.AbstractFile;
 import org.sleuthkit.datamodel.Account;
 import org.sleuthkit.datamodel.BlackboardArtifact;
@@ -60,6 +60,7 @@ import org.sleuthkit.datamodel.SleuthkitCase;
 import org.sleuthkit.datamodel.TagName;
 import org.sleuthkit.datamodel.TskCoreException;
 import org.sleuthkit.datamodel.TskData;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 class TableReportGenerator {
 
@@ -80,10 +81,10 @@ class TableReportGenerator {
         this.progressPanel = progressPanel;
         this.tableReport = tableReport;
         this.columnHeaderMap = new HashMap<>();
-        errorList = new ArrayList<>();        
+        errorList = new ArrayList<>();
         this.settings = settings;
     }
-    
+
     private void getAllExistingTags() throws NoCurrentCaseException, TskCoreException {
         List tagNames = new ArrayList<>();
 
@@ -98,6 +99,7 @@ class TableReportGenerator {
         tagNamesFilter = new HashSet<>(tagNames);
     }
 
+    @SuppressWarnings("deprecation")
     private void getAllExistingArtiactTypes() throws NoCurrentCaseException, TskCoreException {
         // get all possible artifact types
         ArrayList doNotReport = new ArrayList<>();
@@ -116,7 +118,7 @@ class TableReportGenerator {
 
         progressPanel.start();
         progressPanel.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.readingTagsArtifacts.text"));
-        
+
         if (settings.useStoredTagsAndArtifactsLists()) {
             // Get the artifact types selected by the user.
             artifactTypes = settings.getArtifactSelections();
@@ -130,7 +132,7 @@ class TableReportGenerator {
                 if (settings.getSelectedReportOption() == TableReportSettings.TableReportOption.ALL_TAGGED_RESULTS) {
                     getAllExistingTags();
                 }
-                
+
                 // get all possible artifact types
                 getAllExistingArtiactTypes();
             } catch (NoCurrentCaseException | TskCoreException ex) {
@@ -139,11 +141,11 @@ class TableReportGenerator {
                 return;
             }
         }
-        
+
         // Start the progress indicators for each active TableReportModule.
         progressPanel.setIndeterminate(false);
         progressPanel.setMaximumProgress(this.artifactTypes.size() + 2); // +2 for content and blackboard artifact tags
-        
+
         // report on the blackboard results
         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
             makeBlackboardArtifactTables();
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/bodyfile/BodyFileReport.java b/Core/src/org/sleuthkit/autopsy/report/modules/bodyfile/BodyFileReport.java
index a0d43bf4e5..1e802fa20d 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/bodyfile/BodyFileReport.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/bodyfile/BodyFileReport.java
@@ -35,9 +35,9 @@ import org.sleuthkit.autopsy.casemodule.Case;
 import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
 import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.ingest.IngestManager;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
 import org.sleuthkit.datamodel.*;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  * BodyFileReport generates a report in the body file format specified on The
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/caseuco/CaseUcoFormatExporter.java b/Core/src/org/sleuthkit/autopsy/report/modules/caseuco/CaseUcoFormatExporter.java
index 7df1494688..3003f03e7d 100755
--- a/Core/src/org/sleuthkit/autopsy/report/modules/caseuco/CaseUcoFormatExporter.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/caseuco/CaseUcoFormatExporter.java
@@ -43,7 +43,6 @@ import org.sleuthkit.autopsy.casemodule.services.TagsManager;
 import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.datamodel.ContentUtils;
 import org.sleuthkit.autopsy.ingest.IngestManager;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.datamodel.AbstractFile;
 import org.sleuthkit.datamodel.BlackboardArtifact;
 import org.sleuthkit.datamodel.BlackboardArtifactTag;
@@ -55,6 +54,7 @@ import org.sleuthkit.datamodel.SleuthkitCase;
 import org.sleuthkit.datamodel.TskCoreException;
 import org.sleuthkit.datamodel.TskData;
 import org.sleuthkit.datamodel.TagName;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  * Generates CASE-UCO report file for a data source
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java b/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java
index c1a8ec4046..acf730a1d7 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java
@@ -46,8 +46,8 @@ import org.jdom2.CDATA;
 import org.openide.filesystems.FileUtil;
 import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
 import org.sleuthkit.autopsy.report.ReportBranding;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.datamodel.ReadContentInputStream.ReadContentInputStreamException;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  * Generates a KML file based on geospatial information from the BlackBoard.
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java b/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java
index de3350ad88..927cf9bf0c 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java
@@ -43,7 +43,6 @@ import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.coreutils.PlatformUtil;
 import org.sleuthkit.autopsy.datamodel.ContentUtils;
 import org.sleuthkit.autopsy.coreutils.FileTypeUtils.FileTypeCategory;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.autopsy.report.modules.caseuco.CaseUcoFormatExporter;
 import org.sleuthkit.datamodel.AbstractFile;
 import org.sleuthkit.datamodel.BlackboardArtifact;
@@ -63,6 +62,7 @@ import org.sleuthkit.datamodel.TskDataException;
 import org.sleuthkit.datamodel.TskData;
 import org.sleuthkit.datamodel.Volume;
 import org.sleuthkit.datamodel.VolumeSystem;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  * Creates a portable case from tagged files
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/stix/STIXReportModule.java b/Core/src/org/sleuthkit/autopsy/report/modules/stix/STIXReportModule.java
index 6421cc4a32..17ac2ab813 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/stix/STIXReportModule.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/stix/STIXReportModule.java
@@ -57,9 +57,9 @@ import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.report.GeneralReportModule;
 import org.sleuthkit.autopsy.report.NoReportModuleSettings;
 import org.sleuthkit.autopsy.report.ReportModuleSettings;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
 import org.sleuthkit.datamodel.TskCoreException;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  *
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java
index 8fc57c0ae8..85e1d581ab 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java
@@ -32,12 +32,12 @@ import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb;
 import org.sleuthkit.autopsy.report.GeneralReportModule;
 import org.sleuthkit.autopsy.report.NoReportModuleSettings;
 import org.sleuthkit.autopsy.report.ReportModuleSettings;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.datamodel.AbstractFile;
 import org.sleuthkit.datamodel.Content;
 import org.sleuthkit.datamodel.ContentTag;
 import org.sleuthkit.datamodel.TagName;
 import org.sleuthkit.datamodel.TskCoreException;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  * Instances of this class plug in to the reporting infrastructure to provide a

From 80e6829b3e19e15111f8db581d02dd56495ead16 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 12:05:01 -0400
Subject: [PATCH 10/37] Fix backwards compatibility issue for reports

---
 .../autopsy/commandlineingest/CommandLineIngestManager.java   | 4 ++--
 .../autopsy/report/modules/bodyfile/BodyFileReport.java       | 2 +-
 .../autopsy/report/modules/caseuco/CaseUcoFormatExporter.java | 2 +-
 .../org/sleuthkit/autopsy/report/modules/kml/KMLReport.java   | 2 +-
 .../report/modules/portablecase/PortableCaseReportModule.java | 2 +-
 .../autopsy/report/modules/stix/STIXReportModule.java         | 2 +-
 .../report/modules/taggedhashes/SaveTaggedHashesToHashDb.java | 2 +-
 7 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java b/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java
index 578ffd5ef3..0d37f11528 100755
--- a/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java
+++ b/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java
@@ -71,7 +71,7 @@ import org.sleuthkit.datamodel.TskCoreException;
 /**
  * Allows Autopsy to be invoked with a command line arguments. Arguments exist
  * to cause Autopsy to create a case, add a specified data source, run ingest on
- * that data source, list all data sources in a case, and generate reports.
+ * that data source, list all data sources in the case, and generate reports.
  */
 public class CommandLineIngestManager {
 
@@ -287,7 +287,7 @@ public class CommandLineIngestManager {
 
                                     // generate reports
                                     ReportProgressIndicator progressIndicator = new ReportProgressIndicator(new LoggingProgressIndicator());
-                                    ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), progressIndicator); //NON-NLS
+                                    ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), progressIndicator);
                                     generator.generateReports();
                                 } catch (CaseActionException ex) {
                                     String caseDirPath = command.getInputs().get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/bodyfile/BodyFileReport.java b/Core/src/org/sleuthkit/autopsy/report/modules/bodyfile/BodyFileReport.java
index 1e802fa20d..a0d43bf4e5 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/bodyfile/BodyFileReport.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/bodyfile/BodyFileReport.java
@@ -35,9 +35,9 @@ import org.sleuthkit.autopsy.casemodule.Case;
 import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
 import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.ingest.IngestManager;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
 import org.sleuthkit.datamodel.*;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  * BodyFileReport generates a report in the body file format specified on The
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/caseuco/CaseUcoFormatExporter.java b/Core/src/org/sleuthkit/autopsy/report/modules/caseuco/CaseUcoFormatExporter.java
index 3003f03e7d..7df1494688 100755
--- a/Core/src/org/sleuthkit/autopsy/report/modules/caseuco/CaseUcoFormatExporter.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/caseuco/CaseUcoFormatExporter.java
@@ -43,6 +43,7 @@ import org.sleuthkit.autopsy.casemodule.services.TagsManager;
 import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.datamodel.ContentUtils;
 import org.sleuthkit.autopsy.ingest.IngestManager;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.datamodel.AbstractFile;
 import org.sleuthkit.datamodel.BlackboardArtifact;
 import org.sleuthkit.datamodel.BlackboardArtifactTag;
@@ -54,7 +55,6 @@ import org.sleuthkit.datamodel.SleuthkitCase;
 import org.sleuthkit.datamodel.TskCoreException;
 import org.sleuthkit.datamodel.TskData;
 import org.sleuthkit.datamodel.TagName;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  * Generates CASE-UCO report file for a data source
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java b/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java
index acf730a1d7..c1a8ec4046 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java
@@ -46,8 +46,8 @@ import org.jdom2.CDATA;
 import org.openide.filesystems.FileUtil;
 import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
 import org.sleuthkit.autopsy.report.ReportBranding;
-import org.sleuthkit.datamodel.ReadContentInputStream.ReadContentInputStreamException;
 import org.sleuthkit.autopsy.report.ReportProgressPanel;
+import org.sleuthkit.datamodel.ReadContentInputStream.ReadContentInputStreamException;
 
 /**
  * Generates a KML file based on geospatial information from the BlackBoard.
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java b/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java
index 927cf9bf0c..de3350ad88 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java
@@ -43,6 +43,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.coreutils.PlatformUtil;
 import org.sleuthkit.autopsy.datamodel.ContentUtils;
 import org.sleuthkit.autopsy.coreutils.FileTypeUtils.FileTypeCategory;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.autopsy.report.modules.caseuco.CaseUcoFormatExporter;
 import org.sleuthkit.datamodel.AbstractFile;
 import org.sleuthkit.datamodel.BlackboardArtifact;
@@ -62,7 +63,6 @@ import org.sleuthkit.datamodel.TskDataException;
 import org.sleuthkit.datamodel.TskData;
 import org.sleuthkit.datamodel.Volume;
 import org.sleuthkit.datamodel.VolumeSystem;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  * Creates a portable case from tagged files
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/stix/STIXReportModule.java b/Core/src/org/sleuthkit/autopsy/report/modules/stix/STIXReportModule.java
index 17ac2ab813..6421cc4a32 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/stix/STIXReportModule.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/stix/STIXReportModule.java
@@ -57,9 +57,9 @@ import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.report.GeneralReportModule;
 import org.sleuthkit.autopsy.report.NoReportModuleSettings;
 import org.sleuthkit.autopsy.report.ReportModuleSettings;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
 import org.sleuthkit.datamodel.TskCoreException;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  *
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java
index 85e1d581ab..8fc57c0ae8 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java
@@ -32,12 +32,12 @@ import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb;
 import org.sleuthkit.autopsy.report.GeneralReportModule;
 import org.sleuthkit.autopsy.report.NoReportModuleSettings;
 import org.sleuthkit.autopsy.report.ReportModuleSettings;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
 import org.sleuthkit.datamodel.AbstractFile;
 import org.sleuthkit.datamodel.Content;
 import org.sleuthkit.datamodel.ContentTag;
 import org.sleuthkit.datamodel.TagName;
 import org.sleuthkit.datamodel.TskCoreException;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 /**
  * Instances of this class plug in to the reporting infrastructure to provide a

From 759c1e274634e7c12d7455da8c48e58f686af1d6 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 12:10:13 -0400
Subject: [PATCH 11/37] Fix backwards compatibility issue for reports

---
 .../CommandLineIngestManager.java             | 26 +++----------------
 .../infrastructure/ReportGenerator.java       | 12 ++++++---
 2 files changed, 12 insertions(+), 26 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java b/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java
index 0d37f11528..4d04e5dbbf 100755
--- a/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java
+++ b/Core/src/org/sleuthkit/autopsy/commandlineingest/CommandLineIngestManager.java
@@ -69,8 +69,8 @@ import org.sleuthkit.datamodel.Content;
 import org.sleuthkit.datamodel.TskCoreException;
 
 /**
- * Allows Autopsy to be invoked with a command line arguments. Arguments exist
- * to cause Autopsy to create a case, add a specified data source, run ingest on
+ * Allows Autopsy to be invoked with command line arguments. Arguments exist to
+ * cause Autopsy to create a case, add a specified data source, run ingest on
  * that data source, list all data sources in the case, and generate reports.
  */
 public class CommandLineIngestManager {
@@ -427,26 +427,8 @@ public class CommandLineIngestManager {
          *                                                                     processing
          *                                                                     error
          *
-         * @throws
-         *                                                                               InterruptedException                                                  if
-         *                                                                               the
-         *                                                                               thread
-         *                                                                               running
-         *                                                                               the
-         *                                                                               job
-         *                                                                               processing
-         *                                                                               task
-         *                                                                               is
-         *                                                                               interrupted
-         *                                                                               while
-         *                                                                               blocked,
-         *                                                                               i.e.,
-         *                                                                               if
-         *                                                                               auto
-         *                                                                               ingest
-         *                                                                               is
-         *                                                                               shutting
-         *                                                                               down.
+         * @throws ead running the job processing task is interrupted while
+         * blocked, i.e., if auto ingest is shutting down.
          */
         private void runDataSourceProcessor(Case caseForJob, AutoIngestDataSource dataSource) throws InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException {
 
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
index 8e21086b55..f9d013982d 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
@@ -61,11 +61,15 @@ import org.sleuthkit.datamodel.TskData;
 public class ReportGenerator {
 
     private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
-    private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
-    private static final String REPORTS_DIR = "Reports"; //NON-NLS
-    private final String configName;
-    private final ReportGenerationPanel reportGenerationPanel;
+
     private final ReportProgressPanel progressIndicator;
+    private final ReportGenerationPanel reportGenerationPanel;
+    
+    private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
+    
+    private final String configName;
+    private static final String REPORTS_DIR = "Reports"; //NON-NLS
+
     private List errorList = new ArrayList<>();
 
     /**

From d6a07d27309c2831f56f48edf226d4442772193c Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 12:12:11 -0400
Subject: [PATCH 12/37] Fix backwards compatibility issue for reports

---
 .../autopsy/report/infrastructure/ReportGenerator.java        | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
index f9d013982d..e614401750 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
@@ -61,15 +61,11 @@ import org.sleuthkit.datamodel.TskData;
 public class ReportGenerator {
 
     private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
-
     private final ReportProgressPanel progressIndicator;
     private final ReportGenerationPanel reportGenerationPanel;
-    
     private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
-    
     private final String configName;
     private static final String REPORTS_DIR = "Reports"; //NON-NLS
-
     private List errorList = new ArrayList<>();
 
     /**

From c65e44736ae1a1932235ffe4f9b7c6c1e0c7c69e Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 12:15:20 -0400
Subject: [PATCH 13/37] Fix backwards compatibility issue for reports

---
 .../autopsy/report/infrastructure/TableReportGenerator.java      | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
index 4836b03d37..74db35e0e0 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
@@ -60,7 +60,6 @@ import org.sleuthkit.datamodel.SleuthkitCase;
 import org.sleuthkit.datamodel.TagName;
 import org.sleuthkit.datamodel.TskCoreException;
 import org.sleuthkit.datamodel.TskData;
-import org.sleuthkit.autopsy.report.ReportProgressPanel;
 
 class TableReportGenerator {
 

From 2055da5fc3599498821dfbb3ad9bc57bf97db86a Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 12:31:46 -0400
Subject: [PATCH 14/37] Fix backwards compatibility issue for reports

---
 .../ReportProgressIndicator.java              | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java
index a3f0ec17d4..0dfd3fe68f 100755
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java
@@ -31,13 +31,14 @@ public class ReportProgressIndicator extends ReportProgressPanel {
 
     private static final long serialVersionUID = 1L;
     private final ProgressIndicator progressIndicator;
+    private int workUnitsCompleted;
 
     /**
      * Constructs an adapter that adapts the ReportProgressPanel interface to
      * the ProgressIndicator interface so that a given progress indicator can be
      * used where a ReportProgressPanel is expected.
      *
-     * @param progressIndicator The progress indicator tobe adapted.
+     * @param progressIndicator The progress indicator to be adapted.
      */
     public ReportProgressIndicator(ProgressIndicator progressIndicator) {
         this.progressIndicator = progressIndicator;
@@ -46,9 +47,11 @@ public class ReportProgressIndicator extends ReportProgressPanel {
     @Override
     public void setLabels(String reportName, String reportPath) {
         /*
-         * Not expected to be called, method exists for ReportGenerationPanel,
-         * which is not expected to be instantiated when this class is used.
+         * This method is not expected to be called. It exists for use by the
+         * ReportGenerationPanel, which is not expected to be instantiated when
+         * this class is used.
          */
+        super.setLabels(reportName, reportPath);
     }
 
     @Override
@@ -56,6 +59,7 @@ public class ReportProgressIndicator extends ReportProgressPanel {
         "ReportProgressIndicator.startMessage=Report generation started"
     })
     public void start() {
+        workUnitsCompleted = 0;
         setStatus(ReportStatus.RUNNING);
         progressIndicator.start(Bundle.ReportProgressIndicator_startMessage());
     }
@@ -68,9 +72,16 @@ public class ReportProgressIndicator extends ReportProgressPanel {
         progressIndicator.switchToDeterminate(Bundle.ReportProgressIndicator_switchToDeterminateMessage(), 0, max);
     }
 
+    @Override
+    public void increment() {
+        ++workUnitsCompleted;
+        progressIndicator.progress(workUnitsCompleted);
+    }
+
     @Override
     public void setProgress(int value) {
-        progressIndicator.progress(value);
+        workUnitsCompleted = value;
+        progressIndicator.progress(workUnitsCompleted);
     }
 
     @Override

From 943263b812fb1f29c52468d0dfe7980ec5d05b13 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 12:33:49 -0400
Subject: [PATCH 15/37] Fix backwards compatibility issue for reports

---
 .../autopsy/report/infrastructure/ReportWizardAction.java       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java
index 1058c4d382..e336538d4d 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java
@@ -2,7 +2,7 @@
  *
  * Autopsy Forensic Browser
  *
- * Copyright 2013-2018 Basis Technology Corp.
+ * Copyright 2012-2019 Basis Technology Corp.
  *
  * Copyright 2012 42six Solutions.
  * Contact: aebadirad  42six  com

From fdfe94ddcf63ba838b9eccf6f5dd5e6b26879fb0 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 12:38:25 -0400
Subject: [PATCH 16/37] Fix backwards compatibility issue for reports

---
 .../autopsy/report/infrastructure/TableReportGenerator.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
index 74db35e0e0..264ed461c4 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
@@ -46,8 +46,8 @@ import org.sleuthkit.autopsy.casemodule.services.TagsManager;
 import org.sleuthkit.autopsy.coreutils.ImageUtils;
 import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.datamodel.ContentUtils;
-import static org.sleuthkit.autopsy.casemodule.services.TagsManager.getNotableTagLabel;
 import org.sleuthkit.autopsy.report.ReportProgressPanel;
+import static org.sleuthkit.autopsy.casemodule.services.TagsManager.getNotableTagLabel;
 import org.sleuthkit.datamodel.AbstractFile;
 import org.sleuthkit.datamodel.Account;
 import org.sleuthkit.datamodel.BlackboardArtifact;

From 017bf4fe1dfc5dce56ff2c981224229b3be1aafc Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 12:42:58 -0400
Subject: [PATCH 17/37] Fix backwards compatibility issue for reports

---
 .../autopsy/report/infrastructure/ReportGenerator.java        | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
index e614401750..5b1efe0541 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
@@ -101,9 +101,9 @@ public class ReportGenerator {
      * @param panel      The report generation panel.
      */
     public ReportGenerator(String configName, ReportGenerationPanel panel) {
-        this.configName = configName;
         this.reportGenerationPanel = panel;
         this.progressIndicator = panel.getProgressPanel();
+        this.configName = configName;
     }
 
     /**
@@ -115,9 +115,9 @@ public class ReportGenerator {
      * @param progressIndicator The report progress indicator.
      */
     public ReportGenerator(String configName, ReportProgressIndicator progressIndicator) {
-        this.configName = configName;
         this.reportGenerationPanel = null;
         this.progressIndicator = progressIndicator;
+        this.configName = configName;
     }
 
     /**

From 50a164b7e0d31ec7f0dfd3d53f13f66a2fa4d276 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 12:46:51 -0400
Subject: [PATCH 18/37] Fix backwards compatibility issue for reports

---
 .../infrastructure/ReportGenerator.java       | 30 +++++++++----------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
index 5b1efe0541..c88d05b94e 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportGenerator.java
@@ -92,20 +92,6 @@ public class ReportGenerator {
         }
     }
 
-    /**
-     * Constructs a report generator that generates one or more reports by
-     * running user-selected report modules and uses a report generation panel
-     * to display progress.
-     *
-     * @param configName The name of the reporting configuration to use.
-     * @param panel      The report generation panel.
-     */
-    public ReportGenerator(String configName, ReportGenerationPanel panel) {
-        this.reportGenerationPanel = panel;
-        this.progressIndicator = panel.getProgressPanel();
-        this.configName = configName;
-    }
-
     /**
      * Constructs a report generator that generates one or more reports by
      * running user-selected report modules and uses a report progress indicator
@@ -115,8 +101,22 @@ public class ReportGenerator {
      * @param progressIndicator The report progress indicator.
      */
     public ReportGenerator(String configName, ReportProgressIndicator progressIndicator) {
-        this.reportGenerationPanel = null;
         this.progressIndicator = progressIndicator;
+        this.reportGenerationPanel = null;
+        this.configName = configName;
+    }
+    
+    /**
+     * Constructs a report generator that generates one or more reports by
+     * running user-selected report modules and uses a report generation panel
+     * to display progress.
+     *
+     * @param configName The name of the reporting configuration to use.
+     * @param panel      The report generation panel.
+     */
+    ReportGenerator(String configName, ReportGenerationPanel panel) {
+        this.reportGenerationPanel = panel;
+        this.progressIndicator = panel.getProgressPanel();
         this.configName = configName;
     }
 

From d48737de6634704091302dea2c6c2cf71651bf16 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 13:34:52 -0400
Subject: [PATCH 19/37] Fixes for compiler warnings

---
 .../autopsy/timeline/actions/Bundle.properties-MERGED       | 2 ++
 .../autopsy/timeline/actions/SaveSnapshotAsReport.java      | 2 ++
 .../autopsy/recentactivity/Bundle.properties-MERGED         | 6 ++++++
 .../sleuthkit/autopsy/recentactivity/ExtractRecycleBin.java | 2 +-
 4 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle.properties-MERGED
index aac5f8beef..2968ed43c4 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle.properties-MERGED
@@ -38,8 +38,10 @@ SaveSnapShotAsReport.ReportSavedAt=Report saved at [{0}]
 SaveSnapShotAsReport.Success=Success
 SaveSnapShotAsReport_OK_Button=OK
 SaveSnapShotAsReport_Open_Button=Open Report
+# {0} - supplied report name
 SaveSnapShotAsReport_Path_Failure_Report=Failed to create report. Supplied report name has invalid characters: {0}
 SaveSnapShotAsReport_Report_Failed=Report failed
+# {0} - report location
 SaveSnapShotAsReport_success_message=Snapshot report successfully created at location: \n\n {0}
 Timeline.ModuleName=Timeline
 ViewArtifactInTimelineAction.displayName=View Result in Timeline... 
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java
index bb9cfc2328..6208714e06 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java
@@ -84,7 +84,9 @@ public class SaveSnapshotAsReport extends Action {
         "SaveSnapShotAsReport.reportName.header=Enter a report name for the Timeline Snapshot Report.",
         "SaveSnapShotAsReport.duplicateReportNameError.text=A report with that name already exists.",
         "SaveSnapShotAsReport_Report_Failed=Report failed",
+        "# {0} - supplied report name",
         "SaveSnapShotAsReport_Path_Failure_Report=Failed to create report. Supplied report name has invalid characters: {0}",
+        "# {0} - report location",
         "SaveSnapShotAsReport_success_message=Snapshot report successfully created at location: \n\n {0}",
         "SaveSnapShotAsReport_Open_Button=Open Report",
         "SaveSnapShotAsReport_OK_Button=OK"
diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED
index 4f2d1d4fd9..805e776717 100755
--- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED
+++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED
@@ -2,9 +2,14 @@ cannotBuildXmlParser=Unable to build XML parser:
 cannotLoadSEUQA=Unable to load Search Engine URL Query Analyzer settings file, SEUQAMappings.xml: 
 cannotParseXml=Unable to parse XML file: 
 ChromeCacheExtractor.moduleName=ChromeCacheExtractor
+# {0} - module name
+# {1} - row number
+# {2} - table length
+# {3} - cache path
 ChromeCacheExtractor.progressMsg={0}: Extracting cache entry {1} of {2} entries from {3}
 DataSourceUsage_AndroidMedia=Android Media Card
 DataSourceUsage_FlashDrive=Flash Drive
+# {0} - OS name
 DataSourceUsageAnalyzer.customVolume.label=OS Drive ({0})
 DataSourceUsageAnalyzer.parentModuleName=Recent Activity
 Extract.indexError.message=Failed to index artifact for keyword search.
@@ -183,6 +188,7 @@ RecentDocumentsByLnk.parentModuleName.noSpace=RecentActivity
 RecentDocumentsByLnk.parentModuleName=Recent Activity
 RegRipperFullNotFound=Full version RegRipper executable not found.
 RegRipperNotFound=Autopsy RegRipper executable not found.
+# {0} - file name
 SearchEngineURLQueryAnalyzer.init.exception.msg=Unable to find {0}.
 SearchEngineURLQueryAnalyzer.moduleName.text=Search Engine
 SearchEngineURLQueryAnalyzer.engineName.none=NONE
diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRecycleBin.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRecycleBin.java
index 3fa746cf82..d3af457a1f 100755
--- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRecycleBin.java
+++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRecycleBin.java
@@ -258,7 +258,7 @@ final class ExtractRecycleBin extends Extract {
                     addFileSystemFile(skCase, fsContent, parentFolder, fsContent.getName(), deletedTimeStamp);
                 } else if (fsContent.isDir()) {
                     String newPath = parentPath + "\\" + fsContent.getName();
-                    AbstractFile childFolder = getOrMakeFolder(skCase, (FsContent) fsContent, parentPath);
+                    AbstractFile childFolder = getOrMakeFolder(skCase, fsContent, parentPath);
                     popuplateDeletedDirectory(skCase, childFolder, fsContent.getChildren(), newPath, deletedTimeStamp);
                 }
             }

From 2624305fd8a9f24482e19d64ec7fe347867e8470 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 14:20:17 -0400
Subject: [PATCH 20/37] Changed name (slightly) of new OpenCvLoader API

---
 .../sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java | 2 +-
 Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java      | 2 +-
 CoreLibs/src/org/sleuthkit/autopsy/corelibs/OpenCvLoader.java | 4 ++--
 .../objectdetection/ObjectDetectectionFileIngestModule.java   | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java
index 0e1b9c9fb1..e5793e9c3e 100644
--- a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java
+++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaViewImagePanel.java
@@ -199,7 +199,7 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan
         imageTaggingOptions.setPopupSize(300, 150);
         
         //Disable image tagging for non-windows users or upon failure to load OpenCV.
-        if (!PlatformUtil.isWindowsOS() || !OpenCvLoader.hasOpenCvLoaded()) {
+        if (!PlatformUtil.isWindowsOS() || !OpenCvLoader.openCvIsLoaded()) {
             tagsMenu.setEnabled(false);
             imageTaggingOptions.setEnabled(false);
         }
diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java
index c2ed64987e..0016d84eb5 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java
@@ -121,7 +121,7 @@ public class ImageUtils {
         }
         DEFAULT_THUMBNAIL = tempImage;
         boolean tempFfmpegLoaded = false;
-        if (OpenCvLoader.hasOpenCvLoaded()) {
+        if (OpenCvLoader.openCvIsLoaded()) {
             try {
                 if (System.getProperty("os.arch").equals("amd64") || System.getProperty("os.arch").equals("x86_64")) { //NON-NLS
                     System.loadLibrary("opencv_ffmpeg248_64"); //NON-NLS
diff --git a/CoreLibs/src/org/sleuthkit/autopsy/corelibs/OpenCvLoader.java b/CoreLibs/src/org/sleuthkit/autopsy/corelibs/OpenCvLoader.java
index 79e4678e91..ffc08a597f 100644
--- a/CoreLibs/src/org/sleuthkit/autopsy/corelibs/OpenCvLoader.java
+++ b/CoreLibs/src/org/sleuthkit/autopsy/corelibs/OpenCvLoader.java
@@ -59,7 +59,7 @@ public final class OpenCvLoader {
      *
      * @return True or false.
      */
-    public static boolean hasOpenCvLoaded() {
+    public static boolean openCvIsLoaded() {
         return openCvLoaded;
     }
 
@@ -78,7 +78,7 @@ public final class OpenCvLoader {
      *                              of the core OpenCV library during static
      *                              initialization of this class.
      *
-     * @deprecated Use hasOpenCvLoaded instead.
+     * @deprecated Use openCvIsLoaded instead.
      */
     @Deprecated
     public static boolean isOpenCvLoaded() throws UnsatisfiedLinkError {
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/objectdetection/ObjectDetectectionFileIngestModule.java b/Experimental/src/org/sleuthkit/autopsy/experimental/objectdetection/ObjectDetectectionFileIngestModule.java
index 9ba93585bf..be7a3c72a7 100644
--- a/Experimental/src/org/sleuthkit/autopsy/experimental/objectdetection/ObjectDetectectionFileIngestModule.java
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/objectdetection/ObjectDetectectionFileIngestModule.java
@@ -84,7 +84,7 @@ public class ObjectDetectectionFileIngestModule extends FileIngestModuleAdapter
             throw new IngestModule.IngestModuleException(errorMsg);
         }
         
-        if(!OpenCvLoader.hasOpenCvLoaded()) {
+        if(!OpenCvLoader.openCvIsLoaded()) {
             String errorMsg = Bundle.ObjectDetectionFileIngestModule_openCVNotLoaded();
             logger.log(Level.SEVERE, errorMsg);
             throw new IngestModule.IngestModuleException(errorMsg);

From dfdba9c4d366409c831531caec77abb5a866d54f Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 14:30:40 -0400
Subject: [PATCH 21/37] Fix Codacy issues in fix for backwards incompatibility
 in reports

---
 .../sleuthkit/autopsy/report/ReportProgressPanel.java  |  9 +++++++--
 .../report/infrastructure/ReportProgressIndicator.java | 10 ----------
 .../org/netbeans/core/startup/Bundle.properties        |  2 +-
 .../netbeans/core/windows/view/ui/Bundle.properties    |  2 +-
 4 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
index f3128a7290..89b152abf0 100644
--- a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
@@ -29,7 +29,6 @@ import java.io.File;
 import java.io.IOException;
 import java.util.logging.Level;
 import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.report.infrastructure.ReportProgressIndicator;
 
 /**
  * A panel used by a report generation module to show progress.
@@ -75,7 +74,7 @@ public class ReportProgressPanel extends javax.swing.JPanel {
      * @param reportName The name of the report being generated.
      * @param reportPath The path to the report file.
      */
-    public void setLabels(String reportName, String reportPath) {
+    public final void setLabels(String reportName, String reportPath) {
         reportLabel.setText(reportName);
         if (null != reportPath) {
             pathLabel.setText("" + shortenPath(reportPath) + ""); //NON-NLS
@@ -85,10 +84,16 @@ public class ReportProgressPanel extends javax.swing.JPanel {
 
                 @Override
                 public void mouseClicked(MouseEvent mouseEvent) {
+                    /*
+                     * Do nothing for this event.
+                     */
                 }
 
                 @Override
                 public void mousePressed(MouseEvent mouseEvent) {
+                    /*
+                     * Do nothing for this event.
+                     */
                 }
 
                 @Override
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java
index 0dfd3fe68f..a0e0b968fc 100755
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportProgressIndicator.java
@@ -44,16 +44,6 @@ public class ReportProgressIndicator extends ReportProgressPanel {
         this.progressIndicator = progressIndicator;
     }
 
-    @Override
-    public void setLabels(String reportName, String reportPath) {
-        /*
-         * This method is not expected to be called. It exists for use by the
-         * ReportGenerationPanel, which is not expected to be instantiated when
-         * this class is used.
-         */
-        super.setLabels(reportName, reportPath);
-    }
-
     @Override
     @NbBundle.Messages({
         "ReportProgressIndicator.startMessage=Report generation started"
diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
index 158d4a62d7..4fd4fb33d8 100644
--- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
+++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
@@ -1,5 +1,5 @@
 #Updated by build script
-#Wed, 02 Oct 2019 12:06:32 -0400
+#Fri, 04 Oct 2019 14:30:10 -0400
 LBL_splash_window_title=Starting Autopsy
 SPLASH_HEIGHT=314
 SPLASH_WIDTH=538
diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
index 3f60232032..17f4cb7436 100644
--- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
+++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
@@ -1,4 +1,4 @@
 #Updated by build script
-#Wed, 02 Oct 2019 12:06:32 -0400
+#Fri, 04 Oct 2019 14:30:10 -0400
 CTL_MainWindow_Title=Autopsy 4.13.0
 CTL_MainWindow_Title_No_Project=Autopsy 4.13.0

From 6e87cf2aec1c1a116b9bae51ed764034afb3aa2a Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 15:44:37 -0400
Subject: [PATCH 22/37] 4940 Fix SQLiteDBConnect

---
 .../autopsy/coreutils/SQLiteDBConnect.java    | 250 +++++++++++++-----
 1 file changed, 177 insertions(+), 73 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
index d6c9097cd3..c27c7d1ac8 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
@@ -2,7 +2,7 @@
  *
  * Autopsy Forensic Browser
  *
- * Copyright 2012-2018 Basis Technology Corp.
+ * Copyright 2012-2019 Basis Technology Corp.
  *
  * Copyright 2012 42six Solutions.
  * Contact: aebadirad  42six  com
@@ -30,108 +30,212 @@ import java.sql.Statement;
 import java.util.logging.Level;
 
 /**
- * Database connection class & utilities.
+ * An abstraction that loads a given SQLite driver, establishes a connection to
+ * a given database, and creates a statement for the connection to support basic
+ * SQL operations on the database.
  */
 public class SQLiteDBConnect implements AutoCloseable {
 
-    public String sDriver = "";
-    public String sUrl = null;
-    public int iTimeout = 30;
-    public Connection conn = null;
-    public Statement statement = null;
     private static final Logger logger = Logger.getLogger(SQLiteDBConnect.class.getName());
 
-    /*
-     * Stub constructor for quick instantiation o/t fly for using some of the
-     * ancillary stuff
+    /**
+     * Constructs an abstraction that loads a given SQLite driver, establishes a
+     * connection to a given database, and creates a statement for the
+     * connection to support basic SQL operations on the database.
+     *
+     * @param driver The SQLite driver class name.
+     * @param url    The SQLite database URL to which to connect.
+     *
+     * @throws SQLException If there is an error loading the driver,
+     *                      establishing the connection, or creating a statement
+     *                      for the connection.
      */
-    public SQLiteDBConnect() {
-    }
-
-    /*
-     * quick and dirty constructor to test the database passing the
-     * DriverManager name and the fully loaded url to handle
-     */
- /*
-     * NB this will typically be available if you make this class concrete and
-     * not abstract
-     */
-    public SQLiteDBConnect(String sDriverToLoad, String sUrlToLoad) throws SQLException {
-        init(sDriverToLoad, sUrlToLoad);
-    }
-
-    public final void init(String sDriverVar, String sUrlVar) throws SQLException {
-        setDriver(sDriverVar);
-        setUrl(sUrlVar);
-        setConnection();
-        setStatement();
-    }
-
-    private void setDriver(String sDriverVar) {
-        sDriver = sDriverVar;
-    }
-
-    private void setUrl(String sUrlVar) {
-        sUrl = sUrlVar;
-    }
-
-    public void setConnection() throws SQLException {
+    public SQLiteDBConnect(String driver, String url) throws SQLException {
+        sDriver = driver;
+        sUrl = url;
         try {
             Class.forName(sDriver);
-        } catch (ClassNotFoundException e) {
-
+        } catch (ClassNotFoundException ex) {
+            throw new SQLException(ex);
         }
         conn = DriverManager.getConnection(sUrl);
-    }
-
-    public Connection getConnection() {
-        return conn;
-    }
-
-    public void setStatement() throws SQLException {
-        if (conn == null) {
-            setConnection();
-        }
         statement = conn.createStatement();
-        statement.setQueryTimeout(iTimeout);  // set timeout to 30 sec.
+        statement.setQueryTimeout(iTimeout);
     }
 
-    public Statement getStatement() {
-        return statement;
-    }
-
-    public void executeStmt(String instruction) throws SQLException {
-        statement.executeUpdate(instruction);
-    }
-
-    /** processes an array of instructions e.g. a set of SQL command strings
-     * passed from a file
+    /**
+     * Executes an SQL statement. For use with statements that do not return
+     * result sets.
      *
-     * NB you should ensure you either handle empty lines in files by either
-     * removing them or parsing them out since they will generate spurious
-     * SQLExceptions when they are encountered during the iteration....
+     * @param sqlStatement The SQL statement to execute.
+     *
+     * @throws SQLException If there is an error executing the statement.
      */
-    public void executeStmt(String[] instructionSet) throws SQLException {
-        for (int i = 0; i < instructionSet.length; i++) {
-            executeStmt(instructionSet[i]);
+    public void executeStmt(String sqlStatement) throws SQLException {
+        statement.executeUpdate(sqlStatement);
+    }
+
+    /**
+     * Executes one or more SQL statements in sequence. For use with statements
+     * that do not return result sets.
+     *
+     * @param sqlStatements The SQL statements to execute.
+     *
+     * @throws SQLException If there is an error executing the statements.
+     */
+    public void executeStmt(String[] sqlStatements) throws SQLException {
+        for (String stmt : sqlStatements) {
+            executeStmt(stmt);
         }
     }
 
-    public ResultSet executeQry(String instruction) throws SQLException {
-        return statement.executeQuery(instruction);
+    /**
+     * Executes an SQL query and returns a result set. The caller should close
+     * the result set when finished with it, and should not make any other calls
+     * on this object until finished with the result set.
+     *
+     * @param sqlStatement The SQL query to execute.
+     *
+     * @return The result set.
+     *
+     * @throws SQLException If there is an error executing the query.
+     */
+    public ResultSet executeQry(String sqlStatement) throws SQLException {
+        return statement.executeQuery(sqlStatement);
     }
 
+    /**
+     * Closes the connection to the database. Should be called when the use of
+     * this object is completed, unless the object was constructed in a try with
+     * resources statement, in which case the closing is automatic when the
+     * object goes out of scope.
+     */
     public void closeConnection() {
+        if (conn == null) {
+            return;
+        }
         try {
             conn.close();
         } catch (SQLException ex) {
             logger.log(Level.WARNING, "Unable to close connection to SQLite DB at " + sUrl, ex);
         }
-        //Implementing Autoclosable.close() allows this class to be used in try-with-resources.
     }
 
     @Override
     public void close() {
         closeConnection();
     }
+
+    /*
+     * Partially constructs a utility object for doing basic operations on a
+     * SQLite database. The object is not in a usable state. Further
+     * initialization is required. See init() method.
+     *
+     * @deprecated Do not use.
+     */
+    @Deprecated
+    public SQLiteDBConnect() {
+    }
+
+    /**
+     * Loads a given SQLite driver, establishes a connection to a given
+     * database, and creates a statement for the connection.
+     *
+     * @param driver The SQLite driver class name.
+     * @param url    The SQLite database URL to which to connect.
+     *
+     * @throws SQLException If there is an error establishing the connection or
+     *                      creating a statement for the connection.
+     *
+     * @deprecated Do not use.
+     */
+    @Deprecated
+    public final void init(String driver, String url) throws SQLException {
+        sDriver = driver;
+        sUrl = url;
+        if (conn != null) {
+            closeConnection();
+        }
+        setConnection();
+        setStatement();
+    }
+
+    /**
+     * Gets the connection, if any, to the database.
+     *
+     * @return The connection to the database, may be null.
+     *
+     * @deprecated
+     */
+    @Deprecated
+    public Connection getConnection() {
+        return conn;
+    }
+
+    /**
+     * Sets or resets the connection to the SQLite database, if the SQLite
+     * driver and the dtabase URL have been set.
+     *
+     * @throws SQLException If there is an error loading the driver or
+     *                      establishing the connection.
+     *
+     * @deprecated Do not use.
+     */
+    @Deprecated
+    public void setConnection() throws SQLException {
+        if (sDriver == null || sDriver.isEmpty() || sUrl == null || sUrl.isEmpty()) {
+            throw new SQLException("Driver and or databse URl not initialized");
+        }
+        closeConnection();
+        try {
+            Class.forName(sDriver);
+        } catch (ClassNotFoundException ex) {
+            throw new SQLException(ex);
+        }
+        conn = DriverManager.getConnection(sUrl);
+    }
+
+    /**
+     * Creates a connection to the database if there is none, and creates a
+     * statement using the connection.
+     *
+     * @throws SQLException If there is an error creating the connection or the
+     *                      staement.
+     *
+     * @deprecated Do not use.
+     */
+    @Deprecated
+    public void setStatement() throws SQLException {
+        if (conn == null) {
+            setConnection();
+        }
+        statement = conn.createStatement();
+        statement.setQueryTimeout(iTimeout);
+    }
+
+    /**
+     * Gets the statement, if any, associated with the connection top the
+     * database, if any.
+     *
+     * @return The statement, may be null.
+     *
+     * @deprecated Do not use.
+     */
+    @Deprecated
+    public Statement getStatement() {
+        return statement;
+    }
+
+    /*
+     * The lack of encapsulation of these fields is an error. Access to them
+     * outside of instances of this class is deprecated.
+     *
+     * @deprecated Do not access.
+     */
+    public String sDriver = "";
+    public String sUrl = null;
+    public int iTimeout = 30;
+    public Connection conn = null;
+    public Statement statement = null;
+
 }

From cde9c380805d91a668cd7c85999bf92c30711f54 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 15:49:27 -0400
Subject: [PATCH 23/37] 4940 Fix SQLiteDBConnect

---
 Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
index c27c7d1ac8..07b0f3ee55 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
@@ -37,6 +37,7 @@ import java.util.logging.Level;
 public class SQLiteDBConnect implements AutoCloseable {
 
     private static final Logger logger = Logger.getLogger(SQLiteDBConnect.class.getName());
+    private static final int STMT_EXEC_TIMEOUT_SECS = 30;
 
     /**
      * Constructs an abstraction that loads a given SQLite driver, establishes a
@@ -60,7 +61,7 @@ public class SQLiteDBConnect implements AutoCloseable {
         }
         conn = DriverManager.getConnection(sUrl);
         statement = conn.createStatement();
-        statement.setQueryTimeout(iTimeout);
+        statement.setQueryTimeout(STMT_EXEC_TIMEOUT_SECS);
     }
 
     /**

From b897243a51693f9cda7b7f068e137ffefd071c37 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 15:50:53 -0400
Subject: [PATCH 24/37] 4940 Fix SQLiteDBConnect

---
 Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
index 07b0f3ee55..b738bd4c0b 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
@@ -235,7 +235,7 @@ public class SQLiteDBConnect implements AutoCloseable {
      */
     public String sDriver = "";
     public String sUrl = null;
-    public int iTimeout = 30;
+    public int iTimeout = STMT_EXEC_TIMEOUT_SECS;
     public Connection conn = null;
     public Statement statement = null;
 

From 1a571c4545ef12c724687038a80509e8679798ff Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 15:52:42 -0400
Subject: [PATCH 25/37] 4940 Fix SQLiteDBConnect

---
 Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
index b738bd4c0b..6f37cbfe5f 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
@@ -166,7 +166,7 @@ public class SQLiteDBConnect implements AutoCloseable {
      *
      * @return The connection to the database, may be null.
      *
-     * @deprecated
+     * @deprecated Do not use.
      */
     @Deprecated
     public Connection getConnection() {

From cb7754290c24b5b3725cf72a12e984a0734c32a8 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 15:54:30 -0400
Subject: [PATCH 26/37] 4940 Fix SQLiteDBConnect

---
 .../autopsy/coreutils/SQLiteDBConnect.java    | 24 +++++++++----------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
index 6f37cbfe5f..5f11e867d9 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
@@ -161,18 +161,6 @@ public class SQLiteDBConnect implements AutoCloseable {
         setStatement();
     }
 
-    /**
-     * Gets the connection, if any, to the database.
-     *
-     * @return The connection to the database, may be null.
-     *
-     * @deprecated Do not use.
-     */
-    @Deprecated
-    public Connection getConnection() {
-        return conn;
-    }
-
     /**
      * Sets or resets the connection to the SQLite database, if the SQLite
      * driver and the dtabase URL have been set.
@@ -196,6 +184,18 @@ public class SQLiteDBConnect implements AutoCloseable {
         conn = DriverManager.getConnection(sUrl);
     }
 
+    /**
+     * Gets the connection, if any, to the database.
+     *
+     * @return The connection to the database, may be null.
+     *
+     * @deprecated Do not use.
+     */
+    @Deprecated
+    public Connection getConnection() {
+        return conn;
+    }
+    
     /**
      * Creates a connection to the database if there is none, and creates a
      * statement using the connection.

From 917919398dbc526c1292ec014b7291fdf9c7154a Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 15:55:49 -0400
Subject: [PATCH 27/37] 4940 Fix SQLiteDBConnect

---
 Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
index 5f11e867d9..16a0143a39 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
@@ -130,7 +130,7 @@ public class SQLiteDBConnect implements AutoCloseable {
     /*
      * Partially constructs a utility object for doing basic operations on a
      * SQLite database. The object is not in a usable state. Further
-     * initialization is required. See init() method.
+     * initialization is required. See methods below.
      *
      * @deprecated Do not use.
      */

From e37d49d90b81dbb6503becb6816eacff4ca54896 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 15:57:47 -0400
Subject: [PATCH 28/37] 4940 Fix SQLiteDBConnect

---
 .../org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java    | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
index 16a0143a39..6ed93d2975 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
@@ -154,9 +154,7 @@ public class SQLiteDBConnect implements AutoCloseable {
     public final void init(String driver, String url) throws SQLException {
         sDriver = driver;
         sUrl = url;
-        if (conn != null) {
-            closeConnection();
-        }
+        closeConnection();
         setConnection();
         setStatement();
     }
@@ -195,7 +193,7 @@ public class SQLiteDBConnect implements AutoCloseable {
     public Connection getConnection() {
         return conn;
     }
-    
+
     /**
      * Creates a connection to the database if there is none, and creates a
      * statement using the connection.

From 99c6856a087cddc2d658e19deffae32bca295b23 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 16:01:35 -0400
Subject: [PATCH 29/37] 4940 Fix SQLiteDBConnect

---
 Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
index 6ed93d2975..a22071fa78 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/SQLiteDBConnect.java
@@ -161,7 +161,7 @@ public class SQLiteDBConnect implements AutoCloseable {
 
     /**
      * Sets or resets the connection to the SQLite database, if the SQLite
-     * driver and the dtabase URL have been set.
+     * driver and the database URL have been set.
      *
      * @throws SQLException If there is an error loading the driver or
      *                      establishing the connection.
@@ -213,7 +213,7 @@ public class SQLiteDBConnect implements AutoCloseable {
     }
 
     /**
-     * Gets the statement, if any, associated with the connection top the
+     * Gets the statement, if any, associated with the connection to the
      * database, if any.
      *
      * @return The statement, may be null.

From 04feb78a63fcbb96cbdabc52ac396586881ba385 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 16:28:39 -0400
Subject: [PATCH 30/37] Clarify docs for AppSQLiteDD.findAppDatabases

---
 .../autopsy/coreutils/AppSQLiteDB.java        | 215 +++++++++---------
 1 file changed, 108 insertions(+), 107 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java b/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java
index 0929bf8078..2e0564d836 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java
@@ -16,7 +16,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.sleuthkit.autopsy.coreutils;
 
 import java.io.Closeable;
@@ -43,74 +42,76 @@ import org.sleuthkit.datamodel.SleuthkitCase;
 import org.sleuthkit.datamodel.TskCoreException;
 
 /**
- * An abstraction around an SQLite app DB found in a data source.
- * This class makes a copy of it, along with any meta files (WAL, SHM),
- * opens a SQLite connection to it, and runs queries on it.
+ * An abstraction around an SQLite app DB found in a data source. This class
+ * makes a copy of it, along with any meta files (WAL, SHM), opens a SQLite
+ * connection to it, and runs queries on it.
  */
 public final class AppSQLiteDB {
+
     private final Logger logger = Logger.getLogger(AppSQLiteDB.class.getName());
-    
+
     private final AbstractFile dbAbstractFile;  // AbstractFile for the DB file
-    
+
     private final Connection connection;
     private final Statement statement;
-    
-    
+
     /**
-     * Class to abstract the abstract file for a DB file and its  on disk copy
-     * 
+     * Class to abstract the abstract file for a DB file and its on disk copy
+     *
      */
     private static final class AppSQLiteDBFileBundle {
+
         private final AbstractFile dbAbstractFile;
         private final File dbFileCopy;
-        
+
         AppSQLiteDBFileBundle(AbstractFile dbAbstractFile, File dbFileCopy) {
             this.dbAbstractFile = dbAbstractFile;
             this.dbFileCopy = dbFileCopy;
         }
-        
+
         AbstractFile getAbstractFile() {
             return dbAbstractFile;
         }
-        
+
         File getFileCopy() {
             return dbFileCopy;
         }
-        
+
     }
-    
+
     private AppSQLiteDB(AppSQLiteDBFileBundle appSQLiteDBFileBundle) throws ClassNotFoundException, SQLException {
         this.dbAbstractFile = appSQLiteDBFileBundle.getAbstractFile();
-        
+
         Class.forName("org.sqlite.JDBC"); //NON-NLS //load JDBC driver
         connection = DriverManager.getConnection("jdbc:sqlite:" + appSQLiteDBFileBundle.getFileCopy().getPath()); //NON-NLS
         statement = connection.createStatement();
     }
-    
-   
+
     /**
-     * Looks for the given SQLIte database filename, with matching path substring. 
-     * It looks for exact name or a pattern match based on a input parameter.
-     * It makes a copy of each matching file, and creates an instance of 
-     * AppSQLiteDB to help query the DB. 
-     * 
-     * A list of AppSQLiteDB instances is returned, one for each 
-     * match found.
-     * 
-     * @param dataSource data source to search in 
-     * @param dbName db file name to search
-     * @param matchExactName whether to look for exact file name or a pattern match
-     * @param parentPathSubstr path substring to match
-     * 
-     * @return A list of abstract files matching the specified name and path.
-     *         Returns an empty list if no matching database is found.
+     * Looks for application SQLite database files with a given name or name
+     * substring and a given parent path or parent path substring. For each
+     * database file found, a temporary copy is made and an open connection to
+     * the database in the form of an AppSQLiteDB object is created and
+     * returned.
+     *
+     * @param dataSource       The data source to be searched for the database
+     *                         files.
+     * @param dbFileName       The database file name or file name substring for
+     *                         which to search.
+     * @param matchExactName   Whether or not the database file name argument is
+     *                         the full database file name or a substring.
+     * @param parentPathSubstr The parent path substring, may be the empty
+     *                         string to mathc any parent path.
+     *
+     * @return A list, possibly empty, of AppSQLiteDB objects for the files that
+     *         were found, copied, and connected to.
      */
     public static Collection findAppDatabases(DataSource dataSource,
-            String dbName, boolean matchExactName, String parentPathSubstr) {
-        
-        List appDbs = new ArrayList<> ();
+            String dbFileName, boolean matchExactName, String parentPathSubstr) {
+
+        List appDbs = new ArrayList<>();
         try {
-            Collection dbFileBundles = findAndCopySQLiteDB( dataSource,  dbName,  matchExactName, parentPathSubstr, false);
+            Collection dbFileBundles = findAndCopySQLiteDB(dataSource, dbFileName, matchExactName, parentPathSubstr, false);
             dbFileBundles.forEach((dbFileBundle) -> {
                 try {
                     AppSQLiteDB appSQLiteDB = new AppSQLiteDB(dbFileBundle);
@@ -120,102 +121,105 @@ public final class AppSQLiteDB {
                 }
             });
         } catch (TskCoreException ex) {
-            Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error finding App database files with name = '%s' and path = '%s'.", dbName, parentPathSubstr), ex); //NON-NLS
+            Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error finding App database files with name = '%s' and path = '%s'.", dbFileName, parentPathSubstr), ex); //NON-NLS
         }
-        
+
         return appDbs;
     }
-    
+
     public AbstractFile getDBFile() {
         return this.dbAbstractFile;
     }
-    
+
     /**
      * Attaches a database to the current connection.
-     * 
-     * Finds the specified database file in the specified folder.  
-     * If found, makes copy of the database in the case folder and
-     * run ATTACH DATABASE sql.
-     * 
+     *
+     * Finds the specified database file in the specified folder. If found,
+     * makes copy of the database in the case folder and run ATTACH DATABASE
+     * sql.
+     *
      * @param dataSource data source in which to look file the db file
-     * @param dbName name of db file to look for
-     * @param dbPath path in which to look for the db file
-     * @param dbAlias alias name to attach the database as
-     * 
-     * @return abstract file for the matching db file.
-     *         null if no match is found.
+     * @param dbName     name of db file to look for
+     * @param dbPath     path in which to look for the db file
+     * @param dbAlias    alias name to attach the database as
+     *
+     * @return abstract file for the matching db file. null if no match is
+     *         found.
      *
      * @throws SQLException in case of an SQL error
      */
-    public AbstractFile attachDatabase(DataSource dataSource, String dbName, 
-                    String dbPath, String dbAlias) throws SQLException {
+    public AbstractFile attachDatabase(DataSource dataSource, String dbName,
+            String dbPath, String dbAlias) throws SQLException {
         try {
             // find and copy DB files with exact name and path.
-            Collection dbFileBundles = findAndCopySQLiteDB(dataSource,  dbName, true, dbPath, true);
+            Collection dbFileBundles = findAndCopySQLiteDB(dataSource, dbName, true, dbPath, true);
             if (!dbFileBundles.isEmpty()) {
                 AppSQLiteDBFileBundle dbFileBundle = dbFileBundles.iterator().next();
                 String attachDbSql = String.format("ATTACH DATABASE '%s' AS '%s'", dbFileBundle.getFileCopy().getPath(), dbAlias); //NON-NLS
-                statement.executeUpdate(attachDbSql); 
-                    
+                statement.executeUpdate(attachDbSql);
+
                 return dbFileBundle.getAbstractFile();
             }
         } catch (TskCoreException ex) {
             Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error attaching to App database files with name = '%s' and path = '%s'.", dbName, dbPath), ex); //NON-NLS
         }
-        
+
         return null;
     }
-    
+
     /**
-     * Finds database file with the specified name, makes a copy of the file in the case directory, 
-     * and returns the AbstractFile as well as the file copy.
-     * 
-     * @param dataSource data source to search in 
-     * @param dbName db file name to search
-     * @param matchExactName whether to look for exact file name or a pattern match
-     * @param dbPath path to match
-     * @param matchExactPath whether to look for exact path name or a substring match
-     * 
+     * Finds database file with the specified name, makes a copy of the file in
+     * the case directory, and returns the AbstractFile as well as the file
+     * copy.
+     *
+     * @param dataSource     data source to search in
+     * @param dbName         db file name to search
+     * @param matchExactName whether to look for exact file name or a pattern
+     *                       match
+     * @param dbPath         path to match
+     * @param matchExactPath whether to look for exact path name or a substring
+     *                       match
+     *
      * @return a collection of AppSQLiteDBFileBundle
-     * 
-     * @throws TskCoreException 
+     *
+     * @throws TskCoreException
      */
-    private static Collection findAndCopySQLiteDB(DataSource dataSource, String dbName, 
-                    boolean matchExactName,  String dbPath, boolean matchExactPath) throws TskCoreException {
-        
+    private static Collection findAndCopySQLiteDB(DataSource dataSource, String dbName,
+            boolean matchExactName, String dbPath, boolean matchExactPath) throws TskCoreException {
+
         Case openCase;
         try {
             openCase = Case.getCurrentCaseThrows();
         } catch (NoCurrentCaseException ex) {
             throw new TskCoreException("Failed to get current case.", ex);
         }
-        
-        List dbFileBundles = new ArrayList<> ();
+
+        List dbFileBundles = new ArrayList<>();
         long fileId = 0;
         String localDiskPath = "";
-        
+
         SleuthkitCase skCase = openCase.getSleuthkitCase();
         String parentPath = dbPath.replace("\\", "/");
         parentPath = SleuthkitCase.escapeSingleQuotes(parentPath);
-        
+
         String whereClause;
         if (matchExactName) {
             whereClause = String.format("LOWER(name) = LOWER('%s')", dbName);
         } else {
-            whereClause = String.format("LOWER(name) LIKE LOWER('%%%s%%') AND LOWER(name) NOT LIKE LOWER('%%journal%%')", dbName );
+            whereClause = String.format("LOWER(name) LIKE LOWER('%%%s%%') AND LOWER(name) NOT LIKE LOWER('%%journal%%')", dbName);
         }
         if (matchExactPath) {
-            whereClause += String.format(" AND LOWER(parent_path) = LOWER('%s')", parentPath );
+            whereClause += String.format(" AND LOWER(parent_path) = LOWER('%s')", parentPath);
         } else {
-            whereClause += String.format(" AND LOWER(parent_path) LIKE LOWER('%%%s%%')", parentPath );
+            whereClause += String.format(" AND LOWER(parent_path) LIKE LOWER('%%%s%%')", parentPath);
         }
         whereClause += String.format(" AND data_source_obj_id = %s", dataSource.getId());
-        
+
         List absFiles = skCase.findAllFilesWhere(whereClause);
         for (AbstractFile absFile : absFiles) {
             try {
                 localDiskPath = openCase.getTempDirectory()
-                                        + File.separator + absFile.getId() + absFile.getName();
+                        + File.separator + absFile.getId() + absFile.getName();
                 File jFile = new java.io.File(localDiskPath);
                 fileId = absFile.getId();
                 ContentUtils.writeToFile(absFile, jFile);
@@ -231,61 +235,58 @@ public final class AppSQLiteDB {
                 Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.WARNING, String.format("Error reading content from file '%s' (id=%d).", absFile.getName(), fileId), ex); //NON-NLS
             } catch (IOException | NoCurrentCaseException | TskCoreException ex) {
                 Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error creating AppSQLiteDB  for file '%s' (id=%d) to  copied to '%s'.", absFile.getName(), fileId, localDiskPath), ex); //NON-NLS
-            } 
+            }
         }
-        
+
         return dbFileBundles;
     }
-    
+
     /**
      * Detaches the specified database from the connection
-     * 
+     *
      * @param dbAlias alias for database to detach
-     * 
-     * @throws SQLException 
+     *
+     * @throws SQLException
      */
-    public void detachDatabase(String dbAlias) throws SQLException  {
+    public void detachDatabase(String dbAlias) throws SQLException {
         String detachDbSql = String.format("DETACH DATABASE '%s'", dbAlias);
         statement.executeUpdate(detachDbSql); //NON-NLS
     }
-     
-    
+
     /**
      * Runs the given query on the database and returns result set.
-
+     *
      * @param queryStr SQL string for the query to run
-     * 
-     * @return ResultSet from running the query. 
-     * 
+     *
+     * @return ResultSet from running the query.
+     *
      * @throws SQLException in case of an error.
-     *         
+     *
      */
     public ResultSet runQuery(String queryStr) throws SQLException {
         ResultSet resultSet = null;
-       
+
         if (null != queryStr) {
             resultSet = statement.executeQuery(queryStr); //NON-NLS
-        } 
+        }
         return resultSet;
     }
-    
+
     /**
      * Closes the DB connection.
-     * 
+     *
      */
     public void close() {
-        
+
         // Close the DB connection
         try {
             statement.close();
             connection.close();
         } catch (SQLException e) {
             logger.log(Level.SEVERE, "Error closing the database", e); //NON-NLS
-        } 
+        }
     }
-    
-    
-    
+
     /**
      * Searches for a meta file associated with the give SQLite database. If
      * found, it copies this file into the temp directory of the current case.
@@ -313,11 +314,11 @@ public final class AppSQLiteDB {
         if (metaFiles != null) {
             for (AbstractFile metaFile : metaFiles) {
                 String localDiskPath = openCase.getTempDirectory()
-                                            + File.separator + sqliteFile.getId() + metaFile.getName();
+                        + File.separator + sqliteFile.getId() + metaFile.getName();
                 File localMetaFile = new File(localDiskPath);
                 if (!localMetaFile.exists()) {
                     ContentUtils.writeToFile(metaFile, localMetaFile);
-                }  
+                }
             }
         }
     }

From d9a6a35b7c6a1b17995b9a7e52923b1b08792321 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 16:30:28 -0400
Subject: [PATCH 31/37] Clarify docs for AppSQLiteDD.findAppDatabases

---
 Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java b/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java
index 2e0564d836..af7cb895da 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java
@@ -100,8 +100,8 @@ public final class AppSQLiteDB {
      *                         which to search.
      * @param matchExactName   Whether or not the database file name argument is
      *                         the full database file name or a substring.
-     * @param parentPathSubstr The parent path substring, may be the empty
-     *                         string to mathc any parent path.
+     * @param parentPathSubstr The parent path substring, may pass the empty
+     *                         string to match any parent path.
      *
      * @return A list, possibly empty, of AppSQLiteDB objects for the files that
      *         were found, copied, and connected to.

From 515c736e7ee834ee52e783cb5d7ab006c5231e24 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 16:31:10 -0400
Subject: [PATCH 32/37] Clarify docs for AppSQLiteDD.findAppDatabases

---
 Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java b/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java
index af7cb895da..219d0497ff 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/AppSQLiteDB.java
@@ -18,7 +18,6 @@
  */
 package org.sleuthkit.autopsy.coreutils;
 
-import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
 import java.sql.Connection;

From cfdf0a0e6173012fd9641b3ace08f1d66e59e528 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 17:11:48 -0400
Subject: [PATCH 33/37] Add display names to ReportProgressPanle.ReportStatus

---
 .../autopsy/report/Bundle.properties          |  1 -
 .../autopsy/report/Bundle.properties-MERGED   |  6 ++-
 .../autopsy/report/ReportProgressPanel.java   | 37 +++++++++++++++----
 3 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties
index 7ad1d6fca4..c293136c40 100644
--- a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties
@@ -6,7 +6,6 @@ ReportProgressPanel.pathLabel.text=pathLabel
 ReportProgressPanel.reportLabel.text=reportLabel
 ReportProgressPanel.statusMessageLabel.text=processingLabel
 ReportProgressPanel.separationLabel.text=:
-ReportProgressPanel.progress.queuing=Queuing...
 ReportProgressPanel.initPathLabel.noFile=No report file
 ReportProgressPanel.start.cancelButton.text=Cancel
 ReportProgressPanel.start.progress.text=Starting report...
diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED
index 7ad1d6fca4..148df03fa2 100755
--- a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED
@@ -3,10 +3,14 @@ DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on
 ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
 ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
 ReportProgressPanel.pathLabel.text=pathLabel
+ReportProgressPanel.progress.canceled=Canceled
+ReportProgressPanel.progress.complete=Complete
+ReportProgressPanel.progress.error=Error
+ReportProgressPanel.progress.queuing=Queuing...
+ReportProgressPanel.progress.running=Running...
 ReportProgressPanel.reportLabel.text=reportLabel
 ReportProgressPanel.statusMessageLabel.text=processingLabel
 ReportProgressPanel.separationLabel.text=:
-ReportProgressPanel.progress.queuing=Queuing...
 ReportProgressPanel.initPathLabel.noFile=No report file
 ReportProgressPanel.start.cancelButton.text=Cancel
 ReportProgressPanel.start.progress.text=Starting report...
diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
index 89b152abf0..796fcaaf5f 100644
--- a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
@@ -46,13 +46,34 @@ public class ReportProgressPanel extends javax.swing.JPanel {
      * Used by a report generation module to communicate report generation
      * status to this panel and its listeners.
      */
+    @NbBundle.Messages({
+        "ReportProgressPanel.progress.queuing=Queuing...",
+        "ReportProgressPanel.progress.running=Running...",
+        "ReportProgressPanel.progress.complete=Complete",
+        "ReportProgressPanel.progress.canceled=Canceled",
+        "ReportProgressPanel.progress.error=Error",})
     public enum ReportStatus {
 
-        QUEUING,
-        RUNNING,
-        COMPLETE,
-        CANCELED,
-        ERROR
+        QUEUING(Bundle.ReportProgressPanel_progress_queuing()),
+        RUNNING(Bundle.ReportProgressPanel_progress_running()),
+        COMPLETE(Bundle.ReportProgressPanel_progress_complete()),
+        CANCELED(Bundle.ReportProgressPanel_progress_canceled()),
+        ERROR(Bundle.ReportProgressPanel_progress_error());
+
+        private final String displayName;
+
+        private ReportStatus(String displayName) {
+            this.displayName = displayName;
+        }
+
+        /**
+         * Gets the display name of the report status.
+         *
+         * @return The display name.
+         */
+        public String getDisplayName() {
+            return displayName;
+        }
     }
 
     /**
@@ -267,7 +288,7 @@ public class ReportProgressPanel extends javax.swing.JPanel {
                         reportProgressBar.setValue(reportProgressBar.getMaximum());
                         reportProgressBar.setStringPainted(true);
                         reportProgressBar.setForeground(GREEN);
-                        reportProgressBar.setString("Complete"); //NON-NLS
+                        reportProgressBar.setString(ReportStatus.COMPLETE.getDisplayName());
                         firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
                         break;
                     }
@@ -279,7 +300,7 @@ public class ReportProgressPanel extends javax.swing.JPanel {
                         reportProgressBar.setValue(reportProgressBar.getMaximum());
                         reportProgressBar.setStringPainted(true);
                         reportProgressBar.setForeground(RED);
-                        reportProgressBar.setString("Error"); //NON-NLS
+                        reportProgressBar.setString(ReportStatus.ERROR.getDisplayName());
                         firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
                         break;
                     }
@@ -310,7 +331,7 @@ public class ReportProgressPanel extends javax.swing.JPanel {
                 reportProgressBar.setValue(0);
                 reportProgressBar.setStringPainted(true);
                 reportProgressBar.setForeground(RED); // Red
-                reportProgressBar.setString("Cancelled"); //NON-NLS
+                reportProgressBar.setString(ReportStatus.CANCELED.getDisplayName());
                 firePropertyChange(ReportStatus.CANCELED.toString(), oldValue, status);
                 statusMessageLabel.setForeground(RED);
                 statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.cancel.procLbl.text"));

From 4acd38293e39dd9796d36dd0e43518ed7e4aae36 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 17:20:31 -0400
Subject: [PATCH 34/37] Toggled build.type ot RELEASE for release 4.13.0

---
 nbproject/project.properties | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/nbproject/project.properties b/nbproject/project.properties
index 8132096d48..c561519599 100644
--- a/nbproject/project.properties
+++ b/nbproject/project.properties
@@ -6,8 +6,8 @@ app.name=${branding.token}
 ### if left unset, version will default to today's date
 app.version=4.13.0
 ### build.type must be one of: DEVELOPMENT, RELEASE
-#build.type=RELEASE
-build.type=DEVELOPMENT
+build.type=RELEASE
+#build.type=DEVELOPMENT
 
 project.org.netbeans.progress=org-netbeans-api-progress
 project.org.sleuthkit.autopsy.experimental=Experimental

From 537c9b68eec66b5e37ff3a6e6cc2424d005c729c Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 17:44:53 -0400
Subject: [PATCH 35/37] Update NBM versioning for release 4.13.0

---
 Core/manifest.mf                        | 2 +-
 Core/nbproject/project.properties       | 2 +-
 Core/nbproject/project.xml              | 2 +-
 CoreLibs/manifest.mf                    | 4 ++--
 Experimental/nbproject/project.xml      | 4 ++--
 ImageGallery/nbproject/project.xml      | 4 ++--
 KeywordSearch/nbproject/project.xml     | 4 ++--
 RecentActivity/nbproject/project.xml    | 4 ++--
 Testing/nbproject/project.xml           | 2 +-
 thunderbirdparser/nbproject/project.xml | 2 +-
 10 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/Core/manifest.mf b/Core/manifest.mf
index 53b737fbd1..dbfb89dc59 100644
--- a/Core/manifest.mf
+++ b/Core/manifest.mf
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 OpenIDE-Module: org.sleuthkit.autopsy.core/10
 OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/core/Bundle.properties
 OpenIDE-Module-Layer: org/sleuthkit/autopsy/core/layer.xml
-OpenIDE-Module-Implementation-Version: 28
+OpenIDE-Module-Implementation-Version: 29
 OpenIDE-Module-Requires: org.openide.windows.WindowManager
 AutoUpdate-Show-In-Client: true
 AutoUpdate-Essential-Module: true
diff --git a/Core/nbproject/project.properties b/Core/nbproject/project.properties
index a246e0cc80..06e7638be5 100644
--- a/Core/nbproject/project.properties
+++ b/Core/nbproject/project.properties
@@ -122,5 +122,5 @@ nbm.homepage=http://www.sleuthkit.org/
 nbm.module.author=Brian Carrier
 nbm.needs.restart=true
 source.reference.curator-recipes-2.8.0.jar=release/modules/ext/curator-recipes-2.8.0-sources.jar
-spec.version.base=10.16
+spec.version.base=10.17
 
diff --git a/Core/nbproject/project.xml b/Core/nbproject/project.xml
index 1e32239fc4..8fe442a721 100644
--- a/Core/nbproject/project.xml
+++ b/Core/nbproject/project.xml
@@ -251,7 +251,7 @@
                     
                     
                         3
-                        1.2
+                        1.3
                     
                 
             
diff --git a/CoreLibs/manifest.mf b/CoreLibs/manifest.mf
index 24af339d11..1f7fcc545e 100644
--- a/CoreLibs/manifest.mf
+++ b/CoreLibs/manifest.mf
@@ -1,8 +1,8 @@
 Manifest-Version: 1.0
 OpenIDE-Module: org.sleuthkit.autopsy.corelibs/3
-OpenIDE-Module-Implementation-Version: 5
+OpenIDE-Module-Implementation-Version: 6
 OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/corelibs/Bundle.properties
-OpenIDE-Module-Specification-Version: 1.2
+OpenIDE-Module-Specification-Version: 1.3
 AutoUpdate-Show-In-Client: true
 AutoUpdate-Essential-Module: true
 
diff --git a/Experimental/nbproject/project.xml b/Experimental/nbproject/project.xml
index 1523e88e06..c6e222b422 100644
--- a/Experimental/nbproject/project.xml
+++ b/Experimental/nbproject/project.xml
@@ -135,7 +135,7 @@
                     
                     
                         10
-                        10.16
+                        10.17
                     
                 
                 
@@ -144,7 +144,7 @@
                     
                     
                         3
-                        1.2
+                        1.3
                     
                 
                 
diff --git a/ImageGallery/nbproject/project.xml b/ImageGallery/nbproject/project.xml
index 2220f662b4..634ed81534 100644
--- a/ImageGallery/nbproject/project.xml
+++ b/ImageGallery/nbproject/project.xml
@@ -127,7 +127,7 @@
                     
                     
                         10
-                        10.16
+                        10.17
                     
                 
                 
@@ -136,7 +136,7 @@
                     
                     
                         3
-                        1.2
+                        1.3
                     
                 
             
diff --git a/KeywordSearch/nbproject/project.xml b/KeywordSearch/nbproject/project.xml
index 3f40ab3ace..c68f7a3abd 100644
--- a/KeywordSearch/nbproject/project.xml
+++ b/KeywordSearch/nbproject/project.xml
@@ -119,7 +119,7 @@
                     
                     
                         10
-                        10.16
+                        10.17
                     
                 
                 
@@ -128,7 +128,7 @@
                     
                     
                         3
-                        1.2
+                        1.3
                     
                 
             
diff --git a/RecentActivity/nbproject/project.xml b/RecentActivity/nbproject/project.xml
index 269723962e..29b5d1362a 100644
--- a/RecentActivity/nbproject/project.xml
+++ b/RecentActivity/nbproject/project.xml
@@ -60,7 +60,7 @@
                     
                     
                         10
-                        10.16
+                        10.17
                     
                 
                 
@@ -69,7 +69,7 @@
                     
                     
                         3
-                        1.2
+                        1.3
                     
                 
             
diff --git a/Testing/nbproject/project.xml b/Testing/nbproject/project.xml
index 4ed9232a8f..41dc8b253e 100644
--- a/Testing/nbproject/project.xml
+++ b/Testing/nbproject/project.xml
@@ -47,7 +47,7 @@
                     
                     
                         10
-                        10.15
+                        10.17
                     
                 
                 
diff --git a/thunderbirdparser/nbproject/project.xml b/thunderbirdparser/nbproject/project.xml
index 2f4d0ad72d..52e915e2f3 100644
--- a/thunderbirdparser/nbproject/project.xml
+++ b/thunderbirdparser/nbproject/project.xml
@@ -36,7 +36,7 @@
                     
                     
                         10
-                        10.16
+                        10.17
                     
                 
                 

From 44d4e508e12e6672a1be358a7907fe86bddc7d70 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 18:01:19 -0400
Subject: [PATCH 36/37] Update ReportProgressPanel bundle usage

---
 Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
index 796fcaaf5f..ecb8623398 100644
--- a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
@@ -83,7 +83,7 @@ public class ReportProgressPanel extends javax.swing.JPanel {
         initComponents();
         reportProgressBar.setIndeterminate(true);
         reportProgressBar.setMaximum(100);
-        statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.progress.queuing"));
+        statusMessageLabel.setText(Bundle.ReportProgressPanel_progress_queuing());
         status = ReportStatus.QUEUING;
         reportLabel.setText("");
         pathLabel.setText(""); //NON-NLS

From 0174b1c8b63077ff05519a3991b8a9feba393269 Mon Sep 17 00:00:00 2001
From: Richard Cordovano 
Date: Fri, 4 Oct 2019 18:34:28 -0400
Subject: [PATCH 37/37] Fix Codacy issue in ReportProgressPanel.java

---
 Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
index ecb8623398..9b48b43a67 100644
--- a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
@@ -62,7 +62,7 @@ public class ReportProgressPanel extends javax.swing.JPanel {
 
         private final String displayName;
 
-        private ReportStatus(String displayName) {
+        ReportStatus(String displayName) {
             this.displayName = displayName;
         }