19 package org.sleuthkit.autopsy.datasourcesummary.ui;
21 import java.awt.Component;
22 import java.text.DateFormat;
23 import java.text.SimpleDateFormat;
24 import java.util.Arrays;
25 import java.util.Date;
26 import java.util.List;
27 import java.util.Locale;
28 import java.util.function.Function;
29 import java.util.stream.Collectors;
30 import java.util.stream.Stream;
31 import org.apache.commons.lang.StringUtils;
32 import org.openide.util.NbBundle.Messages;
55 "UserActivityPanel_tab_title=User Activity",
56 "UserActivityPanel_TopProgramsTableModel_tabName=Recent Programs",
57 "UserActivityPanel_TopDomainsTableModel_tabName=Recent Domains",
58 "UserActivityPanel_TopWebSearchTableModel_tabName=Recent Web Searches",
59 "UserActivityPanel_TopDeviceAttachedTableModel_tabName=Recent Devices Attached",
60 "UserActivityPanel_TopAccountTableModel_tabName=Recent Account Types Used",
61 "UserActivityPanel_TopProgramsTableModel_name_header=Program",
62 "UserActivityPanel_TopProgramsTableModel_folder_header=Folder",
63 "UserActivityPanel_TopProgramsTableModel_count_header=Run Times",
64 "UserActivityPanel_TopProgramsTableModel_lastrun_header=Last Run",
65 "UserActivityPanel_TopDomainsTableModel_domain_header=Domain",
66 "UserActivityPanel_TopDomainsTableModel_count_header=Visits",
67 "UserActivityPanel_TopDomainsTableModel_lastAccess_header=Last Accessed",
68 "UserActivityPanel_TopWebSearchTableModel_searchString_header=Search String",
69 "UserActivityPanel_TopWebSearchTableModel_dateAccessed_header=Date Accessed",
70 "UserActivityPanel_TopWebSearchTableModel_translatedResult_header=Translated",
71 "UserActivityPanel_TopDeviceAttachedTableModel_deviceId_header=Device Id",
72 "UserActivityPanel_TopDeviceAttachedTableModel_makeModel_header=Make and Model",
73 "UserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header=Last Accessed",
74 "UserActivityPanel_TopAccountTableModel_accountType_header=Account Type",
75 "UserActivityPanel_TopAccountTableModel_lastAccess_header=Last Accessed",
76 "UserActivityPanel_noDataExists=No communication data exists"})
79 private static final long serialVersionUID = 1L;
80 private static final String DATETIME_FORMAT_STR =
"yyyy/MM/dd HH:mm:ss";
81 private static final DateFormat DATETIME_FORMAT =
new SimpleDateFormat(DATETIME_FORMAT_STR, Locale.getDefault());
82 private static final int TOP_PROGS_COUNT = 10;
83 private static final int TOP_DOMAINS_COUNT = 10;
84 private static final int TOP_SEARCHES_COUNT = 10;
85 private static final int TOP_ACCOUNTS_COUNT = 5;
86 private static final int TOP_DEVICES_COUNT = 10;
89 private final List<ColumnModel<TopProgramsResult, DefaultCellModel<?>>> topProgramsTemplate = Arrays.asList(
92 Bundle.UserActivityPanel_TopProgramsTableModel_name_header(),
95 .setTooltip(prog.getProgramPath())
96 .setPopupMenu(getPopup(prog));
101 Bundle.UserActivityPanel_TopProgramsTableModel_folder_header(),
105 prog.getProgramPath(),
106 prog.getProgramName()))
108 .setPopupMenu(getPopup(prog));
113 Bundle.UserActivityPanel_TopProgramsTableModel_count_header(),
115 return new DefaultCellModel<>(prog.getRunTimes(), (num) -> num == null ?
"" : num.toString())
116 .setPopupMenu(getPopup(prog));
121 Bundle.UserActivityPanel_TopProgramsTableModel_lastrun_header(),
127 private final List<ColumnModel<TopDomainsResult, DefaultCellModel<?>>> topDomainsTemplate = Arrays.asList(
130 Bundle.UserActivityPanel_TopDomainsTableModel_domain_header(),
133 .setPopupMenu(getPopup(recentDomain));
138 Bundle.UserActivityPanel_TopDomainsTableModel_count_header(),
140 return new DefaultCellModel<>(recentDomain.getVisitTimes(), (num) -> num == null ?
"" : num.toString())
141 .setPopupMenu(getPopup(recentDomain));
146 Bundle.UserActivityPanel_TopDomainsTableModel_lastAccess_header(),
152 private final List<ColumnModel<TopWebSearchResult, DefaultCellModel<?>>> topWebSearchesTemplate = Arrays.asList(
155 Bundle.UserActivityPanel_TopWebSearchTableModel_searchString_header(),
158 .setPopupMenu(getPopup(webSearch));
164 Bundle.UserActivityPanel_TopWebSearchTableModel_dateAccessed_header(),
170 Bundle.UserActivityPanel_TopWebSearchTableModel_translatedResult_header(),
173 .setPopupMenu(getPopup(webSearch));
180 private final List<ColumnModel<TopDeviceAttachedResult, DefaultCellModel<?>>> topDevicesTemplate = Arrays.asList(
183 Bundle.UserActivityPanel_TopDeviceAttachedTableModel_deviceId_header(),
186 .setPopupMenu(getPopup(device));
192 Bundle.UserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header(),
198 Bundle.UserActivityPanel_TopDeviceAttachedTableModel_makeModel_header(),
200 String make = StringUtils.isBlank(device.getDeviceMake()) ?
"" : device.getDeviceMake().trim();
201 String model = StringUtils.isBlank(device.getDeviceModel()) ?
"" : device.getDeviceModel().trim();
202 String makeModelString = (make.isEmpty() || model.isEmpty())
204 : String.format(
"%s - %s", make, model);
206 .setPopupMenu(getPopup(device));
213 private final List<ColumnModel<TopAccountResult, DefaultCellModel<?>>> topAccountsTemplate = Arrays.asList(
216 Bundle.UserActivityPanel_TopAccountTableModel_accountType_header(),
219 .setPopupMenu(getPopup(account));
225 Bundle.UserActivityPanel_TopAccountTableModel_lastAccess_header(),
233 .setKeyFunction((prog) -> prog.getProgramPath() +
":" + prog.getProgramName());
237 .setKeyFunction((domain) -> domain.getDomain());
241 .setKeyFunction((query) -> query.getSearchString());
245 .setKeyFunction((topDevice) -> topDevice.getDeviceId());
249 .setKeyFunction((topAccount) -> topAccount.getAccountType());
257 private final List<JTablePanel<?>> tables = Arrays.asList(
261 topDevicesAttachedTable,
284 super(userActivityData);
285 this.userActivityData = userActivityData;
287 this.topProgramsFetcher = (dataSource) -> userActivityData.
getTopPrograms(dataSource, TOP_PROGS_COUNT);
288 this.topDomainsFetcher = (dataSource) -> userActivityData.
getRecentDomains(dataSource, TOP_DOMAINS_COUNT);
289 this.topWebSearchesFetcher = (dataSource) -> userActivityData.
getMostRecentWebSearches(dataSource, TOP_SEARCHES_COUNT);
290 this.topDevicesAttachedFetcher = (dataSource) -> userActivityData.
getRecentDevices(dataSource, TOP_DEVICES_COUNT);
291 this.topAccountsFetcher = (dataSource) -> userActivityData.
getRecentAccounts(dataSource, TOP_ACCOUNTS_COUNT);
294 this.dataFetchComponents = Arrays.asList(
305 topWebSearchesFetcher,
309 topDevicesAttachedFetcher,
320 private <T extends LastAccessedArtifact> Function<T, DefaultCellModel<?>> getDateFunct() {
321 return (T lastAccessed) -> {
322 Function<Date, String> dateParser = (dt) -> dt == null ?
"" : DATETIME_FORMAT.format(dt);
323 return new DefaultCellModel<>(lastAccessed.getLastAccessed(), dateParser, DATETIME_FORMAT_STR)
324 .setPopupMenu(getPopup(lastAccessed));
338 return record == null ? null : Arrays.asList(getArtifactNavigateItem(record.
getArtifact()));
355 fetchInformation(dataFetchComponents, dataSource);
360 onNewDataSource(dataFetchComponents, tables, dataSource);
372 getTableExport(topProgramsFetcher, topProgramsTemplate, Bundle.UserActivityPanel_TopProgramsTableModel_tabName(), dataSource),
373 getTableExport(topDomainsFetcher, topDomainsTemplate, Bundle.UserActivityPanel_TopDomainsTableModel_tabName(), dataSource),
374 getTableExport(topWebSearchesFetcher, topWebSearchesTemplate, Bundle.UserActivityPanel_TopWebSearchTableModel_tabName(), dataSource),
375 getTableExport(topDevicesAttachedFetcher, topDevicesTemplate, Bundle.UserActivityPanel_TopDeviceAttachedTableModel_tabName(), dataSource),
376 getTableExport(topAccountsFetcher, topAccountsTemplate, Bundle.UserActivityPanel_TopAccountTableModel_tabName(), dataSource))
377 .filter(sheet -> sheet != null)
378 .collect(Collectors.toList());
386 @SuppressWarnings(
"unchecked")
388 private
void initComponents() {
390 javax.swing.JScrollPane contentScrollPane =
new javax.swing.JScrollPane();
391 javax.swing.JPanel contentPanel =
new javax.swing.JPanel();
392 javax.swing.JPanel ingestRunningPanel = ingestRunningLabel;
393 javax.swing.JLabel programsRunLabel =
new javax.swing.JLabel();
394 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));
395 javax.swing.JPanel topProgramsTablePanel = topProgramsTable;
396 javax.swing.JLabel rightClickForMoreOptions1 =
new javax.swing.JLabel();
397 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));
398 javax.swing.JLabel recentDomainsLabel =
new javax.swing.JLabel();
399 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));
400 javax.swing.JPanel recentDomainsTablePanel = recentDomainsTable;
401 javax.swing.JLabel rightClickForMoreOptions2 =
new javax.swing.JLabel();
402 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));
403 javax.swing.JLabel topWebSearchLabel =
new javax.swing.JLabel();
404 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));
405 javax.swing.JPanel topWebSearches = topWebSearchesTable;
406 javax.swing.JLabel rightClickForMoreOptions3 =
new javax.swing.JLabel();
407 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));
408 javax.swing.JLabel topDevicesAttachedLabel =
new javax.swing.JLabel();
409 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));
410 javax.swing.JPanel recentDevicesAttached = topDevicesAttachedTable;
411 javax.swing.JLabel rightClickForMoreOptions4 =
new javax.swing.JLabel();
412 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));
413 javax.swing.JLabel recentAccountsLabel =
new javax.swing.JLabel();
414 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));
415 javax.swing.JPanel topAccounts = topAccountsTable;
416 javax.swing.JLabel rightClickForMoreOptions5 =
new javax.swing.JLabel();
418 setLayout(
new java.awt.BorderLayout());
420 contentScrollPane.setMaximumSize(null);
421 contentScrollPane.setMinimumSize(null);
423 contentPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
424 contentPanel.setMaximumSize(
new java.awt.Dimension(32767, 450));
425 contentPanel.setMinimumSize(
new java.awt.Dimension(10, 450));
426 contentPanel.setLayout(
new javax.swing.BoxLayout(contentPanel, javax.swing.BoxLayout.PAGE_AXIS));
428 ingestRunningPanel.setAlignmentX(0.0F);
429 ingestRunningPanel.setMaximumSize(
new java.awt.Dimension(32767, 25));
430 ingestRunningPanel.setMinimumSize(
new java.awt.Dimension(10, 25));
431 ingestRunningPanel.setPreferredSize(
new java.awt.Dimension(10, 25));
432 contentPanel.add(ingestRunningPanel);
434 programsRunLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
435 org.openide.awt.Mnemonics.setLocalizedText(programsRunLabel,
org.openide.util.NbBundle.getMessage(
UserActivityPanel.class,
"UserActivityPanel.programsRunLabel.text"));
436 programsRunLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
437 contentPanel.add(programsRunLabel);
438 contentPanel.add(filler1);
440 topProgramsTablePanel.setAlignmentX(0.0F);
441 topProgramsTablePanel.setMaximumSize(
new java.awt.Dimension(32767, 106));
442 topProgramsTablePanel.setMinimumSize(
new java.awt.Dimension(10, 106));
443 topProgramsTablePanel.setPreferredSize(
new java.awt.Dimension(10, 106));
444 contentPanel.add(topProgramsTablePanel);
446 org.openide.awt.Mnemonics.setLocalizedText(rightClickForMoreOptions1,
org.openide.util.NbBundle.getMessage(
UserActivityPanel.class,
"UserActivityPanel.rightClickForMoreOptions1.text"));
447 contentPanel.add(rightClickForMoreOptions1);
448 contentPanel.add(filler3);
450 recentDomainsLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
451 org.openide.awt.Mnemonics.setLocalizedText(recentDomainsLabel,
org.openide.util.NbBundle.getMessage(
UserActivityPanel.class,
"UserActivityPanel.recentDomainsLabel.text"));
452 contentPanel.add(recentDomainsLabel);
453 contentPanel.add(filler2);
455 recentDomainsTablePanel.setAlignmentX(0.0F);
456 recentDomainsTablePanel.setMaximumSize(
new java.awt.Dimension(32767, 106));
457 recentDomainsTablePanel.setMinimumSize(
new java.awt.Dimension(10, 106));
458 recentDomainsTablePanel.setPreferredSize(
new java.awt.Dimension(10, 106));
459 contentPanel.add(recentDomainsTablePanel);
461 org.openide.awt.Mnemonics.setLocalizedText(rightClickForMoreOptions2,
org.openide.util.NbBundle.getMessage(
UserActivityPanel.class,
"UserActivityPanel.rightClickForMoreOptions2.text"));
462 contentPanel.add(rightClickForMoreOptions2);
463 contentPanel.add(filler4);
465 topWebSearchLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
466 org.openide.awt.Mnemonics.setLocalizedText(topWebSearchLabel,
org.openide.util.NbBundle.getMessage(
UserActivityPanel.class,
"UserActivityPanel.topWebSearchLabel.text"));
467 contentPanel.add(topWebSearchLabel);
468 contentPanel.add(filler5);
470 topWebSearches.setAlignmentX(0.0F);
471 topWebSearches.setMaximumSize(
new java.awt.Dimension(32767, 106));
472 topWebSearches.setMinimumSize(
new java.awt.Dimension(10, 106));
473 topWebSearches.setPreferredSize(
new java.awt.Dimension(10, 106));
474 contentPanel.add(topWebSearches);
476 org.openide.awt.Mnemonics.setLocalizedText(rightClickForMoreOptions3,
org.openide.util.NbBundle.getMessage(
UserActivityPanel.class,
"UserActivityPanel.rightClickForMoreOptions3.text"));
477 contentPanel.add(rightClickForMoreOptions3);
478 contentPanel.add(filler6);
480 topDevicesAttachedLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
481 org.openide.awt.Mnemonics.setLocalizedText(topDevicesAttachedLabel,
org.openide.util.NbBundle.getMessage(
UserActivityPanel.class,
"UserActivityPanel.topDevicesAttachedLabel.text"));
482 contentPanel.add(topDevicesAttachedLabel);
483 contentPanel.add(filler7);
485 recentDevicesAttached.setAlignmentX(0.0F);
486 recentDevicesAttached.setMaximumSize(
new java.awt.Dimension(32767, 106));
487 recentDevicesAttached.setMinimumSize(
new java.awt.Dimension(10, 106));
488 recentDevicesAttached.setPreferredSize(
new java.awt.Dimension(10, 106));
489 contentPanel.add(recentDevicesAttached);
491 org.openide.awt.Mnemonics.setLocalizedText(rightClickForMoreOptions4,
org.openide.util.NbBundle.getMessage(
UserActivityPanel.class,
"UserActivityPanel.rightClickForMoreOptions4.text"));
492 contentPanel.add(rightClickForMoreOptions4);
493 contentPanel.add(filler8);
495 recentAccountsLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
496 org.openide.awt.Mnemonics.setLocalizedText(recentAccountsLabel,
org.openide.util.NbBundle.getMessage(
UserActivityPanel.class,
"UserActivityPanel.recentAccountsLabel.text"));
497 contentPanel.add(recentAccountsLabel);
498 contentPanel.add(filler9);
500 topAccounts.setAlignmentX(0.0F);
501 topAccounts.setMaximumSize(
new java.awt.Dimension(32767, 106));
502 topAccounts.setMinimumSize(
new java.awt.Dimension(10, 106));
503 topAccounts.setPreferredSize(
new java.awt.Dimension(10, 106));
504 contentPanel.add(topAccounts);
506 org.openide.awt.Mnemonics.setLocalizedText(rightClickForMoreOptions5,
org.openide.util.NbBundle.getMessage(
UserActivityPanel.class,
"UserActivityPanel.rightClickForMoreOptions5.text"));
507 contentPanel.add(rightClickForMoreOptions5);
509 contentScrollPane.setViewportView(contentPanel);
511 add(contentScrollPane, java.awt.BorderLayout.CENTER);
final UserActivitySummary userActivityData
void fetchInformation(DataSource dataSource)
final List< DataFetchComponents< DataSource,?> > dataFetchComponents
final DataFetcher< DataSource, List< TopDeviceAttachedResult > > topDevicesAttachedFetcher
List< MenuItem > getPopup(LastAccessedArtifact record)
void onNewDataSource(DataSource dataSource)
final DataFetcher< DataSource, List< TopWebSearchResult > > topWebSearchesFetcher
List< TopAccountResult > getRecentAccounts(DataSource dataSource, int count)
UserActivityPanel(UserActivitySummary userActivityData)
final DataFetcher< DataSource, List< TopDomainsResult > > topDomainsFetcher
final DataFetcher< DataSource, List< TopProgramsResult > > topProgramsFetcher
void showDataFetchResult(DataFetchResult< T > result, String errorMessage, String noResultsMessage)
List< TopWebSearchResult > getMostRecentWebSearches(DataSource dataSource, int count)
final DataFetcher< DataSource, List< TopAccountResult > > topAccountsFetcher
static< T, CextendsGuiCellModel > JTablePanel< T > getJTablePanel(List< ColumnModel< T, C >> columns)
List< TopDeviceAttachedResult > getRecentDevices(DataSource dataSource, int count)
String getShortFolderName(String strPath, String applicationName)
List< TopProgramsResult > getTopPrograms(DataSource dataSource, int count)
List< TopDomainsResult > getRecentDomains(DataSource dataSource, int count)
DefaultCellModel< T > setTooltip(String tooltip)
String getShortFolderName(String path, String appName)
BlackboardArtifact getArtifact()