19 package org.sleuthkit.autopsy.datamodel;
21 import com.google.common.util.concurrent.ThreadFactoryBuilder;
22 import java.beans.PropertyChangeEvent;
23 import java.beans.PropertyChangeListener;
24 import java.util.EnumSet;
26 import java.util.concurrent.ScheduledThreadPoolExecutor;
27 import java.util.concurrent.TimeUnit;
28 import java.util.concurrent.atomic.AtomicReference;
36 class RefreshThrottler {
57 boolean isRefreshRequired(PropertyChangeEvent evt);
60 static ScheduledThreadPoolExecutor refreshExecutor =
new ScheduledThreadPoolExecutor(1,
new ThreadFactoryBuilder().setNameFormat(
"Node Refresh Thread").build());
62 private final AtomicReference<RefreshTask> refreshTaskRef;
65 private final Refresher refresher;
67 private static final long MIN_SECONDS_BETWEEN_REFRESH = 5;
69 private static final Set<IngestManager.IngestModuleEvent> INGEST_MODULE_EVENTS_OF_INTEREST = EnumSet.of(IngestManager.IngestModuleEvent.DATA_ADDED, IngestManager.IngestModuleEvent.CONTENT_CHANGED);
82 refreshTaskRef.set(null);
90 private final PropertyChangeListener pcl;
92 RefreshThrottler(Refresher r) {
93 this.refreshTaskRef =
new AtomicReference<>(null);
96 pcl = (PropertyChangeEvent evt) -> {
97 String eventType = evt.getPropertyName();
100 if (!refresher.isRefreshRequired(evt)) {
104 RefreshTask task =
new RefreshTask();
105 if (refreshTaskRef.compareAndSet(null, task)) {
106 refreshExecutor.schedule(task, MIN_SECONDS_BETWEEN_REFRESH, TimeUnit.SECONDS);
115 void registerForIngestModuleEvents() {
116 IngestManager.getInstance().addIngestModuleEventListener(INGEST_MODULE_EVENTS_OF_INTEREST, pcl);
122 void unregisterEventListener() {
123 IngestManager.getInstance().removeIngestModuleEventListener(pcl);