19 package org.sleuthkit.autopsy.communications;
21 import java.beans.PropertyChangeEvent;
22 import java.sql.ResultSet;
23 import java.sql.SQLException;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
28 import java.util.logging.Level;
29 import java.util.logging.Logger;
30 import javax.swing.SwingUtilities;
45 abstract class CVTFilterRefresher
implements RefreshThrottler.Refresher {
47 private static final Logger logger = Logger.getLogger(CVTFilterRefresher.class.getName());
55 abstract void updateFilterPanel(FilterPanelData data);
58 public void refresh() {
62 SleuthkitCase skCase = Case.getCurrentCaseThrows().getSleuthkitCase();
65 try (SleuthkitCase.CaseDbQuery dbQuery = skCase.executeQuery(
"SELECT MAX(date_time) as end, MIN(date_time) as start from account_relationships")) {
67 ResultSet rs = dbQuery.getResultSet();
69 startTime = rs.getInt(
"start");
70 endTime = rs.getInt(
"end");
74 List<Integer> deviceObjIds =
new ArrayList<>();
75 try (SleuthkitCase.CaseDbQuery queryResult = skCase.executeQuery(
"SELECT DISTINCT data_source_obj_id FROM account_relationships")) {
77 ResultSet rs = queryResult.getResultSet();
79 deviceObjIds.add(rs.getInt(1));
85 Map<String, DataSource> dataSourceMap =
new HashMap<>();
86 for (DataSource dataSource : skCase.getDataSources()) {
87 if (deviceObjIds.contains((
int) dataSource.getId())) {
88 String dsName = skCase.getContentById(dataSource.getId()).getName();
89 dataSourceMap.put(dsName, dataSource);
93 List<Account.Type> accountTypesInUse = skCase.getCommunicationsManager().getAccountTypesInUse();
95 SwingUtilities.invokeLater(
new Runnable() {
98 updateFilterPanel(
new FilterPanelData(dataSourceMap, accountTypesInUse, startTime, endTime));
102 }
catch (SQLException | TskCoreException ex) {
103 logger.log(Level.WARNING,
"Unable to update CVT filter panel.", ex);
104 }
catch (NoCurrentCaseException notUsed) {
113 public boolean isRefreshRequired(PropertyChangeEvent evt) {
114 String eventType = evt.getPropertyName();
115 if (eventType.equals(DATA_ADDED.toString())) {
117 ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue();
118 return (null != eventData
119 && (eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()
120 || eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT.getTypeID()
121 || eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()
122 || eventData.getBlackboardArtifactType().getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()));
131 class FilterPanelData {
133 private final Map<String, DataSource> dataSourceMap;
134 private final Integer startTime;
135 private final Integer endTime;
136 private final List<Account.Type> accountTypesInUse;
138 FilterPanelData(Map<String, DataSource> dataSourceMap, List<Account.Type> accountTypesInUse, Integer startTime, Integer endTime) {
139 this.dataSourceMap = dataSourceMap;
140 this.startTime = startTime;
141 this.endTime = endTime;
142 this.accountTypesInUse = accountTypesInUse;
145 Map<String, DataSource> getDataSourceMap() {
146 return dataSourceMap;
149 Integer getStartTime() {
153 Integer getEndTime() {
157 List<Account.Type> getAccountTypesInUse() {
158 return accountTypesInUse;