3610 add context menu options for priority changing to AID2.0

This commit is contained in:
William Schaefer 2018-04-10 17:09:11 -04:00
parent 14d271bb28
commit 34ee030bd8
5 changed files with 252 additions and 114 deletions

View File

@ -37,8 +37,6 @@ import org.openide.util.NbBundle;
import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.core.ServicesMonitor;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMonitor.JobsSnapshot;
/**
* A dashboard for monitoring an automated ingest cluster.
@ -90,7 +88,7 @@ final class AutoIngestDashboard extends JPanel implements Observer {
statusByService.put(ServicesMonitor.Service.REMOTE_KEYWORD_SEARCH.toString(), NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down"));
statusByService.put(ServicesMonitor.Service.MESSAGING.toString(), NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down"));
setServicesStatusMessage();
pendingJobsPanel = new AutoIngestJobsPanel(AutoIngestJobsNode.AutoIngestJobType.PENDING_JOB);
pendingJobsPanel = new AutoIngestJobsPanel(AutoIngestJobsNode.AutoIngestJobStatus.PENDING_JOB);
pendingJobsPanel.setSize(pendingScrollPane.getSize());
pendingScrollPane.add(pendingJobsPanel);
pendingScrollPane.setViewportView(pendingJobsPanel);
@ -111,8 +109,8 @@ final class AutoIngestDashboard extends JPanel implements Observer {
this.deprioritizeJobButton.setEnabled(enableDeprioritizeButtons);
this.deprioritizeCaseButton.setEnabled(enableDeprioritizeButtons);
});
pendingJobsPanel.setToolTipText(Bundle.AutoIngestDashboard_pendingTable.toolTipText());
runningJobsPanel = new AutoIngestJobsPanel(AutoIngestJobsNode.AutoIngestJobType.RUNNING_JOB);
pendingJobsPanel.setToolTipText(Bundle.AutoIngestDashboard_pendingTable_toolTipText());
runningJobsPanel = new AutoIngestJobsPanel(AutoIngestJobsNode.AutoIngestJobStatus.RUNNING_JOB);
runningJobsPanel.setSize(runningScrollPane.getSize());
runningScrollPane.add(runningJobsPanel);
runningScrollPane.setViewportView(runningJobsPanel);
@ -123,8 +121,8 @@ final class AutoIngestDashboard extends JPanel implements Observer {
this.deprioritizeJobButton.setEnabled(enabled);
this.deprioritizeCaseButton.setEnabled(enabled);
});
runningJobsPanel.setToolTipText(Bundle.AutoIngestDashboard_runningTable.toolTipText());
completedJobsPanel = new AutoIngestJobsPanel(AutoIngestJobsNode.AutoIngestJobType.COMPLETED_JOB);
runningJobsPanel.setToolTipText(Bundle.AutoIngestDashboard_runningTable_toolTipText());
completedJobsPanel = new AutoIngestJobsPanel(AutoIngestJobsNode.AutoIngestJobStatus.COMPLETED_JOB);
completedJobsPanel.setSize(completedScrollPane.getSize());
completedScrollPane.add(completedJobsPanel);
completedScrollPane.setViewportView(completedJobsPanel);
@ -135,7 +133,7 @@ final class AutoIngestDashboard extends JPanel implements Observer {
this.deprioritizeJobButton.setEnabled(enabled);
this.deprioritizeCaseButton.setEnabled(enabled);
});
completedJobsPanel.setToolTipText(Bundle.AutoIngestDashboard_completedTable.toolTipText());
completedJobsPanel.setToolTipText(Bundle.AutoIngestDashboard_completedTable_toolTipText());
/*
* Must set this flag, otherwise pop up menus don't close properly.
*/
@ -143,6 +141,14 @@ final class AutoIngestDashboard extends JPanel implements Observer {
UIManager.put("PopupMenu.consumeEventOnClose", false);
}
AutoIngestMonitor getMonitor() {
return autoIngestMonitor;
}
AutoIngestJobsPanel getPendingJobsPanel() {
return pendingJobsPanel;
}
/**
* Update status of the services on the dashboard
*/
@ -253,7 +259,9 @@ final class AutoIngestDashboard extends JPanel implements Observer {
@Override
public void update(Observable observable, Object arg) {
EventQueue.invokeLater(new RefreshComponentsTask((JobsSnapshot) arg));
EventQueue.invokeLater(() -> {
refreshTables();
});
}
/**
@ -262,10 +270,10 @@ final class AutoIngestDashboard extends JPanel implements Observer {
*
* @param jobsSnapshot The jobs snapshot.
*/
private void refreshTables(JobsSnapshot jobsSnapshot) {
pendingJobsPanel.refresh(jobsSnapshot);
runningJobsPanel.refresh(jobsSnapshot);
completedJobsPanel.refresh(jobsSnapshot);
private void refreshTables() {
pendingJobsPanel.refresh(autoIngestMonitor);
runningJobsPanel.refresh(autoIngestMonitor);
completedJobsPanel.refresh(autoIngestMonitor);
}
/**
@ -473,46 +481,13 @@ final class AutoIngestDashboard extends JPanel implements Observer {
*/
private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
JobsSnapshot jobsSnapshot = autoIngestMonitor.refreshJobsSnapshot();
refreshTables(jobsSnapshot);
refreshTables();
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_refreshButtonActionPerformed
@Messages({"AutoIngestDashboard.errorMessage.jobPrioritization=Failed to prioritize job \"%s\"."})
private void prioritizeJobButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prioritizeJobButtonActionPerformed
AutoIngestJob job = pendingJobsPanel.getSelectedAutoIngestJob();
if (job != null) {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
JobsSnapshot jobsSnapshot;
try {
jobsSnapshot = autoIngestMonitor.prioritizeJob(job);
refreshTables(jobsSnapshot);
} catch (AutoIngestMonitor.AutoIngestMonitorException ex) {
String errorMessage = String.format(Bundle.AutoIngestDashboard_errorMessage_jobPrioritization(), job.getManifest().getFilePath());
LOGGER.log(Level.SEVERE, errorMessage, ex);
MessageNotifyUtil.Message.error(errorMessage);
}
setCursor(Cursor.getDefaultCursor());
}
}//GEN-LAST:event_prioritizeJobButtonActionPerformed
@Messages({"AutoIngestDashboard.errorMessage.casePrioritization=Failed to prioritize case \"%s\"."})
private void prioritizeCaseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prioritizeCaseButtonActionPerformed
AutoIngestJob job = pendingJobsPanel.getSelectedAutoIngestJob();
if (job != null) {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
String caseName = job.getManifest().getCaseName();
JobsSnapshot jobsSnapshot;
try {
jobsSnapshot = autoIngestMonitor.prioritizeCase(caseName);
refreshTables(jobsSnapshot);
} catch (AutoIngestMonitor.AutoIngestMonitorException ex) {
String errorMessage = String.format(Bundle.AutoIngestDashboard_errorMessage_casePrioritization(), caseName);
LOGGER.log(Level.SEVERE, errorMessage, ex);
MessageNotifyUtil.Message.error(errorMessage);
}
setCursor(Cursor.getDefaultCursor());
}
new PrioritizationAction.PrioritizeCaseAction(pendingJobsPanel.getSelectedAutoIngestJob()).actionPerformed(evt);
}//GEN-LAST:event_prioritizeCaseButtonActionPerformed
private void clusterMetricsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clusterMetricsButtonActionPerformed
@ -521,41 +496,19 @@ final class AutoIngestDashboard extends JPanel implements Observer {
@Messages({"AutoIngestDashboard.errorMessage.jobDeprioritization=Failed to deprioritize job \"%s\"."})
private void deprioritizeJobButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deprioritizeJobButtonActionPerformed
AutoIngestJob job = pendingJobsPanel.getSelectedAutoIngestJob();
if (job != null) {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
JobsSnapshot jobsSnapshot;
try {
jobsSnapshot = autoIngestMonitor.deprioritizeJob(job);
refreshTables(jobsSnapshot);
} catch (AutoIngestMonitor.AutoIngestMonitorException ex) {
String errorMessage = String.format(Bundle.AutoIngestDashboard_errorMessage_jobDeprioritization(), job.getManifest().getFilePath());
LOGGER.log(Level.SEVERE, errorMessage, ex);
MessageNotifyUtil.Message.error(errorMessage);
}
setCursor(Cursor.getDefaultCursor());
}
new PrioritizationAction.DeprioritizeJobAction(pendingJobsPanel.getSelectedAutoIngestJob()).actionPerformed(evt);
}//GEN-LAST:event_deprioritizeJobButtonActionPerformed
@Messages({"AutoIngestDashboard.errorMessage.caseDeprioritization=Failed to deprioritize case \"%s\"."})
private void deprioritizeCaseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deprioritizeCaseButtonActionPerformed
AutoIngestJob job = pendingJobsPanel.getSelectedAutoIngestJob();
if (job != null) {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
String caseName = job.getManifest().getCaseName();
JobsSnapshot jobsSnapshot;
try {
jobsSnapshot = autoIngestMonitor.deprioritizeCase(caseName);
refreshTables(jobsSnapshot);
} catch (AutoIngestMonitor.AutoIngestMonitorException ex) {
String errorMessage = String.format(Bundle.AutoIngestDashboard_errorMessage_caseDeprioritization(), caseName);
LOGGER.log(Level.SEVERE, errorMessage, ex);
MessageNotifyUtil.Message.error(errorMessage);
}
setCursor(Cursor.getDefaultCursor());
}
new PrioritizationAction.DeprioritizeCaseAction(pendingJobsPanel.getSelectedAutoIngestJob()).actionPerformed(evt);
}//GEN-LAST:event_deprioritizeCaseButtonActionPerformed
@Messages({"AutoIngestDashboard.errorMessage.jobPrioritization=Failed to prioritize job \"%s\"."})
private void prioritizeJobButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prioritizeJobButtonActionPerformed
new PrioritizationAction.PrioritizeJobAction(pendingJobsPanel.getSelectedAutoIngestJob()).actionPerformed(evt);
}//GEN-LAST:event_prioritizeJobButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton clusterMetricsButton;
private javax.swing.JScrollPane completedScrollPane;
@ -573,29 +526,4 @@ final class AutoIngestDashboard extends JPanel implements Observer {
private javax.swing.JScrollPane runningScrollPane;
private javax.swing.JTextField tbServicesStatusMessage;
// End of variables declaration//GEN-END:variables
/**
* A task that refreshes the UI components on this panel to reflect a
* snapshot of the pending, running and completed auto ingest jobs lists of
* an auto ingest cluster.
*/
private class RefreshComponentsTask implements Runnable {
private final JobsSnapshot jobsSnapshot;
/**
* Constructs a task that refreshes the UI components on this panel to
* reflect a snapshot of the pending, running and completed auto ingest
* jobs lists of an auto ingest cluster.
*
* @param jobsSnapshot The jobs snapshot.
*/
RefreshComponentsTask(JobsSnapshot jobsSnapshot) {
this.jobsSnapshot = jobsSnapshot;
}
@Override
public void run() {
refreshTables(jobsSnapshot);
}
}
}

View File

@ -18,6 +18,7 @@
*/
package org.sleuthkit.autopsy.experimental.autoingest;
import java.awt.Component;
import java.util.List;
import java.util.logging.Level;
import java.util.stream.Collectors;
@ -74,7 +75,7 @@ public final class AutoIngestDashboardTopComponent extends TopComponent {
AutoIngestDashboard dashboard = AutoIngestDashboard.createDashboard();
tc.add(dashboard);
dashboard.setSize(dashboard.getPreferredSize());
tc.open();
}
tc.toFront();
@ -104,6 +105,24 @@ public final class AutoIngestDashboardTopComponent extends TopComponent {
setName(Bundle.CTL_AutoIngestDashboardTopComponent());
}
AutoIngestMonitor getAutoIngestMonitor() {
for (Component comp : getComponents()) {
if (comp instanceof AutoIngestDashboard) {
return ((AutoIngestDashboard) comp).getMonitor();
}
}
return null;
}
AutoIngestJobsPanel getPendingJobsPanel() {
for (Component comp : getComponents()) {
if (comp instanceof AutoIngestDashboard) {
return ((AutoIngestDashboard) comp).getPendingJobsPanel();
}
}
return null;
}
@Override
public List<Mode> availableModes(List<Mode> modes) {
/*

View File

@ -18,6 +18,11 @@
*/
package org.sleuthkit.autopsy.experimental.autoingest;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
@ -28,8 +33,9 @@ import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.Sheet;
import org.openide.util.NbBundle.Messages;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
import org.sleuthkit.autopsy.datamodel.NodeProperty;
import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMonitor.JobsSnapshot;
import org.sleuthkit.autopsy.guiutils.DurationCellRenderer;
import org.sleuthkit.autopsy.guiutils.StatusIconCellRenderer;
@ -54,8 +60,8 @@ final class AutoIngestJobsNode extends AbstractNode {
/**
* Construct a new AutoIngestJobsNode.
*/
AutoIngestJobsNode(JobsSnapshot snapshot, AutoIngestJobStatus status) {
super(Children.create(new AutoIngestNodeChildren(snapshot, status), false));
AutoIngestJobsNode(AutoIngestMonitor autoIngestMonitor, AutoIngestJobStatus status) {
super(Children.create(new AutoIngestNodeChildren(autoIngestMonitor, status), false));
}
/**
@ -64,7 +70,7 @@ final class AutoIngestJobsNode extends AbstractNode {
static class AutoIngestNodeChildren extends ChildFactory<AutoIngestJob> {
private final AutoIngestJobStatus autoIngestJobStatus;
private final JobsSnapshot jobsSnapshot;
private final AutoIngestMonitor autoIngestMonitor;
/**
* Create children nodes for the AutoIngestJobsNode which will each
@ -73,8 +79,8 @@ final class AutoIngestJobsNode extends AbstractNode {
* @param snapshot the snapshot which contains the AutoIngestJobs
* @param status the status of the jobs being displayed
*/
AutoIngestNodeChildren(JobsSnapshot snapshot, AutoIngestJobStatus status) {
jobsSnapshot = snapshot;
AutoIngestNodeChildren(AutoIngestMonitor monitor, AutoIngestJobStatus status) {
autoIngestMonitor = monitor;
autoIngestJobStatus = status;
}
@ -83,13 +89,13 @@ final class AutoIngestJobsNode extends AbstractNode {
List<AutoIngestJob> jobs;
switch (autoIngestJobStatus) {
case PENDING_JOB:
jobs = jobsSnapshot.getPendingJobs();
jobs = autoIngestMonitor.refreshJobsSnapshot().getPendingJobs();
break;
case RUNNING_JOB:
jobs = jobsSnapshot.getRunningJobs();
jobs = autoIngestMonitor.refreshJobsSnapshot().getRunningJobs();
break;
case COMPLETED_JOB:
jobs = jobsSnapshot.getCompletedJobs();
jobs = autoIngestMonitor.refreshJobsSnapshot().getCompletedJobs();
break;
default:
jobs = new ArrayList<>();
@ -180,6 +186,29 @@ final class AutoIngestJobsNode extends AbstractNode {
}
return s;
}
@Override
public Action[] getActions(boolean context) {
List<Action> actions = new ArrayList<>();
switch (jobStatus) {
case PENDING_JOB:
actions.add(new PrioritizationAction.PrioritizeJobAction(autoIngestJob));
actions.add(new PrioritizationAction.PrioritizeCaseAction(autoIngestJob));
PrioritizationAction.DeprioritizeJobAction deprioritizeJobAction = new PrioritizationAction.DeprioritizeJobAction(autoIngestJob);
deprioritizeJobAction.setEnabled(autoIngestJob.getPriority() > 0);
actions.add(deprioritizeJobAction);
PrioritizationAction.DeprioritizeCaseAction deprioritizeCaseAction = new PrioritizationAction.DeprioritizeCaseAction(autoIngestJob);
deprioritizeCaseAction.setEnabled(autoIngestJob.getPriority() > 0);
actions.add(deprioritizeCaseAction);
break;
case RUNNING_JOB:
break;
case COMPLETED_JOB:
break;
default:
}
return actions.toArray(new Action[actions.size()]);
}
}
/**

View File

@ -129,11 +129,11 @@ final class AutoIngestJobsPanel extends javax.swing.JPanel implements ExplorerMa
* @param jobsSnapshot - the JobsSnapshot which will provide the new
* contents
*/
void refresh(AutoIngestMonitor.JobsSnapshot jobsSnapshot) {
void refresh(AutoIngestMonitor autoIngestMonitor) {
synchronized (this) {
outline.setRowSelectionAllowed(false);
Node[] selectedNodes = explorerManager.getSelectedNodes();
AutoIngestJobsNode autoIngestNode = new AutoIngestJobsNode(jobsSnapshot, status);
AutoIngestJobsNode autoIngestNode = new AutoIngestJobsNode(autoIngestMonitor, status);
explorerManager.setRootContext(autoIngestNode);
outline.setRowSelectionAllowed(true);
if (selectedNodes.length > 0) {

View File

@ -0,0 +1,162 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.sleuthkit.autopsy.experimental.autoingest;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
abstract class PrioritizationAction extends AbstractAction {
private static final long serialVersionUID = 1L;
private final AutoIngestJob job;
PrioritizationAction(AutoIngestJob selectedJob, String title) {
super(title);
job = selectedJob;
}
protected abstract void modifyPriority(AutoIngestMonitor monitor, AutoIngestJobsPanel panel) throws AutoIngestMonitor.AutoIngestMonitorException;
protected abstract String getErrorMessage();
protected AutoIngestJob getJob() {
return job;
}
@Override
public void actionPerformed(ActionEvent e) {
if (job != null) {
final AutoIngestDashboardTopComponent tc = (AutoIngestDashboardTopComponent) WindowManager.getDefault().findTopComponent(AutoIngestDashboardTopComponent.PREFERRED_ID);
if (tc != null) {
tc.getPendingJobsPanel().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
EventQueue.invokeLater(() -> {
try {
AutoIngestMonitor monitor = tc.getAutoIngestMonitor();
AutoIngestJobsPanel pendingPanel = tc.getPendingJobsPanel();
if (monitor != null && pendingPanel != null) {
modifyPriority(monitor, pendingPanel);
}
} catch (AutoIngestMonitor.AutoIngestMonitorException ex) {
String errorMessage = getErrorMessage();
// LOGGER.log(Level.SEVERE, errorMessage, ex);
MessageNotifyUtil.Message.error(errorMessage);
} finally {
tc.getPendingJobsPanel().setCursor(Cursor.getDefaultCursor());
}
});
}
}
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone(); //To change body of generated methods, choose Tools | Templates.
}
static final class PrioritizeJobAction extends PrioritizationAction {
private static final long serialVersionUID = 1L;
PrioritizeJobAction(AutoIngestJob selectedJob) {
super(selectedJob, "Prioritize Job");
}
@Override
protected void modifyPriority(AutoIngestMonitor monitor, AutoIngestJobsPanel panel) throws AutoIngestMonitor.AutoIngestMonitorException {
monitor.prioritizeJob(getJob());
panel.refresh(monitor);
}
@Override
protected String getErrorMessage() {
return String.format(Bundle.AutoIngestDashboard_errorMessage_jobPrioritization(), getJob().getManifest().getFilePath());
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone(); //To change body of generated methods, choose Tools | Templates.
}
}
static final class DeprioritizeJobAction extends PrioritizationAction {
private static final long serialVersionUID = 1L;
DeprioritizeJobAction(AutoIngestJob selectedJob) {
super(selectedJob, "Deprioritize Job");
}
@Override
protected void modifyPriority(AutoIngestMonitor monitor, AutoIngestJobsPanel panel) throws AutoIngestMonitor.AutoIngestMonitorException {
monitor.deprioritizeJob(getJob());
panel.refresh(monitor);
}
@Override
protected String getErrorMessage() {
return String.format(Bundle.AutoIngestDashboard_errorMessage_jobDeprioritization(), getJob().getManifest().getFilePath());
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone(); //To change body of generated methods, choose Tools | Templates.
}
}
static final class PrioritizeCaseAction extends PrioritizationAction {
private static final long serialVersionUID = 1L;
PrioritizeCaseAction(AutoIngestJob selectedJob) {
super(selectedJob, "Prioritize Case");
}
@Override
protected void modifyPriority(AutoIngestMonitor monitor, AutoIngestJobsPanel panel) throws AutoIngestMonitor.AutoIngestMonitorException {
monitor.prioritizeCase(getJob().getManifest().getCaseName());
panel.refresh(monitor);
}
@Override
protected String getErrorMessage() {
return String.format(Bundle.AutoIngestDashboard_errorMessage_casePrioritization(), getJob().getManifest().getCaseName());
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone(); //To change body of generated methods, choose Tools | Templates.
}
}
static final class DeprioritizeCaseAction extends PrioritizationAction {
private static final long serialVersionUID = 1L;
DeprioritizeCaseAction(AutoIngestJob selectedJob) {
super(selectedJob, "Deprioritize Case");
}
@Override
protected void modifyPriority(AutoIngestMonitor monitor, AutoIngestJobsPanel panel) throws AutoIngestMonitor.AutoIngestMonitorException {
monitor.deprioritizeCase(getJob().getManifest().getCaseName());
panel.refresh(monitor);
}
@Override
protected String getErrorMessage() {
return String.format(Bundle.AutoIngestDashboard_errorMessage_caseDeprioritization(), getJob().getManifest().getCaseName());
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone(); //To change body of generated methods, choose Tools | Templates.
}
}
}