mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-18 10:37:43 +00:00
Cancelation WIP
This commit is contained in:
parent
b53a2190b7
commit
ae6dc361d1
@ -64,14 +64,19 @@ import javax.swing.JProgressBar;
|
|||||||
import javax.swing.JSplitPane;
|
import javax.swing.JSplitPane;
|
||||||
import javax.swing.JTextArea;
|
import javax.swing.JTextArea;
|
||||||
import javax.swing.JToolBar;
|
import javax.swing.JToolBar;
|
||||||
|
import javax.swing.ProgressMonitor;
|
||||||
import javax.swing.SwingConstants;
|
import javax.swing.SwingConstants;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.SwingWorker;
|
import javax.swing.SwingWorker;
|
||||||
import org.jdesktop.layout.GroupLayout;
|
import org.jdesktop.layout.GroupLayout;
|
||||||
import org.jdesktop.layout.LayoutStyle;
|
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.ExplorerManager;
|
||||||
import org.openide.explorer.ExplorerUtils;
|
import org.openide.explorer.ExplorerUtils;
|
||||||
import org.openide.nodes.Node;
|
import org.openide.nodes.Node;
|
||||||
|
import org.openide.util.Cancellable;
|
||||||
import org.openide.util.Lookup;
|
import org.openide.util.Lookup;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.util.lookup.ProxyLookup;
|
import org.openide.util.lookup.ProxyLookup;
|
||||||
@ -241,35 +246,24 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
|
|||||||
@Subscribe
|
@Subscribe
|
||||||
void handleUnPinEvent(CVTEvents.UnpinAccountsEvent pinEvent) {
|
void handleUnPinEvent(CVTEvents.UnpinAccountsEvent pinEvent) {
|
||||||
graph.getModel().beginUpdate();
|
graph.getModel().beginUpdate();
|
||||||
try {
|
graph.unpinAccount(pinEvent.getAccountDeviceInstances());
|
||||||
graph.unpinAccount(pinEvent.getAccountDeviceInstances());
|
graph.clear();
|
||||||
graph.clear();
|
rebuildGraph();
|
||||||
rebuildGraph();
|
// Updates the display
|
||||||
} catch (TskCoreException ex) {
|
graph.getModel().endUpdate();
|
||||||
logger.log(Level.SEVERE, "Error pinning accounts", ex);
|
|
||||||
} finally {
|
|
||||||
// Updates the display
|
|
||||||
graph.getModel().endUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
void handlePinEvent(CVTEvents.PinAccountsEvent pinEvent) {
|
void handlePinEvent(CVTEvents.PinAccountsEvent pinEvent) {
|
||||||
graph.getModel().beginUpdate();
|
graph.getModel().beginUpdate();
|
||||||
try {
|
if (pinEvent.isReplace()) {
|
||||||
if (pinEvent.isReplace()) {
|
graph.resetGraph();
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
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) {
|
void handleFilterEvent(CVTEvents.FilterChangeEvent filterChangeEvent) {
|
||||||
|
|
||||||
graph.getModel().beginUpdate();
|
graph.getModel().beginUpdate();
|
||||||
try {
|
graph.clear();
|
||||||
graph.clear();
|
currentFilter = filterChangeEvent.getNewFilter();
|
||||||
currentFilter = filterChangeEvent.getNewFilter();
|
rebuildGraph();
|
||||||
rebuildGraph();
|
// Updates the display
|
||||||
} catch (TskCoreException ex) {
|
graph.getModel().endUpdate();
|
||||||
logger.log(Level.SEVERE, "Error filtering accounts", ex);
|
|
||||||
} finally {
|
|
||||||
// Updates the display
|
|
||||||
graph.getModel().endUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rebuildGraph() throws TskCoreException {
|
private void rebuildGraph() {
|
||||||
if (graph.isEmpty()) {
|
if (graph.isEmpty()) {
|
||||||
borderLayoutPanel.remove(graphComponent);
|
borderLayoutPanel.remove(graphComponent);
|
||||||
borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER);
|
borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER);
|
||||||
@ -300,8 +289,8 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
|
|||||||
if (worker != null) {
|
if (worker != null) {
|
||||||
worker.cancel(true);
|
worker.cancel(true);
|
||||||
}
|
}
|
||||||
worker = graph.rebuild(new ProgressIndicatorImpl(), commsManager, currentFilter);
|
;
|
||||||
|
BaseProgressUtils.showProgressDialogAndRun(new ProgressRunnableImpl(), "Loading Visualization", true);
|
||||||
worker.addPropertyChangeListener(new PropertyChangeListener() {
|
worker.addPropertyChangeListener(new PropertyChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void propertyChange(final PropertyChangeEvent evt) {
|
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.");
|
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);
|
progressPanel.setVisible(true);
|
||||||
progressBar.setIndeterminate(true);
|
progressBar.setIndeterminate(true);
|
||||||
progressBar.setString("Computing layout");
|
progressBar.setString("Computing layout");
|
||||||
|
final ProgressMonitor progressMonitor = new ProgressMonitor(this, "Computing layout", "", 0, 100);
|
||||||
|
progressMonitor.setProgress(0);
|
||||||
new SwingWorker<Void, Void>() {
|
new SwingWorker<Void, Void>() {
|
||||||
@Override
|
@Override
|
||||||
protected Void doInBackground() throws Exception {
|
protected Void doInBackground() throws Exception {
|
||||||
@ -696,8 +690,10 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
|
|||||||
fitGraph();
|
fitGraph();
|
||||||
progressPanel.setVisible(false);
|
progressPanel.setVisible(false);
|
||||||
progressBar.setValue(0);
|
progressBar.setValue(0);
|
||||||
|
progressMonitor.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
progressMonitor.setProgress(50);
|
||||||
SwingUtilities.invokeLater(() -> progressBar.setString("Applying layout"));
|
SwingUtilities.invokeLater(() -> progressBar.setString("Applying layout"));
|
||||||
morph.startAnimation();
|
morph.startAnimation();
|
||||||
return null;
|
return null;
|
||||||
@ -763,6 +759,8 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
|
|||||||
|
|
||||||
final private class ProgressIndicatorImpl implements ProgressIndicator {
|
final private class ProgressIndicatorImpl implements ProgressIndicator {
|
||||||
|
|
||||||
|
ProgressMonitor progressMonitor = new ProgressMonitor(VisualizationPanel.this, "title", "detail", 0, 100);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(String message, int totalWorkUnits) {
|
public void start(String message, int totalWorkUnits) {
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
@ -771,6 +769,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
|
|||||||
progressBar.setString(message);
|
progressBar.setString(message);
|
||||||
progressBar.setMaximum(totalWorkUnits);
|
progressBar.setMaximum(totalWorkUnits);
|
||||||
progressBar.setValue(0);
|
progressBar.setValue(0);
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -780,6 +779,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
|
|||||||
progressPanel.setVisible(true);
|
progressPanel.setVisible(true);
|
||||||
progressBar.setString(message);
|
progressBar.setString(message);
|
||||||
progressBar.setIndeterminate(true);
|
progressBar.setIndeterminate(true);
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -815,6 +815,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
|
|||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
progressBar.setValue(workUnitsCompleted);
|
progressBar.setValue(workUnitsCompleted);
|
||||||
});
|
});
|
||||||
|
progressMonitor.setProgress(workUnitsCompleted);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -823,6 +824,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
|
|||||||
progressBar.setString(message);
|
progressBar.setString(message);
|
||||||
progressBar.setValue(workUnitsCompleted);
|
progressBar.setValue(workUnitsCompleted);
|
||||||
});
|
});
|
||||||
|
progressMonitor.setProgress(workUnitsCompleted);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -831,6 +833,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
|
|||||||
progressBar.setValue(progressBar.getMaximum());
|
progressBar.setValue(progressBar.getMaximum());
|
||||||
progressPanel.setVisible(false);
|
progressPanel.setVisible(false);
|
||||||
});
|
});
|
||||||
|
progressMonitor.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -923,4 +926,19 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class ProgressRunnableImpl implements ProgressRunnable<Void>, 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.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,8 +44,8 @@ import java.util.concurrent.CancellationException;
|
|||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.SwingWorker;
|
import javax.swing.SwingWorker;
|
||||||
|
import org.netbeans.api.progress.ProgressHandle;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.progress.ProgressIndicator;
|
|
||||||
import org.sleuthkit.datamodel.AccountDeviceInstance;
|
import org.sleuthkit.datamodel.AccountDeviceInstance;
|
||||||
import org.sleuthkit.datamodel.CommunicationsFilter;
|
import org.sleuthkit.datamodel.CommunicationsFilter;
|
||||||
import org.sleuthkit.datamodel.CommunicationsManager;
|
import org.sleuthkit.datamodel.CommunicationsManager;
|
||||||
@ -219,7 +219,7 @@ final class mxGraphImpl extends mxGraph {
|
|||||||
getView().updateBoundingBox(state);
|
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);
|
return new RebuildWorker(progress, commsManager, currentFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -296,19 +296,22 @@ final class mxGraphImpl extends mxGraph {
|
|||||||
*/
|
*/
|
||||||
private class RebuildWorker extends SwingWorker<Void, Void> {
|
private class RebuildWorker extends SwingWorker<Void, Void> {
|
||||||
|
|
||||||
private final ProgressIndicator progress;
|
private final ProgressHandle progress;
|
||||||
private final CommunicationsManager commsManager;
|
private final CommunicationsManager commsManager;
|
||||||
private final CommunicationsFilter currentFilter;
|
private final CommunicationsFilter currentFilter;
|
||||||
|
|
||||||
RebuildWorker(ProgressIndicator progress, CommunicationsManager commsManager, CommunicationsFilter currentFilter) {
|
RebuildWorker(ProgressHandle progress, CommunicationsManager commsManager, CommunicationsFilter currentFilter) {
|
||||||
this.progress = progress;
|
this.progress = progress;
|
||||||
this.currentFilter = currentFilter;
|
this.currentFilter = currentFilter;
|
||||||
this.commsManager = commsManager;
|
this.commsManager = commsManager;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Void doInBackground() throws Exception {
|
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;
|
int i = 0;
|
||||||
try {
|
try {
|
||||||
/**
|
/**
|
||||||
@ -317,6 +320,7 @@ final class mxGraphImpl extends mxGraph {
|
|||||||
Set<AccountDeviceInstanceKey> relatedAccounts = new HashSet<>();
|
Set<AccountDeviceInstanceKey> relatedAccounts = new HashSet<>();
|
||||||
for (AccountDeviceInstanceKey adiKey : pinnedAccountDevices) {
|
for (AccountDeviceInstanceKey adiKey : pinnedAccountDevices) {
|
||||||
if (isCancelled()) {
|
if (isCancelled()) {
|
||||||
|
cancel(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
List<AccountDeviceInstance> relatedAccountDeviceInstances =
|
List<AccountDeviceInstance> 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.
|
//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!!!
|
// this is O(n^2) in the number of related accounts!!!
|
||||||
List<AccountDeviceInstanceKey> relatedAccountsList = new ArrayList<>(relatedAccounts);
|
List<AccountDeviceInstanceKey> relatedAccountsList = new ArrayList<>(relatedAccounts);
|
||||||
progress.switchToDeterminate("", 0, relatedAccountsList.size());
|
progress.switchToDeterminate(relatedAccountsList.size());
|
||||||
for (i = 0; i < relatedAccountsList.size(); i++) {
|
for (i = 0; i < relatedAccountsList.size(); i++) {
|
||||||
AccountDeviceInstanceKey adiKey1 = relatedAccountsList.get(i);
|
AccountDeviceInstanceKey adiKey1 = relatedAccountsList.get(i);
|
||||||
for (int j = i; j < relatedAccountsList.size(); j++) {
|
for (int j = i; j < relatedAccountsList.size(); j++) {
|
||||||
if (isCancelled()) {
|
if (isCancelled()) {
|
||||||
|
cancel(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
AccountDeviceInstanceKey adiKey2 = relatedAccountsList.get(j);
|
AccountDeviceInstanceKey adiKey2 = relatedAccountsList.get(j);
|
||||||
@ -369,6 +374,7 @@ final class mxGraphImpl extends mxGraph {
|
|||||||
} catch (InterruptedException | ExecutionException ex) {
|
} catch (InterruptedException | ExecutionException ex) {
|
||||||
logger.log(Level.SEVERE, "Error building graph visualization. ", ex);
|
logger.log(Level.SEVERE, "Error building graph visualization. ", ex);
|
||||||
} catch (CancellationException ex) {
|
} catch (CancellationException ex) {
|
||||||
|
|
||||||
logger.log(Level.INFO, "Graph visualization cancelled");
|
logger.log(Level.INFO, "Graph visualization cancelled");
|
||||||
} finally {
|
} finally {
|
||||||
progress.finish();
|
progress.finish();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user