From 27afee2463436e5717b60cb2106627ea7e1fdfda Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 10 Sep 2020 16:37:06 -0400 Subject: [PATCH] integrating and refactoring --- ...lysisSummary.java => AnalysisSummary.java} | 18 +- .../datamodel/DataSourceInfoUtilities.java | 73 ++-- ...mmary.java => DataSourceTypesSummary.java} | 6 +- .../datamodel/RecentFilesSummary.java | 22 +- ...msSummary.java => TopProgramsSummary.java} | 88 ++-- ...ySummary.java => UserActivitySummary.java} | 28 +- .../datasourcesummary/ui/AnalysisPanel.java | 19 +- .../ui/BaseDataSourceSummaryPanel.java | 44 +- .../datasourcesummary/ui/Bundle.properties | 10 +- .../ui/Bundle.properties-MERGED | 44 +- .../ui/DataSourceSummaryTabbedPane.java | 2 +- .../DataSourceSummaryUserActivityPanel.form | 398 ------------------ .../DataSourceSummaryUserActivityPanel.java | 390 ----------------- .../ui/RecentFilesPanel.java | 13 +- .../datasourcesummary/ui/TypesPanel.java | 15 +- .../autoingest/Bundle.properties-MERGED | 2 - 16 files changed, 224 insertions(+), 948 deletions(-) rename Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/{DataSourceAnalysisSummary.java => AnalysisSummary.java} (91%) rename Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/{DataSourceCountsSummary.java => DataSourceTypesSummary.java} (98%) rename Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/{DataSourceTopProgramsSummary.java => TopProgramsSummary.java} (84%) rename Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/{DataSourceUserActivitySummary.java => UserActivitySummary.java} (96%) delete mode 100644 Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryUserActivityPanel.form delete mode 100644 Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryUserActivityPanel.java diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceAnalysisSummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/AnalysisSummary.java similarity index 91% rename from Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceAnalysisSummary.java rename to Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/AnalysisSummary.java index 86aa21c7a1..b2bebc659b 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceAnalysisSummary.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 DataSourceAnalysisSummary { +public class AnalysisSummary implements DataSourceSummaryDataModel { private static final BlackboardAttribute.Type TYPE_SET_NAME = new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SET_NAME); @@ -51,13 +51,20 @@ public class DataSourceAnalysisSummary { "URLS", "CREDIT CARD NUMBERS" )); + + private static final Set ARTIFACT_UPDATE_TYPE_IDS = new HashSet<>(Arrays.asList( + ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID(), + ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID(), + ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID(), + ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + )); private final SleuthkitCaseProvider provider; /** * Main constructor. */ - public DataSourceAnalysisSummary() { + public AnalysisSummary() { this(SleuthkitCaseProvider.DEFAULT); } @@ -66,9 +73,14 @@ public class DataSourceAnalysisSummary { * * @param provider The means of obtaining a sleuthkit case. */ - public DataSourceAnalysisSummary(SleuthkitCaseProvider provider) { + public AnalysisSummary(SleuthkitCaseProvider provider) { this.provider = provider; } + + @Override + public Set getArtifactIdUpdates() { + return ARTIFACT_UPDATE_TYPE_IDS; + } /** * Gets counts for hashset hits. diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceInfoUtilities.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceInfoUtilities.java index 8372748cde..0183de7e70 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceInfoUtilities.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceInfoUtilities.java @@ -26,13 +26,9 @@ import java.util.Date; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; -import java.util.logging.Level; -import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.apache.commons.lang.StringUtils; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.autopsy.datasourcesummary.datamodel.SleuthkitCaseProvider.SleuthkitCaseProviderException; @@ -47,8 +43,6 @@ import org.sleuthkit.datamodel.TskData.TSK_FS_META_TYPE_ENUM; */ final class DataSourceInfoUtilities { - private static final Logger logger = Logger.getLogger(DataSourceInfoUtilities.class.getName()); - /** * Gets a count of tsk_files for a particular datasource where dir_type is * not a virtual directory and has a name. @@ -58,18 +52,17 @@ final class DataSourceInfoUtilities { * @param onError The message to log on error. * * @return The count of files or null on error. + * + * @throws SleuthkitCaseProviderException + * @throws TskCoreException + * @throws SQLException */ - static Long getCountOfTskFiles(DataSource currentDataSource, String additionalWhere, String onError) { + static Long getCountOfTskFiles(SleuthkitCase skCase, DataSource currentDataSource, String additionalWhere) + throws TskCoreException, SQLException { if (currentDataSource != null) { - try { - SleuthkitCase skCase = Case.getCurrentCaseThrows().getSleuthkitCase(); - return skCase.countFilesWhere( - "data_source_obj_id=" + currentDataSource.getId() - + (StringUtils.isBlank(additionalWhere) ? "" : (" AND " + additionalWhere))); - } catch (TskCoreException | NoCurrentCaseException ex) { - logger.log(Level.WARNING, onError, ex); - //unable to get count of files for the specified types cell will be displayed as empty - } + return skCase.countFilesWhere( + "data_source_obj_id=" + currentDataSource.getId() + + (StringUtils.isBlank(additionalWhere) ? "" : (" AND " + additionalWhere))); } return null; } @@ -78,20 +71,24 @@ final class DataSourceInfoUtilities { * Gets a count of regular files for a particular datasource where the * dir_type and type are not a virtual directory and has a name. * + * @param skCase The current SleuthkitCase. * @param currentDataSource The datasource. * @param additionalWhere Additional sql where clauses. - * @param onError The message to log on error. * * @return The count of files or null on error. + * + * @throws TskCoreException + * @throws SQLException */ - static Long getCountOfRegularFiles(DataSource currentDataSource, String additionalWhere, String onError) { + static Long getCountOfRegularFiles(SleuthkitCase skCase, DataSource currentDataSource, String additionalWhere) + throws TskCoreException, SQLException { String whereClause = "meta_type=" + TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_REG.getValue(); if (StringUtils.isNotBlank(additionalWhere)) { whereClause += " AND " + additionalWhere; } - return getCountOfTskFiles(currentDataSource, whereClause, onError); + return getCountOfTskFiles(skCase, currentDataSource, whereClause); } /** @@ -105,42 +102,22 @@ final class DataSourceInfoUtilities { /** * Retrieves a result based on the provided query. * - * @param query The query. - * @param processor The result set handler. - * @param errorMessage The error message to display if there is an error - * retrieving the resultset. + * @param skCase The current SleuthkitCase. + * @param query The query. + * @param processor The result set handler. * * @return The ResultSetHandler value or null if no ResultSet could be * obtained. - */ - static T getBaseQueryResult(String query, ResultSetHandler processor, String errorMessage) { - return getBaseQueryResult(SleuthkitCaseProvider.DEFAULT, query, processor, errorMessage); - } - - /** - * Retrieves a result based on the provided query. * - * @param provider The means of obtaining a SleuthkitCase. - * @param query The query. - * @param processor The result set handler. - * @param errorMessage The error message to display if there is an error - * retrieving the resultset. - * - * @return The ResultSetHandler value or null if no ResultSet could be - * obtained. + * @throws TskCoreException + * @throws SQLException */ - static T getBaseQueryResult(SleuthkitCaseProvider provider, String query, ResultSetHandler processor, String errorMessage) { - try (SleuthkitCase.CaseDbQuery dbQuery = provider.get().executeQuery(query)) { + static T getBaseQueryResult(SleuthkitCase skCase, String query, ResultSetHandler processor) + throws TskCoreException, SQLException { + try (SleuthkitCase.CaseDbQuery dbQuery = skCase.executeQuery(query)) { ResultSet resultSet = dbQuery.getResultSet(); - try { - return processor.process(resultSet); - } catch (SQLException ex) { - logger.log(Level.WARNING, errorMessage, ex); - } - } catch (TskCoreException | SleuthkitCaseProviderException ex) { - logger.log(Level.WARNING, errorMessage, ex); + return processor.process(resultSet); } - return null; } /** diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceCountsSummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceTypesSummary.java similarity index 98% rename from Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceCountsSummary.java rename to Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceTypesSummary.java index 16b79f0823..48563078a1 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceCountsSummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceTypesSummary.java @@ -31,9 +31,9 @@ import org.sleuthkit.datamodel.TskData; /** * Provides information for the DataSourceSummaryCountsPanel. */ -public class DataSourceCountsSummary { +public class DataSourceTypesSummary { - private static final Logger logger = Logger.getLogger(DataSourceCountsSummary.class.getName()); + private static final Logger logger = Logger.getLogger(DataSourceTypesSummary.class.getName()); /** * Get count of regular files (not directories) in a data source. @@ -153,6 +153,6 @@ public class DataSourceCountsSummary { }; } - private DataSourceCountsSummary() { + private DataSourceTypesSummary() { } } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/RecentFilesSummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/RecentFilesSummary.java index 42c15d3ff7..316e3b68d7 100755 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/RecentFilesSummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/RecentFilesSummary.java @@ -22,9 +22,12 @@ import java.nio.file.Paths; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import org.sleuthkit.datamodel.AbstractFile; @@ -39,11 +42,12 @@ import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.autopsy.datasourcesummary.datamodel.SleuthkitCaseProvider.SleuthkitCaseProviderException; +import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; /** * Helper class for getting data for the Recent Files Data Summary tab. */ -public class RecentFilesSummary { +public class RecentFilesSummary implements DataSourceSummaryDataModel { 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); @@ -56,6 +60,15 @@ public class RecentFilesSummary { private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.getDefault()); + private static final Set ARTIFACT_UPDATE_TYPE_IDS = new HashSet<>(Arrays.asList( + ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID(), + ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID(), + ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getTypeID(), + ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID(), + ARTIFACT_TYPE.TSK_MESSAGE.getTypeID() + )); + + private final SleuthkitCaseProvider provider; /** @@ -78,6 +91,13 @@ public class RecentFilesSummary { this.provider = provider; } + @Override + public Set getArtifactIdUpdates() { + return ARTIFACT_UPDATE_TYPE_IDS; + } + + + /** * Return a list of the most recently opened documents based on the * TSK_RECENT_OBJECT artifact. diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceTopProgramsSummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TopProgramsSummary.java similarity index 84% rename from Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceTopProgramsSummary.java rename to Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TopProgramsSummary.java index 495f706f0b..9548c805a5 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceTopProgramsSummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/TopProgramsSummary.java @@ -19,28 +19,33 @@ package org.sleuthkit.autopsy.datasourcesummary.datamodel; import java.io.File; +import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.function.Function; -import java.util.logging.Level; import java.util.stream.Collectors; import org.apache.commons.lang.StringUtils; -import org.sleuthkit.autopsy.coreutils.Logger; -import static org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceInfoUtilities.getBaseQueryResult; +import org.sleuthkit.autopsy.datasourcesummary.datamodel.SleuthkitCaseProvider.SleuthkitCaseProviderException; import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.DataSource; +import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.TskCoreException; /** * Provides information to populate Top Programs Summary queries. */ -public class DataSourceTopProgramsSummary { - - private static final Logger logger = Logger.getLogger(DataSourceTopProgramsSummary.class.getName()); +public class TopProgramsSummary implements DataSourceSummaryDataModel { + private static final Set ARTIFACT_UPDATE_TYPE_IDS = new HashSet<>(Arrays.asList( + ARTIFACT_TYPE.TSK_PROG_RUN.getTypeID() + )); /** * A SQL join type. @@ -95,7 +100,7 @@ public class DataSourceTopProgramsSummary { return null; } ); - + /** * Creates a sql statement querying the blackboard attributes table for a * particular attribute type and returning a specified value. That query @@ -168,18 +173,22 @@ public class DataSourceTopProgramsSummary { private static String getLikeClause(String column, String likeString, boolean isLike) { return column + (isLike ? "" : " NOT") + " LIKE '" + likeString + "'"; } - - + private final SleuthkitCaseProvider provider; - - public DataSourceTopProgramsSummary() { + + public TopProgramsSummary() { this(SleuthkitCaseProvider.DEFAULT); } - - public DataSourceTopProgramsSummary(SleuthkitCaseProvider provider) { + + public TopProgramsSummary(SleuthkitCaseProvider provider) { this.provider = provider; } + @Override + public Set getArtifactIdUpdates() { + return ARTIFACT_UPDATE_TYPE_IDS; + } + /** * Retrieves a list of the top programs used on the data source. Currently * determines this based off of which prefetch results return the highest @@ -188,9 +197,14 @@ public class DataSourceTopProgramsSummary { * @param dataSource The data source. * @param count The number of programs to return. * - * @return + * @return The top results objects found. + * + * @throws SleuthkitCaseProviderException + * @throws TskCoreException + * @throws SQLException */ - public List getTopPrograms(DataSource dataSource, int count) { + public List getTopPrograms(DataSource dataSource, int count) + throws SleuthkitCaseProviderException, TskCoreException, SQLException { if (dataSource == null || count <= 0) { return Collections.emptyList(); } @@ -231,44 +245,40 @@ public class DataSourceTopProgramsSummary { + " MAX(" + getFullKey(lastRunParam) + ") DESC,\n" + " " + getFullKey(nameParam) + " ASC"; - final String errorMessage = "Unable to get top program results; returning null."; - DataSourceInfoUtilities.ResultSetHandler> handler = (resultSet) -> { List progResults = new ArrayList<>(); boolean quitAtCount = false; while (resultSet.next() && (!quitAtCount || progResults.size() < count)) { - try { - long lastRunEpoch = resultSet.getLong(lastRunParam); - Date lastRun = (resultSet.wasNull()) ? null : new Date(lastRunEpoch * 1000); + long lastRunEpoch = resultSet.getLong(lastRunParam); + Date lastRun = (resultSet.wasNull()) ? null : new Date(lastRunEpoch * 1000); - Long runCount = resultSet.getLong(runCountParam); - if (resultSet.wasNull()) { - runCount = null; - } - - if (lastRun != null || runCount != null) { - quitAtCount = true; - } - - progResults.add(new TopProgramsResult( - resultSet.getString(nameParam), - resultSet.getString(pathParam), - runCount, - lastRun)); - - } catch (SQLException ex) { - logger.log(Level.WARNING, "Failed to get a top program result from the result set.", ex); + Long runCount = resultSet.getLong(runCountParam); + if (resultSet.wasNull()) { + runCount = null; } + + if (lastRun != null || runCount != null) { + quitAtCount = true; + } + + progResults.add(new TopProgramsResult( + resultSet.getString(nameParam), + resultSet.getString(pathParam), + runCount, + lastRun)); } return progResults; }; - return getBaseQueryResult(provider, query, handler, errorMessage); + try (SleuthkitCase.CaseDbQuery dbQuery = provider.get().executeQuery(query)) { + ResultSet resultSet = dbQuery.getResultSet(); + return handler.process(resultSet); + } } - + /** * Determines a short folder name if any. Otherwise, returns empty string. diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceUserActivitySummary.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummary.java similarity index 96% rename from Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceUserActivitySummary.java rename to Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummary.java index 1ae108c496..1e840d99cc 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceUserActivitySummary.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummary.java @@ -18,10 +18,13 @@ */ package org.sleuthkit.autopsy.datasourcesummary.datamodel; +import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -44,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 DataSourceUserActivitySummary { +public class UserActivitySummary implements DataSourceSummaryDataModel { private static final BlackboardArtifact.Type TYPE_DEVICE_ATTACHED = new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_DEVICE_ATTACHED); @@ -65,6 +68,16 @@ public class DataSourceUserActivitySummary { private static final Comparator TOP_WEBSEARCH_RESULT_DATE_COMPARE = (a, b) -> a.getDateAccessed().compareTo(b.getDateAccessed()); private static final String ROOT_HUB_IDENTIFIER = "ROOT_HUB"; + private static final Set ARTIFACT_UPDATE_TYPE_IDS = new HashSet<>(Arrays.asList( + ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID(), + + ARTIFACT_TYPE.TSK_MESSAGE.getTypeID(), + ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID(), + ARTIFACT_TYPE.TSK_CALLLOG.getTypeID(), + + ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID() + )); + private static final long SLEEP_TIME = 5000; /** @@ -106,9 +119,9 @@ public class DataSourceUserActivitySummary { /** * Main constructor. */ - public DataSourceUserActivitySummary() { + public UserActivitySummary() { this(SleuthkitCaseProvider.DEFAULT, TextTranslationService.getInstance(), - org.sleuthkit.autopsy.coreutils.Logger.getLogger(DataSourceUserActivitySummary.class.getName())); + org.sleuthkit.autopsy.coreutils.Logger.getLogger(UserActivitySummary.class.getName())); } /** @@ -120,7 +133,7 @@ public class DataSourceUserActivitySummary { * @param translationService The translation service. * @param logger The logger to use. */ - public DataSourceUserActivitySummary( + public UserActivitySummary( SleuthkitCaseProvider provider, TextTranslationService translationService, java.util.logging.Logger logger) { @@ -129,6 +142,11 @@ public class DataSourceUserActivitySummary { this.translationService = translationService; this.logger = logger; } + + @Override + public Set getArtifactIdUpdates() { + return ARTIFACT_UPDATE_TYPE_IDS; + } /** * Throws an IllegalArgumentException if count <= 0. @@ -183,7 +201,7 @@ public class DataSourceUserActivitySummary { Collection> resultGroups = webSearchArtifacts .stream() // get items where search string and date is not null - .map(DataSourceUserActivitySummary::getWebSearchResult) + .map(UserActivitySummary::getWebSearchResult) // remove null records .filter(result -> result != null) // get these messages grouped by search to string diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/AnalysisPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/AnalysisPanel.java index d32624ceb2..a489302b80 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/AnalysisPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/AnalysisPanel.java @@ -22,7 +22,7 @@ import java.util.Arrays; import java.util.List; import org.apache.commons.lang3.tuple.Pair; import org.openide.util.NbBundle.Messages; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceAnalysisSummary; +import org.sleuthkit.autopsy.datasourcesummary.datamodel.AnalysisSummary; import org.sleuthkit.autopsy.datasourcesummary.uiutils.CellModelTableCellRenderer.DefaultCellModel; import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker; import org.sleuthkit.autopsy.datasourcesummary.uiutils.JTablePanel; @@ -79,10 +79,12 @@ public class AnalysisPanel extends BaseDataSourceSummaryPanel { * Creates a new DataSourceUserActivityPanel. */ public AnalysisPanel() { - this(new DataSourceAnalysisSummary()); + this(new AnalysisSummary()); } - public AnalysisPanel(DataSourceAnalysisSummary analysisData) { + public AnalysisPanel(AnalysisSummary analysisData) { + super(analysisData); + // set up data acquisition methods dataFetchComponents = Arrays.asList( // hashset hits loading components @@ -101,6 +103,16 @@ public class AnalysisPanel extends BaseDataSourceSummaryPanel { initComponents(); } + + @Override + protected void fetchInformation(DataSource dataSource) { + fetchInformation(dataFetchComponents, dataSource); + } + + @Override + protected void onNewDataSource(DataSource dataSource) { + onNewDataSource(dataFetchComponents, tables, dataSource); + } /** * This method is called from within the constructor to initialize the form. @@ -178,6 +190,7 @@ public class AnalysisPanel extends BaseDataSourceSummaryPanel { ); }// //GEN-END:initComponents + // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java index 79cba5d173..84e7be1788 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/BaseDataSourceSummaryPanel.java @@ -20,15 +20,17 @@ package org.sleuthkit.autopsy.datasourcesummary.ui; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.ArrayList; -import java.util.Collections; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; +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; @@ -49,8 +51,6 @@ abstract class BaseDataSourceSummaryPanel extends JPanel { private final SwingWorkerSequentialExecutor executor = new SwingWorkerSequentialExecutor(); - - private final RefreshThrottler refreshThrottler = new RefreshThrottler(new RefreshThrottler.Refresher() { @Override public void refresh() { @@ -88,15 +88,26 @@ abstract class BaseDataSourceSummaryPanel extends JPanel { private final boolean refreshOnNewContent; private DataSource dataSource; - - /** - * Main constructor - */ + + private static Set getUnionSet(Function> mapper, I... items) { + return Stream.of(items) + .flatMap((item) -> mapper.apply(item).stream()) + .collect(Collectors.toSet()); + } + + protected BaseDataSourceSummaryPanel(DataSourceSummaryDataModel...dataModels) { + this( + getUnionSet(DataSourceSummaryDataModel::getCaseEventUpdates, dataModels), + getUnionSet(DataSourceSummaryDataModel::getArtifactIdUpdates, dataModels), + Stream.of(dataModels).anyMatch(DataSourceSummaryDataModel::shouldRefreshOnNewContent) + ); + } + protected BaseDataSourceSummaryPanel(Set caseEvents, Set artifactTypesForRefresh, boolean refreshOnNewContent) { this.artifactTypesForRefresh = (artifactTypesForRefresh == null) ? new HashSet<>() : new HashSet<>(artifactTypesForRefresh); - + this.refreshOnNewContent = refreshOnNewContent; if (refreshOnNewContent || this.artifactTypesForRefresh.size() > 0) { @@ -162,11 +173,7 @@ abstract class BaseDataSourceSummaryPanel extends JPanel { * @param dataSource The datasource to fetch information about. */ protected abstract void fetchInformation(DataSource dataSource); - - - - - + protected void fetchInformation(List> dataFetchComponents, DataSource dataSource) { // create swing workers to run for each loadable item List> workers = dataFetchComponents @@ -179,17 +186,18 @@ abstract class BaseDataSourceSummaryPanel extends JPanel { submit(workers); } } - + /** * When a new dataSource is added, this method is called. * * @param dataSource The new dataSource. */ protected abstract void onNewDataSource(DataSource dataSource); - - - protected void onNewDataSource(List> dataFetchComponents, List> loadableComponents, DataSource dataSource) { + protected void onNewDataSource( + List> dataFetchComponents, + List> loadableComponents, + DataSource dataSource) { // if no data source is present or the case is not open, // set results for tables to null. if (dataSource == null || !Case.isCaseOpen()) { diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties index c099f7e206..56c3d4e37b 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties @@ -28,11 +28,11 @@ DataSourceSummaryDetailsPanel.acquisitionDetailsTextArea.text= DataSourceSummaryDetailsPanel.acquisitionDetailsLabel.text=Acquisition Details: DataSourceSummaryDetailsPanel.unallocatedSizeLabel.text=Unallocated Space: DataSourceSummaryDetailsPanel.unallocatedSizeValue.text= -DataSourceSummaryUserActivityPanel.programsRunLabel.text=Recent Programs -DataSourceSummaryUserActivityPanel.recentAccountsLabel.text=Recent Accounts -DataSourceSummaryUserActivityPanel.topWebSearchLabel.text=Recent Web Searches -DataSourceSummaryUserActivityPanel.topDevicesAttachedLabel.text=Recent Devices Attached -DataSourceSummaryUserActivityPanel.recentDomainsLabel.text=Recent Domains +UserActivityPanel.programsRunLabel.text=Recent Programs +UserActivityPanel.recentAccountsLabel.text=Recent Accounts +UserActivityPanel.topWebSearchLabel.text=Recent Web Searches +UserActivityPanel.topDevicesAttachedLabel.text=Recent Devices Attached +UserActivityPanel.recentDomainsLabel.text=Recent Domains AnalysisPanel.hashsetHitsLabel.text=Hashset Hits AnalysisPanel.keywordHitsLabel.text=Keyword Hits AnalysisPanel.interestingItemLabel.text=Interesting Item Hits diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED index 8c6a5cdce4..0aed97f9fa 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties-MERGED @@ -47,31 +47,31 @@ DataSourceSummaryTabbedPane_ingestHistoryTab_title=Ingest History DataSourceSummaryTabbedPane_recentFileTab_title=Recent Files DataSourceSummaryTabbedPane_typesTab_title=Types DataSourceSummaryTabbedPane_userActivityTab_title=User Activity -DataSourceSummaryUserActivityPanel.programsRunLabel.text=Recent Programs -DataSourceSummaryUserActivityPanel.recentAccountsLabel.text=Recent Accounts -DataSourceSummaryUserActivityPanel.topWebSearchLabel.text=Recent Web Searches -DataSourceSummaryUserActivityPanel.topDevicesAttachedLabel.text=Recent Devices Attached -DataSourceSummaryUserActivityPanel.recentDomainsLabel.text=Recent Domains +UserActivityPanel.programsRunLabel.text=Recent Programs +UserActivityPanel.recentAccountsLabel.text=Recent Accounts +UserActivityPanel.topWebSearchLabel.text=Recent Web Searches +UserActivityPanel.topDevicesAttachedLabel.text=Recent Devices Attached +UserActivityPanel.recentDomainsLabel.text=Recent Domains AnalysisPanel.hashsetHitsLabel.text=Hashset Hits AnalysisPanel.keywordHitsLabel.text=Keyword Hits AnalysisPanel.interestingItemLabel.text=Interesting Item Hits -DataSourceSummaryUserActivityPanel_noDataExists=No communication data exists -DataSourceSummaryUserActivityPanel_tab_title=User Activity -DataSourceSummaryUserActivityPanel_TopAccountTableModel_accountType_header=Account Type -DataSourceSummaryUserActivityPanel_TopAccountTableModel_lastAccess_header=Last Accessed -DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header=Last Accessed -DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_deviceId_header=Device Id -DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_makeModel_header=Make and Model -DataSourceSummaryUserActivityPanel_TopDomainsTableModel_domain_header=Domain -DataSourceSummaryUserActivityPanel_TopDomainsTableModel_lastAccess_header=Last Access -DataSourceSummaryUserActivityPanel_TopDomainsTableModel_url_header=URL -DataSourceSummaryUserActivityPanel_TopProgramsTableModel_count_header=Run Times -DataSourceSummaryUserActivityPanel_TopProgramsTableModel_folder_header=Folder -DataSourceSummaryUserActivityPanel_TopProgramsTableModel_lastrun_header=Last Run -DataSourceSummaryUserActivityPanel_TopProgramsTableModel_name_header=Program -DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_dateAccessed_header=Date Accessed -DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_searchString_header=Search String -DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_translatedResult_header=Translated +UserActivityPanel_noDataExists=No communication data exists +UserActivityPanel_tab_title=User Activity +UserActivityPanel_TopAccountTableModel_accountType_header=Account Type +UserActivityPanel_TopAccountTableModel_lastAccess_header=Last Accessed +UserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header=Last Accessed +UserActivityPanel_TopDeviceAttachedTableModel_deviceId_header=Device Id +UserActivityPanel_TopDeviceAttachedTableModel_makeModel_header=Make and Model +UserActivityPanel_TopDomainsTableModel_domain_header=Domain +UserActivityPanel_TopDomainsTableModel_lastAccess_header=Last Access +UserActivityPanel_TopDomainsTableModel_url_header=URL +UserActivityPanel_TopProgramsTableModel_count_header=Run Times +UserActivityPanel_TopProgramsTableModel_folder_header=Folder +UserActivityPanel_TopProgramsTableModel_lastrun_header=Last Run +UserActivityPanel_TopProgramsTableModel_name_header=Program +UserActivityPanel_TopWebSearchTableModel_dateAccessed_header=Date Accessed +UserActivityPanel_TopWebSearchTableModel_searchString_header=Search String +UserActivityPanel_TopWebSearchTableModel_translatedResult_header=Translated RecentFilePanel_col_header_domain=Domain RecentFilePanel_col_header_path=Path RecentFilePanel_col_header_sender=Sender diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java index e9ea21eca8..c6aee9b2f9 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryTabbedPane.java @@ -115,7 +115,7 @@ public class DataSourceSummaryTabbedPane extends JTabbedPane { private final List tabs = Arrays.asList( new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_typesTab_title(), new TypesPanel()), - new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_userActivityTab_title(), new DataSourceSummaryUserActivityPanel()), + new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_userActivityTab_title(), new UserActivityPanel()), new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_recentFileTab_title(), new RecentFilesPanel()), new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_analysisTab_title(), new AnalysisPanel()), new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_ingestHistoryTab_title(), ingestHistoryPanel, ingestHistoryPanel::setDataSource, () -> { diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryUserActivityPanel.form b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryUserActivityPanel.form deleted file mode 100644 index f24955084b..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryUserActivityPanel.form +++ /dev/null @@ -1,398 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryUserActivityPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryUserActivityPanel.java deleted file mode 100644 index 711a8e4ceb..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/DataSourceSummaryUserActivityPanel.java +++ /dev/null @@ -1,390 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2020 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.datasourcesummary.ui; - -import java.awt.Component; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import org.apache.commons.lang.StringUtils; -import org.openide.util.NbBundle.Messages; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceUserActivitySummary; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceTopProgramsSummary; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceUserActivitySummary.TopAccountResult; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceUserActivitySummary.TopDeviceAttachedResult; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceUserActivitySummary.TopWebSearchResult; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.TopDomainsResult; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.TopProgramsResult; -import org.sleuthkit.autopsy.datasourcesummary.uiutils.CellModelTableCellRenderer.DefaultCellModel; -import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents; -import org.sleuthkit.autopsy.datasourcesummary.uiutils.JTablePanel; -import org.sleuthkit.autopsy.datasourcesummary.uiutils.JTablePanel.ColumnModel; -import org.sleuthkit.datamodel.DataSource; - -/** - * A panel to display user activity. - */ -@Messages({ - "DataSourceSummaryUserActivityPanel_tab_title=User Activity", - "DataSourceSummaryUserActivityPanel_TopProgramsTableModel_name_header=Program", - "DataSourceSummaryUserActivityPanel_TopProgramsTableModel_folder_header=Folder", - "DataSourceSummaryUserActivityPanel_TopProgramsTableModel_count_header=Run Times", - "DataSourceSummaryUserActivityPanel_TopProgramsTableModel_lastrun_header=Last Run", - "DataSourceSummaryUserActivityPanel_TopDomainsTableModel_domain_header=Domain", - "DataSourceSummaryUserActivityPanel_TopDomainsTableModel_url_header=URL", - "DataSourceSummaryUserActivityPanel_TopDomainsTableModel_lastAccess_header=Last Access", - "DataSourceSummaryUserActivityPanel_noDataExists=No communication data exists", - "DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_searchString_header=Search String", - "DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_dateAccessed_header=Date Accessed", - "DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_translatedResult_header=Translated", - "DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_deviceId_header=Device Id", - "DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_makeModel_header=Make and Model", - "DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header=Last Accessed", - "DataSourceSummaryUserActivityPanel_TopAccountTableModel_accountType_header=Account Type", - "DataSourceSummaryUserActivityPanel_TopAccountTableModel_lastAccess_header=Last Accessed",}) -public class DataSourceSummaryUserActivityPanel extends BaseDataSourceSummaryPanel { - - private static final long serialVersionUID = 1L; - private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.getDefault()); - private static final int TOP_PROGS_COUNT = 10; - private static final int TOP_DOMAINS_COUNT = 10; - private static final int TOP_SEARCHES_COUNT = 10; - private static final int TOP_ACCOUNTS_COUNT = 5; - private static final int TOP_DEVICES_COUNT = 10; - - /** - * Gets a string formatted date or returns empty string if the date is null. - * - * @param date The date. - * - * @return The formatted date string or empty string if the date is null. - */ - private static String getFormatted(Date date) { - return date == null ? "" : DATETIME_FORMAT.format(date); - } - - // set up recent programs table - private final JTablePanel topProgramsTable = JTablePanel.getJTablePanel(Arrays.asList( - // program name column - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopProgramsTableModel_name_header(), - (prog) -> { - return new DefaultCellModel(prog.getProgramName()) - .setTooltip(prog.getProgramPath()); - }, - 250), - // program folder column - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopProgramsTableModel_folder_header(), - (prog) -> { - return new DefaultCellModel( - getShortFolderName( - prog.getProgramPath(), - prog.getProgramName())) - .setTooltip(prog.getProgramPath()); - }, - 150), - // run count column - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopProgramsTableModel_count_header(), - (prog) -> { - String runTimes = prog.getRunTimes() == null ? "" : Long.toString(prog.getRunTimes()); - return new DefaultCellModel(runTimes); - }, - 80), - // last run date column - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopProgramsTableModel_lastrun_header(), - (prog) -> new DefaultCellModel(getFormatted(prog.getLastRun())), - 150) - )); - - // set up recent domains table - private final JTablePanel recentDomainsTable = JTablePanel.getJTablePanel(Arrays.asList( - // domain column - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopDomainsTableModel_domain_header(), - (recentDomain) -> new DefaultCellModel(recentDomain.getDomain()), - 250), - // url column - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopDomainsTableModel_url_header(), - (recentDomain) -> new DefaultCellModel(recentDomain.getUrl()), - 250), - // last accessed column - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopDomainsTableModel_lastAccess_header(), - (recentDomain) -> new DefaultCellModel(getFormatted(recentDomain.getLastVisit())), - 150) - )); - - // top web searches table - private final JTablePanel topWebSearchesTable = JTablePanel.getJTablePanel(Arrays.asList( - // search string column - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_searchString_header(), - (webSearch) -> new DefaultCellModel(webSearch.getSearchString()), - 250 - ), - // last accessed - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_dateAccessed_header(), - (webSearch) -> new DefaultCellModel(getFormatted(webSearch.getDateAccessed())), - 150 - ), - // translated value - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_translatedResult_header(), - (webSearch) -> new DefaultCellModel(webSearch.getTranslatedResult()), - 250 - ) - )); - - // top devices attached table - private final JTablePanel topDevicesAttachedTable = JTablePanel.getJTablePanel(Arrays.asList( - // device id column - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_deviceId_header(), - (device) -> new DefaultCellModel(device.getDeviceId()), - 250 - ), - // last accessed - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header(), - (device) -> new DefaultCellModel(getFormatted(device.getDateAccessed())), - 150 - ), - // make and model - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_makeModel_header(), - (device) -> { - String make = StringUtils.isBlank(device.getDeviceMake()) ? "" : device.getDeviceMake().trim(); - String model = StringUtils.isBlank(device.getDeviceModel()) ? "" : device.getDeviceModel().trim(); - String makeModelString = (make.isEmpty() || model.isEmpty()) - ? make + model - : String.format("%s - %s", make, model); - return new DefaultCellModel(makeModelString); - }, - 250 - ) - )); - - // top accounts table - private final JTablePanel topAccountsTable = JTablePanel.getJTablePanel(Arrays.asList( - // account type column - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopAccountTableModel_accountType_header(), - (account) -> new DefaultCellModel(account.getAccountType()), - 250 - ), - // last accessed - new ColumnModel<>( - Bundle.DataSourceSummaryUserActivityPanel_TopAccountTableModel_lastAccess_header(), - (account) -> new DefaultCellModel(getFormatted(account.getLastAccess())), - 150 - ) - )); - - private final List> tables = Arrays.asList( - topProgramsTable, - recentDomainsTable, - topWebSearchesTable, - topDevicesAttachedTable, - topAccountsTable - ); - - private final List> dataFetchComponents; - private final DataSourceTopProgramsSummary topProgramsData; - - /** - * Creates a new DataSourceSummaryUserActivityPanel. - */ - public DataSourceSummaryUserActivityPanel() { - this(new DataSourceTopProgramsSummary(), new DataSourceUserActivitySummary()); - } - - /** - * Creates a new DataSourceSummaryUserActivityPanel. - * - * @param topProgramsData Class from which to obtain top programs data. - * @param userActivityData Class from which to obtain remaining user - * activity data. - */ - public DataSourceSummaryUserActivityPanel( - DataSourceTopProgramsSummary topProgramsData, - DataSourceUserActivitySummary userActivityData) { - - this.topProgramsData = topProgramsData; - - // set up data acquisition methods - this.dataFetchComponents = Arrays.asList( - // top programs query - new DataFetchComponents<>( - (dataSource) -> topProgramsData.getTopPrograms(dataSource, TOP_PROGS_COUNT), - (result) -> topProgramsTable.showDataFetchResult(result, JTablePanel.getDefaultErrorMessage(), - Bundle.DataSourceSummaryUserActivityPanel_noDataExists())), - // top domains query - new DataFetchComponents<>( - (dataSource) -> userActivityData.getRecentDomains(dataSource, TOP_DOMAINS_COUNT), - (result) -> recentDomainsTable.showDataFetchResult(result, JTablePanel.getDefaultErrorMessage(), - Bundle.DataSourceSummaryUserActivityPanel_noDataExists())), - // top web searches query - new DataFetchComponents<>( - (dataSource) -> userActivityData.getMostRecentWebSearches(dataSource, TOP_SEARCHES_COUNT), - (result) -> topWebSearchesTable.showDataFetchResult(result, JTablePanel.getDefaultErrorMessage(), - Bundle.DataSourceSummaryUserActivityPanel_noDataExists())), - // top devices query - new DataFetchComponents<>( - (dataSource) -> userActivityData.getRecentDevices(dataSource, TOP_DEVICES_COUNT), - (result) -> topDevicesAttachedTable.showDataFetchResult(result, JTablePanel.getDefaultErrorMessage(), - Bundle.DataSourceSummaryUserActivityPanel_noDataExists())), - // top accounts query - new DataFetchComponents<>( - (dataSource) -> userActivityData.getRecentAccounts(dataSource, TOP_ACCOUNTS_COUNT), - (result) -> topAccountsTable.showDataFetchResult(result, JTablePanel.getDefaultErrorMessage(), - Bundle.DataSourceSummaryUserActivityPanel_noDataExists())) - ); - - initComponents(); - } - - /** - * Queries DataSourceTopProgramsSummary instance for short folder name. - * - * @param path The path for the application. - * @param appName The application name. - * - * @return The underlying short folder name if one exists. - */ - private String getShortFolderName(String path, String appName) { - return this.topProgramsData.getShortFolderName(path, appName); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - javax.swing.JScrollPane contentScrollPane = new javax.swing.JScrollPane(); - javax.swing.JPanel contentPanel = new javax.swing.JPanel(); - javax.swing.JLabel programsRunLabel = new javax.swing.JLabel(); - javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2)); - javax.swing.JPanel topProgramsTablePanel = topProgramsTable; - javax.swing.Box.Filler filler3 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20)); - javax.swing.JLabel recentDomainsLabel = new javax.swing.JLabel(); - javax.swing.Box.Filler filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2)); - javax.swing.JPanel recentDomainsTablePanel = recentDomainsTable; - javax.swing.Box.Filler filler4 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20)); - javax.swing.JLabel topWebSearchLabel = new javax.swing.JLabel(); - javax.swing.Box.Filler filler5 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2)); - javax.swing.JPanel topWebSearches = topWebSearchesTable; - javax.swing.Box.Filler filler6 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20)); - javax.swing.JLabel topDevicesAttachedLabel = new javax.swing.JLabel(); - javax.swing.Box.Filler filler7 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2)); - javax.swing.JPanel recentDevicesAttached = topDevicesAttachedTable; - javax.swing.Box.Filler filler8 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20)); - javax.swing.JLabel recentAccountsLabel = new javax.swing.JLabel(); - javax.swing.Box.Filler filler9 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2)); - javax.swing.JPanel topAccounts = topAccountsTable; - - setLayout(new java.awt.BorderLayout()); - - contentScrollPane.setMaximumSize(null); - contentScrollPane.setMinimumSize(null); - - contentPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10)); - contentPanel.setMaximumSize(new java.awt.Dimension(32767, 450)); - contentPanel.setMinimumSize(new java.awt.Dimension(10, 450)); - contentPanel.setLayout(new javax.swing.BoxLayout(contentPanel, javax.swing.BoxLayout.PAGE_AXIS)); - - programsRunLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - org.openide.awt.Mnemonics.setLocalizedText(programsRunLabel, org.openide.util.NbBundle.getMessage(DataSourceSummaryUserActivityPanel.class, "DataSourceSummaryUserActivityPanel.programsRunLabel.text")); // NOI18N - programsRunLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - contentPanel.add(programsRunLabel); - contentPanel.add(filler1); - - topProgramsTablePanel.setAlignmentX(0.0F); - topProgramsTablePanel.setMaximumSize(new java.awt.Dimension(32767, 106)); - topProgramsTablePanel.setMinimumSize(new java.awt.Dimension(10, 106)); - topProgramsTablePanel.setPreferredSize(new java.awt.Dimension(10, 106)); - contentPanel.add(topProgramsTablePanel); - contentPanel.add(filler3); - - recentDomainsLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - org.openide.awt.Mnemonics.setLocalizedText(recentDomainsLabel, org.openide.util.NbBundle.getMessage(DataSourceSummaryUserActivityPanel.class, "DataSourceSummaryUserActivityPanel.recentDomainsLabel.text")); // NOI18N - contentPanel.add(recentDomainsLabel); - contentPanel.add(filler2); - - recentDomainsTablePanel.setAlignmentX(0.0F); - recentDomainsTablePanel.setMaximumSize(new java.awt.Dimension(32767, 106)); - recentDomainsTablePanel.setMinimumSize(new java.awt.Dimension(10, 106)); - recentDomainsTablePanel.setPreferredSize(new java.awt.Dimension(10, 106)); - contentPanel.add(recentDomainsTablePanel); - contentPanel.add(filler4); - - topWebSearchLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - org.openide.awt.Mnemonics.setLocalizedText(topWebSearchLabel, org.openide.util.NbBundle.getMessage(DataSourceSummaryUserActivityPanel.class, "DataSourceSummaryUserActivityPanel.topWebSearchLabel.text")); // NOI18N - contentPanel.add(topWebSearchLabel); - contentPanel.add(filler5); - - topWebSearches.setAlignmentX(0.0F); - topWebSearches.setMaximumSize(new java.awt.Dimension(32767, 106)); - topWebSearches.setMinimumSize(new java.awt.Dimension(10, 106)); - topWebSearches.setPreferredSize(new java.awt.Dimension(10, 106)); - contentPanel.add(topWebSearches); - contentPanel.add(filler6); - - topDevicesAttachedLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - org.openide.awt.Mnemonics.setLocalizedText(topDevicesAttachedLabel, org.openide.util.NbBundle.getMessage(DataSourceSummaryUserActivityPanel.class, "DataSourceSummaryUserActivityPanel.topDevicesAttachedLabel.text")); // NOI18N - contentPanel.add(topDevicesAttachedLabel); - contentPanel.add(filler7); - - recentDevicesAttached.setAlignmentX(0.0F); - recentDevicesAttached.setMaximumSize(new java.awt.Dimension(32767, 106)); - recentDevicesAttached.setMinimumSize(new java.awt.Dimension(10, 106)); - recentDevicesAttached.setPreferredSize(new java.awt.Dimension(10, 106)); - contentPanel.add(recentDevicesAttached); - contentPanel.add(filler8); - - recentAccountsLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - org.openide.awt.Mnemonics.setLocalizedText(recentAccountsLabel, org.openide.util.NbBundle.getMessage(DataSourceSummaryUserActivityPanel.class, "DataSourceSummaryUserActivityPanel.recentAccountsLabel.text")); // NOI18N - contentPanel.add(recentAccountsLabel); - contentPanel.add(filler9); - - topAccounts.setAlignmentX(0.0F); - topAccounts.setMaximumSize(new java.awt.Dimension(32767, 106)); - topAccounts.setMinimumSize(new java.awt.Dimension(10, 106)); - topAccounts.setPreferredSize(new java.awt.Dimension(10, 106)); - contentPanel.add(topAccounts); - - contentScrollPane.setViewportView(contentPanel); - - add(contentScrollPane, java.awt.BorderLayout.CENTER); - }// //GEN-END:initComponents - - // Variables declaration - do not modify//GEN-BEGIN:variables - // End of variables declaration//GEN-END:variables -} diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/RecentFilesPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/RecentFilesPanel.java index 831788f7c0..a7a46667a6 100755 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/RecentFilesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/RecentFilesPanel.java @@ -63,11 +63,23 @@ public final class RecentFilesPanel extends BaseDataSourceSummaryPanel { * Creates new form RecentFilesPanel */ public RecentFilesPanel(RecentFilesSummary dataHandler) { + super(dataHandler); this.dataHandler = dataHandler; initComponents(); initalizeTables(); } + + @Override + protected void fetchInformation(DataSource dataSource) { + fetchInformation(dataFetchComponents, dataSource); + } + + @Override + protected void onNewDataSource(DataSource dataSource) { + onNewDataSource(dataFetchComponents, tablePanelList, dataSource); + } + /** * Setup the data model and columns for the panel tables. @@ -271,5 +283,4 @@ public final class RecentFilesPanel extends BaseDataSourceSummaryPanel { private javax.swing.JPanel downloadsPane; private javax.swing.JPanel openedDocPane; // End of variables declaration//GEN-END:variables - } diff --git a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java index a6e0105b95..fa90c9b809 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/datasourcesummary/ui/TypesPanel.java @@ -29,7 +29,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.FileTypeUtils.FileTypeCategory; -import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceCountsSummary; +import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceTypesSummary; import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceDetailsSummary; import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceMimeTypeSummary; import org.sleuthkit.autopsy.datasourcesummary.uiutils.AbstractLoadableComponent; @@ -143,8 +143,7 @@ class TypesPanel extends BaseDataSourceSummaryPanel { ); // all of the means for obtaining data for the gui components. - private final List> dataFetchComponents = Arrays.asList( - // usage label worker + private final List> dataFetchComponents = Arrays.asList(// usage label worker new DataFetchWorker.DataFetchComponents<>( DataSourceDetailsSummary::getDataSourceType, usageLabel::showDataFetchResult), @@ -165,19 +164,19 @@ class TypesPanel extends BaseDataSourceSummaryPanel { fileMimeTypesChart::showDataFetchResult), // allocated files worker new DataFetchWorker.DataFetchComponents<>( - (dataSource) -> getStringOrZero(DataSourceCountsSummary.getCountOfAllocatedFiles(dataSource)), + (dataSource) -> getStringOrZero(DataSourceTypesSummary.getCountOfAllocatedFiles(dataSource)), allocatedLabel::showDataFetchResult), // unallocated files worker new DataFetchWorker.DataFetchComponents<>( - (dataSource) -> getStringOrZero(DataSourceCountsSummary.getCountOfUnallocatedFiles(dataSource)), + (dataSource) -> getStringOrZero(DataSourceTypesSummary.getCountOfUnallocatedFiles(dataSource)), unallocatedLabel::showDataFetchResult), // slack files worker new DataFetchWorker.DataFetchComponents<>( - (dataSource) -> getStringOrZero(DataSourceCountsSummary.getCountOfSlackFiles(dataSource)), + (dataSource) -> getStringOrZero(DataSourceTypesSummary.getCountOfSlackFiles(dataSource)), slackLabel::showDataFetchResult), // directories worker new DataFetchWorker.DataFetchComponents<>( - (dataSource) -> getStringOrZero(DataSourceCountsSummary.getCountOfDirectories(dataSource)), + (dataSource) -> getStringOrZero(DataSourceTypesSummary.getCountOfDirectories(dataSource)), directoriesLabel::showDataFetchResult) ); @@ -186,8 +185,6 @@ class TypesPanel extends BaseDataSourceSummaryPanel { */ public TypesPanel() { initComponents(); - setDataFetchComponents(this.dataFetchComponents); - setLoadableComponents(this.loadables); } diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED index 823399e0d0..56a675e256 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED @@ -205,9 +205,7 @@ DeleteCaseTask.progress.parsingManifest=Parsing manifest file {0}... DeleteCaseTask.progress.releasingManifestLock=Releasing lock on the manifest file {0}... DeleteCaseTask.progress.startMessage=Starting deletion... DeleteOrphanCaseNodesAction.progressDisplayName=Cleanup Case Znodes -# {0} - item count DeleteOrphanCaseNodesDialog.additionalInit.lblNodeCount.text=Znodes found: {0} -# {0} - item count DeleteOrphanCaseNodesDialog.additionalInit.znodesTextArea.countMessage=ZNODES FOUND: {0} DeleteOrphanCaseNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service # {0} - node path