From 85c2ccfd19644706940836344cd8b7a363278755 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Mon, 17 May 2021 17:42:32 -0400 Subject: [PATCH 1/2] Modified StringConentPanel to remove db calls from EDT --- .../StringsContentPanel.java | 232 ++++++++++++------ 1 file changed, 159 insertions(+), 73 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java index 95cbee43b7..2bad8c9a87 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2019 Basis Technology Corp. + * Copyright 2011-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,11 +23,13 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import java.util.List; +import java.util.concurrent.ExecutionException; import java.util.logging.Level; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.JMenuItem; import javax.swing.JOptionPane; +import javax.swing.SwingWorker; import org.apache.commons.lang3.StringUtils; import org.sleuthkit.autopsy.coreutils.StringExtract; import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractResult; @@ -49,10 +51,10 @@ public class StringsContentPanel extends javax.swing.JPanel { private final byte[] data = new byte[(int) PAGE_LENGTH]; private static int currentPage = 1; private Content dataSource; - //string extract utility - private final StringExtract stringExtract = new StringExtract(); private static final Logger logger = Logger.getLogger(StringsContentPanel.class.getName()); + private SwingWorker worker; + /** * Creates new form StringsTextViewer */ @@ -81,10 +83,10 @@ public class StringsContentPanel extends javax.swing.JPanel { }); // use wrap layout for better component wrapping - WrapLayout layout = new WrapLayout(0,5); + WrapLayout layout = new WrapLayout(0, 5); layout.setOppositeAligned(Arrays.asList(panelScriptSelect)); controlPanel.setLayout(layout); - + } final void resetDisplay() { @@ -370,83 +372,36 @@ public class StringsContentPanel extends javax.swing.JPanel { * @param offset the starting offset */ void setDataView(Content dataSource, long offset) { + + if (worker != null) { + worker.cancel(true); + worker = null; + } + if (dataSource == null) { return; } - // change the cursor to "waiting cursor" for this operation - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - this.dataSource = dataSource; - int bytesRead = 0; - // set the data on the bottom and show it - if (dataSource.getSize() > 0) { - try { - bytesRead = dataSource.read(data, offset, PAGE_LENGTH); // read the data - } catch (TskCoreException ex) { - logger.log(Level.WARNING, "Error while trying to show the String content.", ex); //NON-NLS - } - } - String text; - if (bytesRead > 0) { - //text = DataConversion.getString(data, bytesRead, 4); - final SCRIPT selScript = (SCRIPT) languageCombo.getSelectedItem(); - stringExtract.setEnabledScript(selScript); - StringExtractResult res = stringExtract.extract(data, bytesRead, 0); - text = res.getText(); - if (StringUtils.isBlank(text)) { - text = NbBundle.getMessage(this.getClass(), - "StringsTextViewer.setDataView.errorNoText", currentOffset, - currentOffset + PAGE_LENGTH); - } - } else { - text = NbBundle.getMessage(this.getClass(), "StringsTextViewer.setDataView.errorText", currentOffset, - currentOffset + PAGE_LENGTH); - } + worker = new ContentWorker(dataSource, offset); - // disable or enable the next button - if (offset + PAGE_LENGTH < dataSource.getSize()) { - nextPageButton.setEnabled(true); - } else { - nextPageButton.setEnabled(false); - } - - if (offset == 0) { - prevPageButton.setEnabled(false); - currentPage = 1; // reset the page number - } else { - prevPageButton.setEnabled(true); - } - - int totalPage = Math.round((dataSource.getSize() - 1) / PAGE_LENGTH) + 1; - totalPageLabel.setText(Integer.toString(totalPage)); - currentPageLabel.setText(Integer.toString(currentPage)); - outputViewPane.setText(text); // set the output view - setComponentsVisibility(true); // shows the components that not needed - outputViewPane.moveCaretPosition(0); - - this.setCursor(null); + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + worker.execute(); } void setDataView(StringContent dataSource) { - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - try { - this.dataSource = null; - - // set the data on the bottom and show it - String text = dataSource.getString(); - nextPageButton.setEnabled(false); - prevPageButton.setEnabled(false); - currentPage = 1; - - int totalPage = 1; - totalPageLabel.setText(Integer.toString(totalPage)); - currentPageLabel.setText(Integer.toString(currentPage)); - outputViewPane.setText(text); // set the output view - setComponentsVisibility(true); // shows the components that not needed - outputViewPane.moveCaretPosition(0); - } finally { - this.setCursor(null); + if (worker != null) { + worker.cancel(true); + worker = null; } + + if (dataSource == null) { + return; + } + + worker = new StringContentWorker(dataSource); + + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + worker.execute(); } /** @@ -468,4 +423,135 @@ public class StringsContentPanel extends javax.swing.JPanel { languageLabel.setVisible(isVisible); } + // Swingworker for getting the text from a content object. + private final class ContentWorker extends SwingWorker { + + private final Content content; + private final long offset; + + ContentWorker(Content content, long offset) { + this.content = content; + this.offset = offset; + } + + @Override + protected String doInBackground() throws Exception { + int bytesRead = 0; + // set the data on the bottom and show it + + if (content.getSize() > 0) { + try { + bytesRead = content.read(data, offset, PAGE_LENGTH); // read the data + } catch (TskCoreException ex) { + logger.log(Level.WARNING, "Error while trying to show the String content.", ex); //NON-NLS + } + } + String text; + if (bytesRead > 0) { + //text = DataConversion.getString(data, bytesRead, 4); + final SCRIPT selScript = (SCRIPT) languageCombo.getSelectedItem(); + StringExtract stringExtract = new StringExtract(); + stringExtract.setEnabledScript(selScript); + StringExtractResult res = stringExtract.extract(data, bytesRead, 0); + text = res.getText(); + if (StringUtils.isBlank(text)) { + text = NbBundle.getMessage(this.getClass(), + "StringsTextViewer.setDataView.errorNoText", currentOffset, + currentOffset + PAGE_LENGTH); + } + } else { + text = NbBundle.getMessage(this.getClass(), "StringsTextViewer.setDataView.errorText", currentOffset, + currentOffset + PAGE_LENGTH); + } + + return text; + } + + @Override + public void done() { + if (isCancelled()) { + return; + } + + try { + if (isCancelled()) { + return; + } + String text = get(); + + dataSource = content; + + // disable or enable the next button + if (offset + PAGE_LENGTH < dataSource.getSize()) { + nextPageButton.setEnabled(true); + } else { + nextPageButton.setEnabled(false); + } + + if (offset == 0) { + prevPageButton.setEnabled(false); + currentPage = 1; // reset the page number + } else { + prevPageButton.setEnabled(true); + } + + int totalPage = Math.round((dataSource.getSize() - 1) / PAGE_LENGTH) + 1; + totalPageLabel.setText(Integer.toString(totalPage)); + currentPageLabel.setText("1"); + outputViewPane.setText(text); // set the output view + setComponentsVisibility(true); // shows the components that not needed + outputViewPane.moveCaretPosition(0); + + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + + } catch (InterruptedException | ExecutionException ex) { + logger.log(Level.SEVERE, String.format("Failed to get text from content (id=%d)", content.getId()), ex); + } + } + } + + /** + * SwingWorker for getting the text from a StringContent object. + */ + private final class StringContentWorker extends SwingWorker { + + private final StringContent content; + + StringContentWorker(StringContent content) { + this.content = content; + } + + @Override + protected String doInBackground() throws Exception { + return content.getString(); + } + + @Override + public void done() { + if (isCancelled()) { + return; + } + + try { + String text = get(); + + dataSource = null; + nextPageButton.setEnabled(false); + prevPageButton.setEnabled(false); + currentPage = 1; + + totalPageLabel.setText("1"); + currentPageLabel.setText("1"); + outputViewPane.setText(text); // set the output view + setComponentsVisibility(true); // shows the components that not needed + outputViewPane.moveCaretPosition(0); + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + + } catch (InterruptedException | ExecutionException ex) { + logger.log(Level.SEVERE, String.format("Failed to get text from StringContent"), ex); + } + } + + } + } From c1ca1a09243d4aceaf91f1a6861e5a3c58e9183d Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 18 May 2021 10:45:19 -0400 Subject: [PATCH 2/2] Formatting clean up --- .../Bundle.properties-MERGED | 1 + .../StringsContentPanel.java | 27 ++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/Bundle.properties-MERGED index 19b5e9ef6b..024103570d 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/Bundle.properties-MERGED @@ -1,3 +1,4 @@ +StringContentPanel_Loading_String=Loading text... StringsTextViewer.goToPageTextField.msgDlg=Please enter a valid page number between 1 and {0} StringsTextViewer.goToPageTextField.err=Invalid page number StringsTextViewer.setDataView.errorText=(offset {0}-{1} could not be read) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java index 2bad8c9a87..750f143e0e 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java @@ -31,6 +31,7 @@ import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.SwingWorker; import org.apache.commons.lang3.StringUtils; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.coreutils.StringExtract; import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractResult; import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT; @@ -365,6 +366,10 @@ public class StringsContentPanel extends javax.swing.JPanel { private javax.swing.JLabel totalPageLabel; // End of variables declaration//GEN-END:variables + @Messages({ + "StringContentPanel_Loading_String=Loading text..." + }) + /** * Sets the DataView (The tabbed panel) * @@ -383,7 +388,7 @@ public class StringsContentPanel extends javax.swing.JPanel { } worker = new ContentWorker(dataSource, offset); - + outputViewPane.setText(Bundle.StringContentPanel_Loading_String()); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); worker.execute(); } @@ -399,7 +404,7 @@ public class StringsContentPanel extends javax.swing.JPanel { } worker = new StringContentWorker(dataSource); - + outputViewPane.setText(Bundle.StringContentPanel_Loading_String()); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); worker.execute(); } @@ -423,12 +428,20 @@ public class StringsContentPanel extends javax.swing.JPanel { languageLabel.setVisible(isVisible); } - // Swingworker for getting the text from a content object. + /** + * Swingworker for getting the text from a content object. + */ private final class ContentWorker extends SwingWorker { private final Content content; private final long offset; + /** + * ContentWorker constructor + * + * @param content Content to get text from. + * @param offset The starting offset. + */ ContentWorker(Content content, long offset) { this.content = content; this.offset = offset; @@ -478,7 +491,6 @@ public class StringsContentPanel extends javax.swing.JPanel { return; } String text = get(); - dataSource = content; // disable or enable the next button @@ -517,6 +529,11 @@ public class StringsContentPanel extends javax.swing.JPanel { private final StringContent content; + /** + * Constructor to pulling the text out of a string content object. + * + * @param content + */ StringContentWorker(StringContent content) { this.content = content; } @@ -551,7 +568,5 @@ public class StringsContentPanel extends javax.swing.JPanel { logger.log(Level.SEVERE, String.format("Failed to get text from StringContent"), ex); } } - } - }