mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-14 17:06:16 +00:00
event governor
This commit is contained in:
parent
e73863fce7
commit
d66b5722df
@ -18,9 +18,12 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.datasourcesummary.datamodel;
|
package org.sleuthkit.autopsy.datasourcesummary.datamodel;
|
||||||
|
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
|
import org.sleuthkit.autopsy.ingest.ModuleContentEvent;
|
||||||
|
import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for determiining when data should update based on autopsy (i.e.
|
* Interface for determiining when data should update based on autopsy (i.e.
|
||||||
@ -35,20 +38,9 @@ public interface EventUpdateGovernor {
|
|||||||
return Collections.emptySet();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
boolean isRefreshRequired(ModuleDataEvent evt);
|
||||||
* @return The set of BlackboardArtifact id's for which data shoulde be
|
|
||||||
* updated.
|
|
||||||
*/
|
|
||||||
default Set<Integer> getArtifactIdUpdates() {
|
|
||||||
return Collections.emptySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
boolean isRefreshRequired(ModuleContentEvent evt);
|
||||||
* Whether or not the content should be updated on receiving new content.
|
|
||||||
*
|
boolean isRefreshRequiredForCaseEvent(PropertyChangeEvent evt);
|
||||||
* @return True if it should refresh on new content.
|
|
||||||
*/
|
|
||||||
default boolean shouldRefreshOnNewContent() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -18,15 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.datasourcesummary.ui;
|
package org.sleuthkit.autopsy.datasourcesummary.ui;
|
||||||
|
|
||||||
import java.beans.PropertyChangeEvent;
|
|
||||||
import java.beans.PropertyChangeListener;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.function.Function;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.SwingWorker;
|
import javax.swing.SwingWorker;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
@ -35,12 +28,7 @@ import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker;
|
|||||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents;
|
import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents;
|
||||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.LoadableComponent;
|
import org.sleuthkit.autopsy.datasourcesummary.uiutils.LoadableComponent;
|
||||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.SwingWorkerSequentialExecutor;
|
import org.sleuthkit.autopsy.datasourcesummary.uiutils.SwingWorkerSequentialExecutor;
|
||||||
import org.sleuthkit.autopsy.guiutils.RefreshThrottler;
|
|
||||||
import org.sleuthkit.autopsy.ingest.IngestManager.IngestModuleEvent;
|
|
||||||
import org.sleuthkit.autopsy.ingest.ModuleContentEvent;
|
|
||||||
import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
|
|
||||||
import org.sleuthkit.datamodel.DataSource;
|
import org.sleuthkit.datamodel.DataSource;
|
||||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.EventUpdateGovernor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class from which other tabs in data source summary derive.
|
* Base class from which other tabs in data source summary derive.
|
||||||
@ -51,86 +39,10 @@ abstract class BaseDataSourceSummaryPanel extends JPanel {
|
|||||||
|
|
||||||
private final SwingWorkerSequentialExecutor executor = new SwingWorkerSequentialExecutor();
|
private final SwingWorkerSequentialExecutor executor = new SwingWorkerSequentialExecutor();
|
||||||
|
|
||||||
private final RefreshThrottler refreshThrottler = new RefreshThrottler(new RefreshThrottler.Refresher() {
|
|
||||||
@Override
|
|
||||||
public void refresh() {
|
|
||||||
onRefresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isRefreshRequired(PropertyChangeEvent evt) {
|
|
||||||
String eventType = evt.getPropertyName();
|
|
||||||
if (Case.isCaseOpen()) {
|
|
||||||
if (IngestModuleEvent.DATA_ADDED.toString().equals(eventType) && evt.getOldValue() instanceof ModuleDataEvent) {
|
|
||||||
ModuleDataEvent dataEvent = (ModuleDataEvent) evt.getOldValue();
|
|
||||||
return BaseDataSourceSummaryPanel.this.isRefreshRequired(dataEvent);
|
|
||||||
} else if (IngestModuleEvent.CONTENT_CHANGED.toString().equals(eventType) && evt.getOldValue() instanceof ModuleContentEvent) {
|
|
||||||
ModuleContentEvent contentEvent = (ModuleContentEvent) evt.getOldValue();
|
|
||||||
return BaseDataSourceSummaryPanel.this.isRefreshRequired(contentEvent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
private final PropertyChangeListener caseEventsListener = (evt) -> {
|
|
||||||
switch (Case.Events.valueOf(evt.getPropertyName())) {
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (isRefreshRequiredForCaseEvent(evt)) {
|
|
||||||
onRefresh();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private final Set<Integer> artifactTypesForRefresh;
|
|
||||||
private final boolean refreshOnNewContent;
|
|
||||||
|
|
||||||
private DataSource dataSource;
|
private DataSource dataSource;
|
||||||
|
|
||||||
private static <I, O> Set<O> getUnionSet(Function<I, Collection<? extends O>> mapper, I... items) {
|
|
||||||
return Stream.of(items)
|
|
||||||
.flatMap((item) -> mapper.apply(item).stream())
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected BaseDataSourceSummaryPanel(EventUpdateGovernor...dataModels) {
|
|
||||||
this(getUnionSet(EventUpdateGovernor::getCaseEventUpdates, dataModels),
|
|
||||||
getUnionSet(EventUpdateGovernor::getArtifactIdUpdates, dataModels),
|
|
||||||
Stream.of(dataModels).anyMatch(EventUpdateGovernor::shouldRefreshOnNewContent)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected BaseDataSourceSummaryPanel(Set<Case.Events> caseEvents, Set<Integer> artifactTypesForRefresh, boolean refreshOnNewContent) {
|
|
||||||
this.artifactTypesForRefresh = (artifactTypesForRefresh == null)
|
|
||||||
? new HashSet<>()
|
|
||||||
: new HashSet<>(artifactTypesForRefresh);
|
|
||||||
|
|
||||||
this.refreshOnNewContent = refreshOnNewContent;
|
|
||||||
|
|
||||||
if (refreshOnNewContent || this.artifactTypesForRefresh.size() > 0) {
|
|
||||||
refreshThrottler.registerForIngestModuleEvents();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (caseEvents != null) {
|
|
||||||
Case.addEventTypeSubscriber(caseEvents, caseEventsListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isRefreshRequired(ModuleDataEvent evt) {
|
|
||||||
return artifactTypesForRefresh.contains(evt.getBlackboardArtifactType().getTypeID());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isRefreshRequired(ModuleContentEvent evt) {
|
|
||||||
return refreshOnNewContent;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isRefreshRequiredForCaseEvent(PropertyChangeEvent evt) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets datasource to visualize in the panel.
|
* Sets datasource to visualize in the panel.
|
||||||
*
|
*
|
||||||
|
@ -5,10 +5,113 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.datasourcesummary.ui;
|
package org.sleuthkit.autopsy.datasourcesummary.ui;
|
||||||
|
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.util.Set;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
|
import org.sleuthkit.autopsy.guiutils.RefreshThrottler;
|
||||||
|
import org.sleuthkit.autopsy.ingest.IngestManager;
|
||||||
|
import org.sleuthkit.autopsy.ingest.ModuleContentEvent;
|
||||||
|
import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author gregd
|
* @author gregd
|
||||||
*/
|
*/
|
||||||
public class EventUpdateHandler {
|
public class EventUpdateHandler {
|
||||||
|
|
||||||
|
private final RefreshThrottler refreshThrottler = new RefreshThrottler(new RefreshThrottler.Refresher() {
|
||||||
|
@Override
|
||||||
|
public void refresh() {
|
||||||
|
EventUpdateHandler.this.onRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRefreshRequired(PropertyChangeEvent evt) {
|
||||||
|
String eventType = evt.getPropertyName();
|
||||||
|
if (Case.isCaseOpen()) {
|
||||||
|
if (IngestManager.IngestModuleEvent.DATA_ADDED.toString().equals(eventType) && evt.getOldValue() instanceof ModuleDataEvent) {
|
||||||
|
ModuleDataEvent dataEvent = (ModuleDataEvent) evt.getOldValue();
|
||||||
|
return EventUpdateHandler.this.isRefreshRequired(dataEvent);
|
||||||
|
} else if (IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString().equals(eventType) && evt.getOldValue() instanceof ModuleContentEvent) {
|
||||||
|
ModuleContentEvent contentEvent = (ModuleContentEvent) evt.getOldValue();
|
||||||
|
return EventUpdateHandler.this.isRefreshRequired(contentEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
private final PropertyChangeListener caseEventsListener = (evt) -> {
|
||||||
|
if (isRefreshRequiredForCaseEvent(evt)) {
|
||||||
|
onRefresh();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final Set<Case.Events> caseEvents;
|
||||||
|
|
||||||
|
protected EventUpdateHandler(Set<Case.Events> caseEvents) {
|
||||||
|
this.caseEvents = caseEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isRefreshRequired(ModuleDataEvent evt) {
|
||||||
|
//return artifactTypesForRefresh.contains(evt.getBlackboardArtifactType().getTypeID());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isRefreshRequired(ModuleContentEvent evt) {
|
||||||
|
//return refreshOnNewContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isRefreshRequiredForCaseEvent(PropertyChangeEvent evt) {
|
||||||
|
//return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void onRefresh() {
|
||||||
|
// to go here
|
||||||
|
}
|
||||||
|
|
||||||
|
public void register() {
|
||||||
|
Case.addEventTypeSubscriber(caseEvents, caseEventsListener);
|
||||||
|
refreshThrottler.registerForIngestModuleEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unregister() {
|
||||||
|
Case.removeEventTypeSubscriber(caseEvents, caseEventsListener);
|
||||||
|
refreshThrottler.unregisterEventListener();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// protected BaseDataSourceSummaryPanel(EventUpdateGovernor...dataModels) {
|
||||||
|
// this(getUnionSet(EventUpdateGovernor::getCaseEventUpdates, dataModels),
|
||||||
|
// getUnionSet(EventUpdateGovernor::getArtifactIdUpdates, dataModels),
|
||||||
|
// Stream.of(dataModels).anyMatch(EventUpdateGovernor::shouldRefreshOnNewContent)
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// this.artifactTypesForRefresh = (artifactTypesForRefresh == null)
|
||||||
|
// ? new HashSet<>()
|
||||||
|
// : new HashSet<>(artifactTypesForRefresh);
|
||||||
|
//
|
||||||
|
// this.refreshOnNewContent = refreshOnNewContent;
|
||||||
|
//
|
||||||
|
// if (refreshOnNewContent || this.artifactTypesForRefresh.size() > 0) {
|
||||||
|
// refreshThrottler.registerForIngestModuleEvents();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (caseEvents != null) {
|
||||||
|
// Case.addEventTypeSubscriber(caseEvents, caseEventsListener);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// private final Set<Integer> artifactTypesForRefresh;
|
||||||
|
// private final boolean refreshOnNewContent;
|
||||||
|
//
|
||||||
|
// private static <I, O> Set<O> getUnionSet(Function<I, Collection<? extends O>> mapper, I... items) {
|
||||||
|
// return Stream.of(items)
|
||||||
|
// .flatMap((item) -> mapper.apply(item).stream())
|
||||||
|
// .collect(Collectors.toSet());
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user