19package org.sleuthkit.autopsy.discovery.ui;
21import java.awt.Dimension;
23import java.util.ArrayList;
25import java.util.logging.Level;
26import javax.swing.JPopupMenu;
27import javax.swing.event.ListSelectionListener;
28import javax.swing.table.AbstractTableModel;
29import javax.swing.table.TableCellRenderer;
30import org.apache.commons.io.FilenameUtils;
31import org.apache.commons.lang.StringUtils;
32import org.openide.util.NbBundle;
33import org.sleuthkit.autopsy.casemodule.Case;
34import org.sleuthkit.autopsy.coreutils.Logger;
35import org.sleuthkit.autopsy.coreutils.ThreadConfined;
36import org.sleuthkit.autopsy.coreutils.TimeZoneUtils;
37import org.sleuthkit.autopsy.guiutils.SimpleTableCellRenderer;
38import org.sleuthkit.datamodel.BlackboardArtifact;
39import org.sleuthkit.datamodel.BlackboardAttribute;
40import org.sleuthkit.datamodel.TskCoreException;
46final class ArtifactsListPanel
extends AbstractArtifactListPanel {
48 private static final long serialVersionUID = 1L;
49 private static final Logger logger = Logger.getLogger(ArtifactsListPanel.class.getName());
57 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
58 ArtifactsListPanel(BlackboardArtifact.ARTIFACT_TYPE artifactType) {
62 TableCellRenderer renderer =
new SimpleTableCellRenderer();
63 for (
int i = 0; i < tableModel.getColumnCount(); ++i) {
64 artifactsTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
66 setMinimumSize(
new Dimension(125, 20));
67 artifactsTable.getRowSorter().toggleSortOrder(0);
68 artifactsTable.getRowSorter().toggleSortOrder(0);
72 void addMouseListener(java.awt.event.MouseAdapter mouseListener) {
73 artifactsTable.addMouseListener(mouseListener);
77 void showPopupMenu(JPopupMenu popupMenu, Point point) {
78 popupMenu.show(artifactsTable, point.x, point.y);
82 void addSelectionListener(ListSelectionListener listener) {
83 artifactsTable.getSelectionModel().addListSelectionListener(listener);
89 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
91 artifactsTable.grabFocus();
95 void removeSelectionListener(ListSelectionListener listener) {
96 artifactsTable.getSelectionModel().removeListSelectionListener(listener);
100 boolean selectAtPoint(Point point) {
101 boolean pointSelected =
false;
102 int row = artifactsTable.rowAtPoint(point);
103 if (row < artifactsTable.getRowCount() && row >= 0) {
104 artifactsTable.clearSelection();
105 artifactsTable.addRowSelectionInterval(row, row);
106 pointSelected =
true;
108 return pointSelected;
112 BlackboardArtifact getSelectedArtifact() {
114 int selectedIndex = artifactsTable.getSelectionModel().getLeadSelectionIndex();
115 if (selectedIndex < artifactsTable.getSelectionModel().getMinSelectionIndex() || artifactsTable.getSelectionModel().getMaxSelectionIndex() < 0 || selectedIndex > artifactsTable.getSelectionModel().getMaxSelectionIndex()) {
118 return tableModel.getArtifactByRow(artifactsTable.convertRowIndexToModel(selectedIndex));
126 return tableModel.getRowCount() <= 0;
132 artifactsTable.setRowSelectionInterval(0, 0);
134 artifactsTable.clearSelection();
144 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
146 void addArtifacts(List<BlackboardArtifact> artifactList) {
147 if (!artifactList.isEmpty()) {
148 artifactsTable.setModel(tableModel);
149 tableModel.setContents(artifactList);
153 artifactsTable.validate();
154 artifactsTable.repaint();
155 tableModel.fireTableDataChanged();
161 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
164 addArtifacts(
new ArrayList<>());
173 private void initComponents() {
175 javax.swing.JScrollPane jScrollPane1 =
new javax.swing.JScrollPane();
176 artifactsTable =
new javax.swing.JTable();
179 setPreferredSize(
new java.awt.Dimension(350, 10));
181 jScrollPane1.setBorder(
null);
182 jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
183 jScrollPane1.setMinimumSize(
new java.awt.Dimension(0, 0));
184 jScrollPane1.setPreferredSize(
new java.awt.Dimension(350, 10));
186 artifactsTable.setAutoCreateRowSorter(
true);
187 artifactsTable.setModel(tableModel);
188 artifactsTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
189 jScrollPane1.setViewportView(artifactsTable);
191 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
192 this.setLayout(layout);
193 layout.setHorizontalGroup(
194 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
195 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
197 layout.setVerticalGroup(
198 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
199 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
207 private class DomainArtifactTableModel
extends AbstractTableModel {
210 private final List<BlackboardArtifact>
artifactList =
new ArrayList<>();
219 DomainArtifactTableModel(BlackboardArtifact.ARTIFACT_TYPE
artifactType) {
230 void setContents(List<BlackboardArtifact> artifacts) {
231 artifactsTable.clearSelection();
245 if (
artifactType == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_CACHE) {
260 BlackboardArtifact getArtifactByRow(
int rowIndex) {
265 @NbBundle.Messages({
"ArtifactsListPanel.value.noValue=No value available."})
268 if (columnIndex < 2 ||
artifactType == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_CACHE) {
269 final BlackboardArtifact artifact = getArtifactByRow(rowIndex);
271 for (BlackboardAttribute bba : artifact.getAttributes()) {
272 if (!StringUtils.isBlank(bba.getDisplayString())) {
274 if (!StringUtils.isBlank(stringFromAttribute)) {
275 return stringFromAttribute;
280 }
catch (TskCoreException ex) {
281 logger.log(Level.WARNING,
"Error getting attributes for artifact " + artifact.getArtifactID(), ex);
284 return Bundle.ArtifactsListPanel_value_noValue();
303 private String
getStringForColumn(BlackboardArtifact artifact, BlackboardAttribute bba,
int columnIndex) throws TskCoreException {
304 if (columnIndex == 0 && bba.getAttributeType().getTypeID() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED.getTypeID()) {
305 return TimeZoneUtils.getFormattedTime(bba.getValueLong());
306 }
else if (columnIndex == 1) {
307 if (
artifactType == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD ||
artifactType == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_CACHE) {
308 if (bba.getAttributeType().getTypeID() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH_ID.getTypeID()) {
310 }
else if (bba.getAttributeType().getTypeID() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH.getTypeID()) {
311 return FilenameUtils.getName(bba.getDisplayString());
313 }
else if (bba.getAttributeType().getTypeID() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TITLE.getTypeID()) {
314 return bba.getDisplayString();
316 }
else if (columnIndex == 2 && bba.getAttributeType().getTypeID() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH_ID.getTypeID()) {
317 return Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(bba.getValueLong()).getMIMEType();
338 final BlackboardArtifact artifact = getArtifactByRow(rowIndex);
339 for (BlackboardAttribute bba : artifact.getAttributes()) {
340 if (columnIndex == 0 && bba.getAttributeType().getTypeName().startsWith(
"TSK_DATETIME") && !StringUtils.isBlank(bba.getDisplayString())) {
342 }
else if (columnIndex == 1 && bba.getAttributeType().getTypeID() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL.getTypeID() && !StringUtils.isBlank(bba.getDisplayString())) {
343 return bba.getDisplayString();
344 }
else if (columnIndex == 1 && bba.getAttributeType().getTypeID() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME.getTypeID() && !StringUtils.isBlank(bba.getDisplayString())) {
345 return bba.getDisplayString();
346 }
else if (columnIndex == 1 && bba.getAttributeType().getTypeID() == BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT.getTypeID() && !StringUtils.isBlank(bba.getDisplayString())) {
347 return bba.getDisplayString();
350 return Bundle.ArtifactsListPanel_value_noValue();
354 @NbBundle.Messages({
"ArtifactsListPanel.titleColumn.name=Title",
355 "ArtifactsListPanel.fileNameColumn.name=Name",
356 "ArtifactsListPanel.dateColumn.name=Date/Time",
357 "ArtifactsListPanel.urlColumn.name=URL",
358 "ArtifactsListPanel.termColumn.name=Term",
359 "ArtifactsListPanel.mimeTypeColumn.name=MIME Type"})
364 return Bundle.ArtifactsListPanel_dateColumn_name();
369 case TSK_WEB_DOWNLOAD:
370 return Bundle.ArtifactsListPanel_fileNameColumn_name();
372 return Bundle.ArtifactsListPanel_urlColumn_name();
373 case TSK_WEB_SEARCH_QUERY:
374 return Bundle.ArtifactsListPanel_termColumn_name();
378 return Bundle.ArtifactsListPanel_titleColumn_name();
380 return Bundle.ArtifactsListPanel_mimeTypeColumn_name();
404 @NbBundle.Messages({
"ArtifactsListPanel.noResultsFound.text=No results found"})
407 return Bundle.ArtifactsListPanel_noResultsFound_text();
414 return Bundle.ArtifactsListPanel_dateColumn_name();
416 return Bundle.ArtifactsListPanel_titleColumn_name();
418 return Bundle.ArtifactsListPanel_mimeTypeColumn_name();
427 private javax.swing.JTable artifactsTable;
SleuthkitCase getSleuthkitCase()
static Case getCurrentCase()
static String getFormattedTime(long epochTime)
Object getValueAt(int rowIndex, int columnIndex)
final BlackboardArtifact.ARTIFACT_TYPE artifactType
String getColumnName(int column)
final List< BlackboardArtifact > artifactList
String getFallbackValue(int rowIndex, int columnIndex)
static final long serialVersionUID
String getStringForColumn(BlackboardArtifact artifact, BlackboardAttribute bba, int columnIndex)
static final long serialVersionUID
String getColumnName(int column)
Object getValueAt(int rowIndex, int columnIndex)