From ae6dc361d19af1a401608f5311491a49603e2ca5 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 14 Feb 2018 11:15:11 +0100 Subject: [PATCH] Cancelation WIP --- .../communications/VisualizationPanel.java | 92 +++++++++++-------- .../autopsy/communications/mxGraphImpl.java | 18 ++-- 2 files changed, 67 insertions(+), 43 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index d7148fde20..02d365247e 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -64,14 +64,19 @@ import javax.swing.JProgressBar; import javax.swing.JSplitPane; import javax.swing.JTextArea; import javax.swing.JToolBar; +import javax.swing.ProgressMonitor; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import org.jdesktop.layout.GroupLayout; import org.jdesktop.layout.LayoutStyle; +import org.netbeans.api.progress.BaseProgressUtils; +import org.netbeans.api.progress.ProgressHandle; +import org.netbeans.api.progress.ProgressRunnable; import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerUtils; import org.openide.nodes.Node; +import org.openide.util.Cancellable; import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.lookup.ProxyLookup; @@ -241,35 +246,24 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider @Subscribe void handleUnPinEvent(CVTEvents.UnpinAccountsEvent pinEvent) { graph.getModel().beginUpdate(); - try { - graph.unpinAccount(pinEvent.getAccountDeviceInstances()); - graph.clear(); - rebuildGraph(); - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error pinning accounts", ex); - } finally { - // Updates the display - graph.getModel().endUpdate(); - } + graph.unpinAccount(pinEvent.getAccountDeviceInstances()); + graph.clear(); + rebuildGraph(); + // Updates the display + graph.getModel().endUpdate(); } @Subscribe void handlePinEvent(CVTEvents.PinAccountsEvent pinEvent) { graph.getModel().beginUpdate(); - try { - if (pinEvent.isReplace()) { - graph.resetGraph(); - } - - graph.pinAccount(pinEvent.getAccountDeviceInstances()); - rebuildGraph(); - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error pinning accounts", ex); - } finally { - // Updates the display - graph.getModel().endUpdate(); + if (pinEvent.isReplace()) { + graph.resetGraph(); } + graph.pinAccount(pinEvent.getAccountDeviceInstances()); + rebuildGraph(); + // Updates the display + graph.getModel().endUpdate(); } @@ -277,20 +271,15 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider void handleFilterEvent(CVTEvents.FilterChangeEvent filterChangeEvent) { graph.getModel().beginUpdate(); - try { - graph.clear(); - currentFilter = filterChangeEvent.getNewFilter(); - rebuildGraph(); - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error filtering accounts", ex); - } finally { - // Updates the display - graph.getModel().endUpdate(); - } + graph.clear(); + currentFilter = filterChangeEvent.getNewFilter(); + rebuildGraph(); + // Updates the display + graph.getModel().endUpdate(); } - private void rebuildGraph() throws TskCoreException { + private void rebuildGraph() { if (graph.isEmpty()) { borderLayoutPanel.remove(graphComponent); borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER); @@ -300,8 +289,8 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider if (worker != null) { worker.cancel(true); } - worker = graph.rebuild(new ProgressIndicatorImpl(), commsManager, currentFilter); - + ; + BaseProgressUtils.showProgressDialogAndRun(new ProgressRunnableImpl(), "Loading Visualization", true); worker.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { @@ -312,6 +301,10 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider statusLabel.setText("Too many cells, layout aborted."); } } + if (worker.isCancelled()) { + graph.resetGraph(); + rebuildGraph(); + } } }); @@ -685,7 +678,8 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider progressPanel.setVisible(true); progressBar.setIndeterminate(true); progressBar.setString("Computing layout"); - + final ProgressMonitor progressMonitor = new ProgressMonitor(this, "Computing layout", "", 0, 100); + progressMonitor.setProgress(0); new SwingWorker() { @Override protected Void doInBackground() throws Exception { @@ -696,8 +690,10 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider fitGraph(); progressPanel.setVisible(false); progressBar.setValue(0); + progressMonitor.close(); }); - + + progressMonitor.setProgress(50); SwingUtilities.invokeLater(() -> progressBar.setString("Applying layout")); morph.startAnimation(); return null; @@ -763,6 +759,8 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider final private class ProgressIndicatorImpl implements ProgressIndicator { + ProgressMonitor progressMonitor = new ProgressMonitor(VisualizationPanel.this, "title", "detail", 0, 100); + @Override public void start(String message, int totalWorkUnits) { SwingUtilities.invokeLater(() -> { @@ -771,6 +769,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider progressBar.setString(message); progressBar.setMaximum(totalWorkUnits); progressBar.setValue(0); + }); } @@ -780,6 +779,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider progressPanel.setVisible(true); progressBar.setString(message); progressBar.setIndeterminate(true); + }); } @@ -815,6 +815,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider SwingUtilities.invokeLater(() -> { progressBar.setValue(workUnitsCompleted); }); + progressMonitor.setProgress(workUnitsCompleted); } @Override @@ -823,6 +824,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider progressBar.setString(message); progressBar.setValue(workUnitsCompleted); }); + progressMonitor.setProgress(workUnitsCompleted); } @Override @@ -831,6 +833,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider progressBar.setValue(progressBar.getMaximum()); progressPanel.setVisible(false); }); + progressMonitor.close(); } } @@ -923,4 +926,19 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider } } } + + private class ProgressRunnableImpl implements ProgressRunnable, Cancellable { + + @Override + public Void run(ProgressHandle ph) { + worker = graph.rebuild(ph, commsManager, currentFilter); + + return null; + } + + @Override + public boolean cancel() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java b/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java index 46bec948c9..6263c8c175 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java +++ b/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java @@ -44,8 +44,8 @@ import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import javax.swing.SwingWorker; +import org.netbeans.api.progress.ProgressHandle; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.progress.ProgressIndicator; import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsFilter; import org.sleuthkit.datamodel.CommunicationsManager; @@ -219,7 +219,7 @@ final class mxGraphImpl extends mxGraph { getView().updateBoundingBox(state); } - SwingWorker rebuild(ProgressIndicator progress, CommunicationsManager commsManager, CommunicationsFilter currentFilter) { + SwingWorker rebuild(ProgressHandle progress, CommunicationsManager commsManager, CommunicationsFilter currentFilter) { return new RebuildWorker(progress, commsManager, currentFilter); } @@ -296,19 +296,22 @@ final class mxGraphImpl extends mxGraph { */ private class RebuildWorker extends SwingWorker { - private final ProgressIndicator progress; + private final ProgressHandle progress; private final CommunicationsManager commsManager; private final CommunicationsFilter currentFilter; - RebuildWorker(ProgressIndicator progress, CommunicationsManager commsManager, CommunicationsFilter currentFilter) { + RebuildWorker(ProgressHandle progress, CommunicationsManager commsManager, CommunicationsFilter currentFilter) { this.progress = progress; this.currentFilter = currentFilter; this.commsManager = commsManager; + } @Override protected Void doInBackground() throws Exception { - progress.start("Loading accounts", pinnedAccountDevices.size()); + progress.progress("Loading accounts"); + progress.switchToDeterminate(pinnedAccountDevices.size()); + progress.progress(0); int i = 0; try { /** @@ -317,6 +320,7 @@ final class mxGraphImpl extends mxGraph { Set relatedAccounts = new HashSet<>(); for (AccountDeviceInstanceKey adiKey : pinnedAccountDevices) { if (isCancelled()) { + cancel(true); break; } List relatedAccountDeviceInstances = @@ -335,11 +339,12 @@ final class mxGraphImpl extends mxGraph { //for each pair of related accounts add edges if they are related o each other. // this is O(n^2) in the number of related accounts!!! List relatedAccountsList = new ArrayList<>(relatedAccounts); - progress.switchToDeterminate("", 0, relatedAccountsList.size()); + progress.switchToDeterminate(relatedAccountsList.size()); for (i = 0; i < relatedAccountsList.size(); i++) { AccountDeviceInstanceKey adiKey1 = relatedAccountsList.get(i); for (int j = i; j < relatedAccountsList.size(); j++) { if (isCancelled()) { + cancel(true); break; } AccountDeviceInstanceKey adiKey2 = relatedAccountsList.get(j); @@ -369,6 +374,7 @@ final class mxGraphImpl extends mxGraph { } catch (InterruptedException | ExecutionException ex) { logger.log(Level.SEVERE, "Error building graph visualization. ", ex); } catch (CancellationException ex) { + logger.log(Level.INFO, "Graph visualization cancelled"); } finally { progress.finish();