From 69f8b060ea1994520b22bf90b6284d2cd0754639 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 19 Dec 2018 17:46:42 -0500 Subject: [PATCH 1/6] 4328 make refreshing occur at 30 second interval instead of in response to events --- .../autoingest/AutoIngestDashboard.java | 32 +++++++++---------- .../autoingest/AutoIngestMonitor.java | 3 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 8d993f4dc9..25736d5563 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -18,9 +18,8 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.Cursor; -import java.util.Observable; -import java.util.Observer; import java.util.logging.Level; import java.awt.Color; import java.awt.EventQueue; @@ -31,6 +30,8 @@ import java.nio.file.Paths; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import javax.swing.JPanel; import javax.swing.SwingWorker; import javax.swing.UIManager; @@ -45,17 +46,20 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestNodeRefreshEvents * A dashboard for monitoring an automated ingest cluster. */ @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives -final class AutoIngestDashboard extends JPanel implements Observer { - +final class AutoIngestDashboard extends JPanel { + private final static String ADMIN_ACCESS_FILE_NAME = "_aiaa"; // NON-NLS private final static String ADMIN_ACCESS_FILE_PATH = Paths.get(PlatformUtil.getUserConfigDirectory(), ADMIN_ACCESS_FILE_NAME).toString(); + private final static String AID_REFRESH_THREAD_NAME = "AID-refresh-jobs-%d"; + private final static int AID_REFRESH_INTERVAL_SECS = 30; + private final static int AID_DELAY_BEFORE_FIRST_REFRESH = 0; private static final long serialVersionUID = 1L; private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboard.class.getName()); private AutoIngestMonitor autoIngestMonitor; private AutoIngestJobsPanel pendingJobsPanel; private AutoIngestJobsPanel runningJobsPanel; private AutoIngestJobsPanel completedJobsPanel; - + private final ScheduledThreadPoolExecutor scheduledRefreshThreadPoolExecutor; /** * Maintain a mapping of each service to it's last status update. */ @@ -88,7 +92,7 @@ final class AutoIngestDashboard extends JPanel implements Observer { private AutoIngestDashboard() { this.statusByService = new ConcurrentHashMap<>(); - + scheduledRefreshThreadPoolExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder().setNameFormat(AID_REFRESH_THREAD_NAME).build()); initComponents(); statusByService.put(ServicesMonitor.Service.REMOTE_CASE_DATABASE.toString(), NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down")); statusByService.put(ServicesMonitor.Service.REMOTE_KEYWORD_SEARCH.toString(), NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down")); @@ -236,7 +240,12 @@ final class AutoIngestDashboard extends JPanel implements Observer { ServicesMonitor.getInstance().addSubscriber(servicesList, propChangeListener); autoIngestMonitor = new AutoIngestMonitor(); - autoIngestMonitor.addObserver(this); + + scheduledRefreshThreadPoolExecutor.scheduleWithFixedDelay(() -> { + EventQueue.invokeLater(() -> { + refreshTables(); + }); + }, AID_DELAY_BEFORE_FIRST_REFRESH, AID_REFRESH_INTERVAL_SECS, TimeUnit.SECONDS); new Thread(() -> { try { autoIngestMonitor.startUp(); @@ -255,15 +264,6 @@ final class AutoIngestDashboard extends JPanel implements Observer { } } - @Override - public void update(Observable observable, Object arg) { - if (arg == null ) { - EventQueue.invokeLater(() -> { - refreshTables(); - }); - } - } - /** * Reloads the table models using a jobs snapshot and refreshes the JTables * that use the models. diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 84eaa5fcdf..8f7a9c0696 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -198,6 +198,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen runningJob.setModuleRuntimesSnapshot(job.getModuleRunTimes()); runningJob.setProcessingStage(job.getProcessingStage(), job.getProcessingStageStartDate()); runningJob.setProcessingStatus(job.getProcessingStatus()); + break; } } setChanged(); @@ -734,7 +735,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen stopWatch.start(); eventPublisher.publishRemotely(new AutoIngestCaseDeletedEvent(caseName, LOCAL_HOST_NAME, AutoIngestManager.getSystemUserNameProperty())); stopWatch.stop(); - LOGGER.log(Level.INFO, String.format("Used %d s to publish job deletion event for case %s at %s", stopWatch.getElapsedTimeSecs(), caseName,caseDirectoryPath)); + LOGGER.log(Level.INFO, String.format("Used %d s to publish job deletion event for case %s at %s", stopWatch.getElapsedTimeSecs(), caseName, caseDirectoryPath)); } return CaseDeletionResult.FULLY_DELETED; From 48d47d93befbf4beb608ab39d485ca710f022293 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 20 Dec 2018 11:23:49 -0500 Subject: [PATCH 2/6] 4328 give AutoIngestMonitor a chance to start before first refresh --- .../experimental/autoingest/AutoIngestDashboard.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 25736d5563..dddb387cdb 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -52,7 +52,7 @@ final class AutoIngestDashboard extends JPanel { private final static String ADMIN_ACCESS_FILE_PATH = Paths.get(PlatformUtil.getUserConfigDirectory(), ADMIN_ACCESS_FILE_NAME).toString(); private final static String AID_REFRESH_THREAD_NAME = "AID-refresh-jobs-%d"; private final static int AID_REFRESH_INTERVAL_SECS = 30; - private final static int AID_DELAY_BEFORE_FIRST_REFRESH = 0; + private final static int AID_DELAY_BEFORE_FIRST_REFRESH = 1; private static final long serialVersionUID = 1L; private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboard.class.getName()); private AutoIngestMonitor autoIngestMonitor; @@ -241,11 +241,6 @@ final class AutoIngestDashboard extends JPanel { autoIngestMonitor = new AutoIngestMonitor(); - scheduledRefreshThreadPoolExecutor.scheduleWithFixedDelay(() -> { - EventQueue.invokeLater(() -> { - refreshTables(); - }); - }, AID_DELAY_BEFORE_FIRST_REFRESH, AID_REFRESH_INTERVAL_SECS, TimeUnit.SECONDS); new Thread(() -> { try { autoIngestMonitor.startUp(); @@ -253,6 +248,11 @@ final class AutoIngestDashboard extends JPanel { LOGGER.log(Level.SEVERE, "Unable to start up Auto Ingest Monitor", ex); } }).start(); + scheduledRefreshThreadPoolExecutor.scheduleWithFixedDelay(() -> { + EventQueue.invokeLater(() -> { + refreshTables(); + }); + }, AID_DELAY_BEFORE_FIRST_REFRESH, AID_REFRESH_INTERVAL_SECS, TimeUnit.SECONDS); } /** From 003990972036d11fa09c84240067c463ac39c6c6 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 20 Dec 2018 11:30:42 -0500 Subject: [PATCH 3/6] 4328 make node list refresh at set interval as well --- .../autoingest/AinStatusDashboard.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java index 3cfe48da5d..62d4e4bca0 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java @@ -18,27 +18,32 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.Cursor; import java.awt.EventQueue; -import java.util.Observable; -import java.util.Observer; -import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMonitor.AutoIngestNodeState; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import org.sleuthkit.autopsy.healthmonitor.HealthMonitorDashboard; /** * A dashboard for monitoring the existing AutoIngestNodes and their status. */ @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives -final class AinStatusDashboard extends javax.swing.JPanel implements Observer { +final class AinStatusDashboard extends javax.swing.JPanel { private final AutoIngestMonitor autoIngestMonitor; private final AinStatusPanel nodesPanel; + private final static String AIN_REFRESH_THREAD_NAME = "AID-refresh-jobs-%d"; + private final static int AIN_REFRESH_INTERVAL_SECS = 30; + private final static int AIN_DELAY_BEFORE_FIRST_REFRESH = 1; + private final ScheduledThreadPoolExecutor scheduledRefreshThreadPoolExecutor; /** * Creates new form AutoIngestNodeStatus */ AinStatusDashboard(AutoIngestMonitor monitor) { initComponents(); + scheduledRefreshThreadPoolExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder().setNameFormat(AIN_REFRESH_THREAD_NAME).build()); autoIngestMonitor = monitor; nodesPanel = new AinStatusPanel(); nodesPanel.setSize(nodesPanel.getSize()); @@ -51,7 +56,11 @@ final class AinStatusDashboard extends javax.swing.JPanel implements Observer { * Adds this panel as an observer of AutoIngestMonitor. */ void startUp() { - autoIngestMonitor.addObserver(this); + scheduledRefreshThreadPoolExecutor.scheduleWithFixedDelay(() -> { + EventQueue.invokeLater(() -> { + refreshTables(); + }); + }, AIN_DELAY_BEFORE_FIRST_REFRESH, AIN_REFRESH_INTERVAL_SECS, TimeUnit.SECONDS); } AutoIngestMonitor getMonitor() { @@ -170,12 +179,4 @@ final class AinStatusDashboard extends javax.swing.JPanel implements Observer { private javax.swing.JButton refreshButton; // End of variables declaration//GEN-END:variables - @Override - public void update(Observable o, Object arg) { - if (arg instanceof AutoIngestNodeState) { - EventQueue.invokeLater(() -> { - refreshTables(); - }); - } - } } From fc7a7624c6f592df320fa6e4bfc34cc434e4e002 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 20 Dec 2018 12:59:11 -0500 Subject: [PATCH 4/6] 4328 remove extension of Observable from AutoIngestMonitor --- .../autoingest/AutoIngestDashboard.java | 13 ++++++------- .../autoingest/AutoIngestMonitor.java | 18 ++---------------- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index dddb387cdb..bb71d008f6 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -52,7 +52,7 @@ final class AutoIngestDashboard extends JPanel { private final static String ADMIN_ACCESS_FILE_PATH = Paths.get(PlatformUtil.getUserConfigDirectory(), ADMIN_ACCESS_FILE_NAME).toString(); private final static String AID_REFRESH_THREAD_NAME = "AID-refresh-jobs-%d"; private final static int AID_REFRESH_INTERVAL_SECS = 30; - private final static int AID_DELAY_BEFORE_FIRST_REFRESH = 1; + private final static int AID_DELAY_BEFORE_FIRST_REFRESH = 0; private static final long serialVersionUID = 1L; private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboard.class.getName()); private AutoIngestMonitor autoIngestMonitor; @@ -240,19 +240,18 @@ final class AutoIngestDashboard extends JPanel { ServicesMonitor.getInstance().addSubscriber(servicesList, propChangeListener); autoIngestMonitor = new AutoIngestMonitor(); - new Thread(() -> { try { autoIngestMonitor.startUp(); + scheduledRefreshThreadPoolExecutor.scheduleWithFixedDelay(() -> { + EventQueue.invokeLater(() -> { + refreshTables(); + }); + }, AID_DELAY_BEFORE_FIRST_REFRESH, AID_REFRESH_INTERVAL_SECS, TimeUnit.SECONDS); } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { LOGGER.log(Level.SEVERE, "Unable to start up Auto Ingest Monitor", ex); } }).start(); - scheduledRefreshThreadPoolExecutor.scheduleWithFixedDelay(() -> { - EventQueue.invokeLater(() -> { - refreshTables(); - }); - }, AID_DELAY_BEFORE_FIRST_REFRESH, AID_REFRESH_INTERVAL_SECS, TimeUnit.SECONDS); } /** diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 8f7a9c0696..4e0de76bad 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -30,7 +30,6 @@ import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Observable; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -59,7 +58,7 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestNodeControlEvent. * An auto ingest monitor responsible for monitoring and reporting the * processing of auto ingest jobs. */ -final class AutoIngestMonitor extends Observable implements PropertyChangeListener { +final class AutoIngestMonitor implements PropertyChangeListener { private static final Logger LOGGER = Logger.getLogger(AutoIngestMonitor.class.getName()); private static final int DEFAULT_PRIORITY = 0; @@ -172,8 +171,6 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen synchronized (jobsLock) { jobsSnapshot.removePendingJob(event.getJob()); jobsSnapshot.addOrReplaceRunningJob(event.getJob()); - setChanged(); - notifyObservers(); } } @@ -201,8 +198,6 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen break; } } - setChanged(); - notifyObservers(); } } @@ -217,8 +212,6 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen jobsSnapshot.removePendingJob(job); jobsSnapshot.removeRunningJob(job); jobsSnapshot.addOrReplaceCompletedJob(job); - setChanged(); - notifyObservers(); } } @@ -246,18 +239,14 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen * @param event A node state change event. */ private void handleAutoIngestNodeStateEvent(AutoIngestNodeStateEvent event) { - AutoIngestNodeState oldNodeState = null; if (event.getEventType() == AutoIngestManager.Event.SHUTDOWN) { // Remove node from collection. - oldNodeState = nodeStates.remove(event.getNodeName()); + nodeStates.remove(event.getNodeName()); } else { // Otherwise either create an entry for the given node name or update // an existing entry in the map. nodeStates.put(event.getNodeName(), new AutoIngestNodeState(event.getNodeName(), event.getEventType())); } - setChanged(); - // Trigger a dashboard refresh. - notifyObservers(oldNodeState == null ? nodeStates.get(event.getNodeName()) : oldNodeState); } /** @@ -797,9 +786,6 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen // Ask running auto ingest nodes to report their status. refreshNodeState(); - - setChanged(); - notifyObservers(); } } From 8de438ced15042ac4302d6cfef431bf22b024a30 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 20 Dec 2018 14:00:31 -0500 Subject: [PATCH 5/6] 4328 add back observer / observable to AutoIngestDashboard with executor --- .../autoingest/AinStatusDashboard.java | 24 ++++++++++++------ .../autoingest/AutoIngestDashboard.java | 25 ++++++++++++++----- .../autoingest/AutoIngestMonitor.java | 18 +++++++++++-- 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java index 62d4e4bca0..270b3c3dc8 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AinStatusDashboard.java @@ -21,22 +21,26 @@ package org.sleuthkit.autopsy.experimental.autoingest; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.Cursor; import java.awt.EventQueue; +import java.util.Observable; +import java.util.Observer; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import org.sleuthkit.autopsy.healthmonitor.HealthMonitorDashboard; /** * A dashboard for monitoring the existing AutoIngestNodes and their status. */ @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives -final class AinStatusDashboard extends javax.swing.JPanel { +final class AinStatusDashboard extends javax.swing.JPanel implements Observer { private final AutoIngestMonitor autoIngestMonitor; private final AinStatusPanel nodesPanel; private final static String AIN_REFRESH_THREAD_NAME = "AID-refresh-jobs-%d"; private final static int AIN_REFRESH_INTERVAL_SECS = 30; - private final static int AIN_DELAY_BEFORE_FIRST_REFRESH = 1; + private final static int AIN_DELAY_BEFORE_FIRST_REFRESH = 0; private final ScheduledThreadPoolExecutor scheduledRefreshThreadPoolExecutor; + private AtomicBoolean scheduledRefreshStarted = new AtomicBoolean(false); /** * Creates new form AutoIngestNodeStatus @@ -56,11 +60,7 @@ final class AinStatusDashboard extends javax.swing.JPanel { * Adds this panel as an observer of AutoIngestMonitor. */ void startUp() { - scheduledRefreshThreadPoolExecutor.scheduleWithFixedDelay(() -> { - EventQueue.invokeLater(() -> { - refreshTables(); - }); - }, AIN_DELAY_BEFORE_FIRST_REFRESH, AIN_REFRESH_INTERVAL_SECS, TimeUnit.SECONDS); + autoIngestMonitor.addObserver(this); } AutoIngestMonitor getMonitor() { @@ -179,4 +179,14 @@ final class AinStatusDashboard extends javax.swing.JPanel { private javax.swing.JButton refreshButton; // End of variables declaration//GEN-END:variables + @Override + public void update(Observable o, Object arg) { + if (!scheduledRefreshStarted.getAndSet(true)) { + scheduledRefreshThreadPoolExecutor.scheduleWithFixedDelay(() -> { + EventQueue.invokeLater(() -> { + refreshTables(); + }); + }, AIN_DELAY_BEFORE_FIRST_REFRESH, AIN_REFRESH_INTERVAL_SECS, TimeUnit.SECONDS); + } + } } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index bb71d008f6..9743592ba3 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -28,10 +28,13 @@ import java.beans.PropertyChangeListener; import java.io.File; import java.nio.file.Paths; import java.util.HashSet; +import java.util.Observable; +import java.util.Observer; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JPanel; import javax.swing.SwingWorker; import javax.swing.UIManager; @@ -46,7 +49,7 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestNodeRefreshEvents * A dashboard for monitoring an automated ingest cluster. */ @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives -final class AutoIngestDashboard extends JPanel { +final class AutoIngestDashboard extends JPanel implements Observer { private final static String ADMIN_ACCESS_FILE_NAME = "_aiaa"; // NON-NLS private final static String ADMIN_ACCESS_FILE_PATH = Paths.get(PlatformUtil.getUserConfigDirectory(), ADMIN_ACCESS_FILE_NAME).toString(); @@ -60,6 +63,8 @@ final class AutoIngestDashboard extends JPanel { private AutoIngestJobsPanel runningJobsPanel; private AutoIngestJobsPanel completedJobsPanel; private final ScheduledThreadPoolExecutor scheduledRefreshThreadPoolExecutor; + private AtomicBoolean scheduledRefreshStarted = new AtomicBoolean(false); + /** * Maintain a mapping of each service to it's last status update. */ @@ -240,14 +245,11 @@ final class AutoIngestDashboard extends JPanel { ServicesMonitor.getInstance().addSubscriber(servicesList, propChangeListener); autoIngestMonitor = new AutoIngestMonitor(); + autoIngestMonitor.addObserver(this); new Thread(() -> { try { autoIngestMonitor.startUp(); - scheduledRefreshThreadPoolExecutor.scheduleWithFixedDelay(() -> { - EventQueue.invokeLater(() -> { - refreshTables(); - }); - }, AID_DELAY_BEFORE_FIRST_REFRESH, AID_REFRESH_INTERVAL_SECS, TimeUnit.SECONDS); + } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { LOGGER.log(Level.SEVERE, "Unable to start up Auto Ingest Monitor", ex); } @@ -263,6 +265,17 @@ final class AutoIngestDashboard extends JPanel { } } + @Override + public void update(Observable observable, Object arg) { + if (!scheduledRefreshStarted.getAndSet(true)) { + scheduledRefreshThreadPoolExecutor.scheduleWithFixedDelay(() -> { + EventQueue.invokeLater(() -> { + refreshTables(); + }); + }, AID_DELAY_BEFORE_FIRST_REFRESH, AID_REFRESH_INTERVAL_SECS, TimeUnit.SECONDS); + } + } + /** * Reloads the table models using a jobs snapshot and refreshes the JTables * that use the models. diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 4e0de76bad..8f7a9c0696 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -30,6 +30,7 @@ import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Observable; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -58,7 +59,7 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestNodeControlEvent. * An auto ingest monitor responsible for monitoring and reporting the * processing of auto ingest jobs. */ -final class AutoIngestMonitor implements PropertyChangeListener { +final class AutoIngestMonitor extends Observable implements PropertyChangeListener { private static final Logger LOGGER = Logger.getLogger(AutoIngestMonitor.class.getName()); private static final int DEFAULT_PRIORITY = 0; @@ -171,6 +172,8 @@ final class AutoIngestMonitor implements PropertyChangeListener { synchronized (jobsLock) { jobsSnapshot.removePendingJob(event.getJob()); jobsSnapshot.addOrReplaceRunningJob(event.getJob()); + setChanged(); + notifyObservers(); } } @@ -198,6 +201,8 @@ final class AutoIngestMonitor implements PropertyChangeListener { break; } } + setChanged(); + notifyObservers(); } } @@ -212,6 +217,8 @@ final class AutoIngestMonitor implements PropertyChangeListener { jobsSnapshot.removePendingJob(job); jobsSnapshot.removeRunningJob(job); jobsSnapshot.addOrReplaceCompletedJob(job); + setChanged(); + notifyObservers(); } } @@ -239,14 +246,18 @@ final class AutoIngestMonitor implements PropertyChangeListener { * @param event A node state change event. */ private void handleAutoIngestNodeStateEvent(AutoIngestNodeStateEvent event) { + AutoIngestNodeState oldNodeState = null; if (event.getEventType() == AutoIngestManager.Event.SHUTDOWN) { // Remove node from collection. - nodeStates.remove(event.getNodeName()); + oldNodeState = nodeStates.remove(event.getNodeName()); } else { // Otherwise either create an entry for the given node name or update // an existing entry in the map. nodeStates.put(event.getNodeName(), new AutoIngestNodeState(event.getNodeName(), event.getEventType())); } + setChanged(); + // Trigger a dashboard refresh. + notifyObservers(oldNodeState == null ? nodeStates.get(event.getNodeName()) : oldNodeState); } /** @@ -786,6 +797,9 @@ final class AutoIngestMonitor implements PropertyChangeListener { // Ask running auto ingest nodes to report their status. refreshNodeState(); + + setChanged(); + notifyObservers(); } } From 77b8bf863ea2f7928314a794fe64735cbf938517 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 20 Dec 2018 14:04:43 -0500 Subject: [PATCH 6/6] 4328 fix errors with comments regarding arguements --- .../autopsy/experimental/autoingest/AutoIngestDashboard.java | 3 +-- .../autopsy/experimental/autoingest/AutoIngestJobsPanel.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 9743592ba3..754a9c3ad7 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -277,10 +277,9 @@ final class AutoIngestDashboard extends JPanel implements Observer { } /** - * Reloads the table models using a jobs snapshot and refreshes the JTables + * Reloads the table models using a RefreshChildrenEvent and refreshes the JTables * that use the models. * - * @param nodeStateSnapshot The jobs snapshot. */ void refreshTables() { pendingJobsPanel.refresh(new RefreshChildrenEvent(autoIngestMonitor)); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobsPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobsPanel.java index 18fb8171b2..6962057541 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobsPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJobsPanel.java @@ -164,7 +164,7 @@ final class AutoIngestJobsPanel extends javax.swing.JPanel implements ExplorerMa * Update the contents of this AutoIngestJobsPanel while retaining currently * selected node. * - * @param jobsSnapshot - the JobsSnapshot which will provide the new + * @param refreshEvent - the AutoIngestRefreshEvent which will provide the new * contents */ void refresh(AutoIngestRefreshEvent refreshEvent) {