diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/AnalysisSummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/AnalysisSummary.java index b2bebc659b..539d957ded 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/AnalysisSummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/AnalysisSummary.java @@ -40,7 +40,7 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Providing data for the data source analysis tab. */ -public class AnalysisSummary implements DataSourceSummaryDataModel { +public class AnalysisSummary implements EventUpdateGovernor { private static final BlackboardAttribute.Type TYPE_SET_NAME = new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SET_NAME); diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/ContainerSummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/ContainerSummary.java index e70093bbec..8af54c642f 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/ContainerSummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/ContainerSummary.java @@ -32,7 +32,7 @@ import org.sleuthkit.datamodel.TskData; /** * Provides methods to query for data source overview details. */ -public class ContainerSummary implements DataSourceSummaryDataModel { +public class ContainerSummary implements EventUpdateGovernor { private static final Set ARTIFACT_UPDATE_TYPE_IDS = new HashSet<>(Arrays.asList( BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_INFO.getTypeID(), BlackboardArtifact.ARTIFACT_TYPE.TSK_DATA_SOURCE_USAGE.getTypeID() diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceSummaryDataModel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/EventUpdateGovernor.java similarity index 88% rename from Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceSummaryDataModel.java rename to Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/EventUpdateGovernor.java index 93ecb170bd..85d265d59b 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceSummaryDataModel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/EventUpdateGovernor.java @@ -23,9 +23,11 @@ import java.util.Set; import org.sleuthkit.autopsy.casemodule.Case; /** - * Interface for data model classes in data source summary. + * Interface for determiining when data should update based on autopsy (i.e. + * case/ingest) events. */ -public interface DataSourceSummaryDataModel { +public interface EventUpdateGovernor { + /** * @return The set of Case Events for which data should be updated. */ @@ -34,14 +36,16 @@ public interface DataSourceSummaryDataModel { } /** - * @return The set of BlackboardArtifact id's for which data shoulde be updated. - */ + * @return The set of BlackboardArtifact id's for which data shoulde be + * updated. + */ default Set getArtifactIdUpdates() { return Collections.emptySet(); } - + /** * Whether or not the content should be updated on receiving new content. + * * @return True if it should refresh on new content. */ default boolean shouldRefreshOnNewContent() { diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/MimeTypeSummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/MimeTypeSummary.java index be2dd6cf05..0d5c4029bf 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/MimeTypeSummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/MimeTypeSummary.java @@ -28,7 +28,7 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Provides methods to query for datasource files by mime type. */ -public class MimeTypeSummary implements DataSourceSummaryDataModel { +public class MimeTypeSummary implements EventUpdateGovernor { private final SleuthkitCaseProvider provider; diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/RecentFilesSummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/RecentFilesSummary.java index 4fe0abc791..c575e69aab 100755 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/RecentFilesSummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/RecentFilesSummary.java @@ -43,7 +43,7 @@ import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; /** * Helper class for getting data for the Recent Files Data Summary tab. */ -public class RecentFilesSummary implements DataSourceSummaryDataModel { +public class RecentFilesSummary implements EventUpdateGovernor { private final static BlackboardAttribute.Type DATETIME_ACCESSED_ATT = new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED); private final static BlackboardAttribute.Type DOMAIN_ATT = new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN); diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TopProgramsSummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TopProgramsSummary.java index 2e33775795..64be0cc94a 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TopProgramsSummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TopProgramsSummary.java @@ -42,7 +42,7 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Provides information to populate Top Programs Summary queries. */ -public class TopProgramsSummary implements DataSourceSummaryDataModel { +public class TopProgramsSummary implements EventUpdateGovernor { private static final Set ARTIFACT_UPDATE_TYPE_IDS = new HashSet<>(Arrays.asList( ARTIFACT_TYPE.TSK_PROG_RUN.getTypeID() diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TypesSummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TypesSummary.java index c977f4d897..9a04d565b7 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TypesSummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TypesSummary.java @@ -27,7 +27,7 @@ import org.sleuthkit.datamodel.TskData; /** * Provides information for the DataSourceSummaryCountsPanel. */ -public class TypesSummary implements DataSourceSummaryDataModel { +public class TypesSummary implements EventUpdateGovernor { private final SleuthkitCaseProvider provider; diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummary.java index f895d41cee..180e4d5430 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummary.java @@ -47,7 +47,7 @@ import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE; * time, the data being provided for domains is fictitious and is done as a * placeholder. */ -public class UserActivitySummary implements DataSourceSummaryDataModel { +public class UserActivitySummary implements EventUpdateGovernor { private static final BlackboardArtifact.Type TYPE_DEVICE_ATTACHED = new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_DEVICE_ATTACHED); diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java index 84e7be1788..e960d64a00 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java @@ -30,7 +30,6 @@ import java.util.stream.Stream; import javax.swing.JPanel; import javax.swing.SwingWorker; import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceSummaryDataModel; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchResult; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents; @@ -41,6 +40,7 @@ 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.autopsy.datasourcesummary.datamodel.EventUpdateGovernor; /** * Base class from which other tabs in data source summary derive. @@ -95,11 +95,10 @@ abstract class BaseDataSourceSummaryPanel extends JPanel { .collect(Collectors.toSet()); } - protected BaseDataSourceSummaryPanel(DataSourceSummaryDataModel...dataModels) { - this( - getUnionSet(DataSourceSummaryDataModel::getCaseEventUpdates, dataModels), - getUnionSet(DataSourceSummaryDataModel::getArtifactIdUpdates, dataModels), - Stream.of(dataModels).anyMatch(DataSourceSummaryDataModel::shouldRefreshOnNewContent) + protected BaseDataSourceSummaryPanel(EventUpdateGovernor...dataModels) { + this(getUnionSet(EventUpdateGovernor::getCaseEventUpdates, dataModels), + getUnionSet(EventUpdateGovernor::getArtifactIdUpdates, dataModels), + Stream.of(dataModels).anyMatch(EventUpdateGovernor::shouldRefreshOnNewContent) ); } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/EventUpdateHandler.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/EventUpdateHandler.java new file mode 100644 index 0000000000..0ae61823f7 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/EventUpdateHandler.java @@ -0,0 +1,14 @@ +/* + * 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.datasourcesummary.ui; + +/** + * + * @author gregd + */ +public class EventUpdateHandler { + +} diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/RecentFilesPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/RecentFilesPanel.java index a7a46667a6..3aa3beba0c 100755 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/RecentFilesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/RecentFilesPanel.java @@ -113,6 +113,7 @@ public final class RecentFilesPanel extends BaseDataSourceSummaryPanel { JTablePanel pane = (JTablePanel) openedDocPane; pane.setModel(tableModel); pane.setColumnModel(JTablePanel.getTableColumnModel(list)); + pane.setKeyFunction((recentFile) -> recentFile.getPath()); tablePanelList.add(pane); DataFetchWorker.DataFetchComponents> worker @@ -147,6 +148,7 @@ public final class RecentFilesPanel extends BaseDataSourceSummaryPanel { JTablePanel pane = (JTablePanel) downloadsPane; pane.setModel(tableModel); + pane.setKeyFunction((download) -> download.getPath()); pane.setColumnModel(JTablePanel.getTableColumnModel(list)); tablePanelList.add(pane); @@ -182,6 +184,7 @@ public final class RecentFilesPanel extends BaseDataSourceSummaryPanel { JTablePanel pane = (JTablePanel) attachmentsPane; pane.setModel(tableModel); + pane.setKeyFunction((attachment) -> attachment.getPath()); pane.setColumnModel(JTablePanel.getTableColumnModel(list)); tablePanelList.add(pane); diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/UserActivityPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/UserActivityPanel.java index 1d47563a98..e703017898 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/UserActivityPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/UserActivityPanel.java @@ -116,7 +116,8 @@ public class UserActivityPanel extends BaseDataSourceSummaryPanel { Bundle.UserActivityPanel_TopProgramsTableModel_lastrun_header(), (prog) -> new DefaultCellModel(getFormatted(prog.getLastRun())), 150) - )); + )) + .setKeyFunction((prog) -> prog.getProgramPath() + prog.getProgramName()); // set up recent domains table private final JTablePanel recentDomainsTable = JTablePanel.getJTablePanel(Arrays.asList( @@ -135,7 +136,8 @@ public class UserActivityPanel extends BaseDataSourceSummaryPanel { Bundle.UserActivityPanel_TopDomainsTableModel_lastAccess_header(), (recentDomain) -> new DefaultCellModel(getFormatted(recentDomain.getLastVisit())), 150) - )); + )) + .setKeyFunction((domain) -> domain.getDomain()); // top web searches table private final JTablePanel topWebSearchesTable = JTablePanel.getJTablePanel(Arrays.asList( @@ -157,7 +159,8 @@ public class UserActivityPanel extends BaseDataSourceSummaryPanel { (webSearch) -> new DefaultCellModel(webSearch.getTranslatedResult()), 250 ) - )); + )) + .setKeyFunction((query) -> query.getSearchString()); // top devices attached table private final JTablePanel topDevicesAttachedTable = JTablePanel.getJTablePanel(Arrays.asList( @@ -186,7 +189,8 @@ public class UserActivityPanel extends BaseDataSourceSummaryPanel { }, 250 ) - )); + )) + .setKeyFunction((topDevice) -> topDevice.getDeviceId()); // top accounts table private final JTablePanel topAccountsTable = JTablePanel.getJTablePanel(Arrays.asList( @@ -202,7 +206,8 @@ public class UserActivityPanel extends BaseDataSourceSummaryPanel { (account) -> new DefaultCellModel(getFormatted(account.getLastAccess())), 150 ) - )); + )) + .setKeyFunction((topAccount) -> topAccount.getAccountType()); private final List> tables = Arrays.asList( topProgramsTable,