19 package org.sleuthkit.autopsy.report;
 
   21 import com.google.common.collect.ListMultimap;
 
   22 import com.google.common.collect.Lists;
 
   23 import com.google.common.collect.Multimaps;
 
   24 import java.sql.ResultSet;
 
   25 import java.sql.SQLException;
 
   26 import java.util.ArrayList;
 
   27 import java.util.Arrays;
 
   28 import java.util.Collection;
 
   29 import java.util.Collections;
 
   30 import java.util.Comparator;
 
   31 import java.util.HashMap;
 
   32 import java.util.HashSet;
 
   33 import java.util.Iterator;
 
   34 import java.util.List;
 
   36 import java.util.Objects;
 
   38 import java.util.TreeSet;
 
   39 import java.util.logging.Level;
 
   40 import org.openide.util.NbBundle;
 
   57 class TableReportGenerator {
 
   59     private final List<BlackboardArtifact.Type> artifactTypes = 
new ArrayList<>();
 
   60     private final HashSet<String> tagNamesFilter = 
new HashSet<>();
 
   62     private final List<Content> images = 
new ArrayList<>();
 
   63     private final ReportProgressPanel progressPanel;
 
   64     private final TableReportModule tableReport;
 
   65     private final Map<Integer, List<Column>> columnHeaderMap;
 
   66     private static final Logger logger = Logger.getLogger(TableReportGenerator.class.getName());
 
   68     private final List<String> errorList;
 
   70     TableReportGenerator(Map<BlackboardArtifact.Type, Boolean> artifactTypeSelections, Map<String, Boolean> tagNameSelections, ReportProgressPanel progressPanel, TableReportModule tableReport) {
 
   72         this.progressPanel = progressPanel;
 
   73         this.tableReport = tableReport;
 
   74         this.columnHeaderMap = 
new HashMap<>();
 
   75         errorList = 
new ArrayList<>();
 
   77         for (Map.Entry<BlackboardArtifact.Type, Boolean> entry : artifactTypeSelections.entrySet()) {
 
   78             if (entry.getValue()) {
 
   79                 artifactTypes.add(entry.getKey());
 
   84         if (null != tagNameSelections) {
 
   85             for (Map.Entry<String, Boolean> entry : tagNameSelections.entrySet()) {
 
   86                 if (entry.getValue() == 
true) {
 
   87                     tagNamesFilter.add(entry.getKey());
 
   93     protected void execute() {
 
   96         progressPanel.start();
 
   97         progressPanel.setIndeterminate(
false);
 
   98         progressPanel.setMaximumProgress(this.artifactTypes.size() + 2); 
 
  100         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  101             makeBlackboardArtifactTables();
 
  105         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  106             makeContentTagsTables();
 
  109         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  110             makeBlackboardArtifactTagsTables();
 
  113         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  115             makeThumbnailTable();
 
  119         progressPanel.complete(ReportProgressPanel.ReportStatus.COMPLETE);
 
  125     private void makeBlackboardArtifactTables() {
 
  128         if (!tagNamesFilter.isEmpty()) {
 
  129             comment += NbBundle.getMessage(this.getClass(), 
"ReportGenerator.artifactTable.taggedResults.text");
 
  130             comment += makeCommaSeparatedList(tagNamesFilter);
 
  134         for (BlackboardArtifact.Type type : artifactTypes) {
 
  137             if (progressPanel.getStatus() == ReportProgressPanel.ReportStatus.CANCELED) {
 
  141             progressPanel.updateStatusLabel(
 
  142                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  143                             type.getDisplayName()));
 
  146             if (type.getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) {
 
  147                 writeKeywordHits(tableReport, comment, tagNamesFilter);
 
  149             } 
else if (type.getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID()) {
 
  150                 writeHashsetHits(tableReport, comment, tagNamesFilter);
 
  154             List<ArtifactData> artifactList = getFilteredArtifacts(type, tagNamesFilter);
 
  156             if (artifactList.isEmpty()) {
 
  163             if (type.getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID()) {
 
  165                 ListMultimap<String, ArtifactData> groupedArtifacts = Multimaps.index(artifactList,
 
  168                                 return artifactData.getArtifact().getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE)).getValueString();
 
  169                             } 
catch (TskCoreException ex) {
 
  170                                 logger.log(Level.SEVERE, 
"Unable to get value of TSK_ACCOUNT_TYPE attribute. Defaulting to \"unknown\"", ex);
 
  174                 for (String accountType : groupedArtifacts.keySet()) {
 
  180                     final String compundDataTypeName = BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT.getDisplayName() + 
": " + accountType;
 
  181                     writeTableForDataType(
new ArrayList<>(groupedArtifacts.get(accountType)), type, compundDataTypeName, comment);
 
  185                 writeTableForDataType(artifactList, type, type.getDisplayName(), comment);
 
  200     private void writeTableForDataType(List<ArtifactData> artifactList, BlackboardArtifact.Type type, String tableName, String comment) {
 
  205         Set<BlackboardAttribute.Type> attrTypeSet = 
new TreeSet<>(Comparator.comparing(BlackboardAttribute.Type::getDisplayName));
 
  206         for (ArtifactData data : artifactList) {
 
  207             List<BlackboardAttribute> attributes = data.getAttributes();
 
  208             for (BlackboardAttribute attribute : attributes) {
 
  209                 attrTypeSet.add(attribute.getAttributeType());
 
  216         List<Column> columns = getArtifactTableColumns(type.getTypeID(), attrTypeSet);
 
  217         if (columns.isEmpty()) {
 
  220         columnHeaderMap.put(type.getTypeID(), columns);
 
  225         Collections.sort(artifactList);
 
  227         tableReport.startDataType(tableName, comment);
 
  230         for (ArtifactData artifactData : artifactList) {
 
  233             List<String> rowData = artifactData.getRow();
 
  234             if (rowData.isEmpty()) {
 
  238             tableReport.addRow(rowData);
 
  241         progressPanel.increment();
 
  242         tableReport.endTable();
 
  243         tableReport.endDataType();
 
  249     @SuppressWarnings(
"deprecation")
 
  250     private 
void makeContentTagsTables() {
 
  253         List<ContentTag> tags;
 
  255             tags = Case.getCurrentCase().getServices().getTagsManager().getAllContentTags();
 
  256         } 
catch (TskCoreException ex) {
 
  257             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetContentTags"));
 
  258             logger.log(Level.SEVERE, 
"failed to get content tags", ex); 
 
  265         progressPanel.updateStatusLabel(
 
  266                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  267                         BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE.getDisplayName()));
 
  268         ArrayList<String> columnHeaders = 
new ArrayList<>(Arrays.asList(
 
  269                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.tag"),
 
  270                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.file"),
 
  271                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.comment"),
 
  272                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeModified"),
 
  273                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeChanged"),
 
  274                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeAccessed"),
 
  275                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeCreated"),
 
  276                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.size"),
 
  277                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.hash")));
 
  279         StringBuilder comment = 
new StringBuilder();
 
  280         if (!tagNamesFilter.isEmpty()) {
 
  282                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.makeContTagTab.taggedFiles.msg"));
 
  283             comment.append(makeCommaSeparatedList(tagNamesFilter));
 
  285         if (tableReport instanceof ReportHTML) {
 
  286             ReportHTML htmlReportModule = (ReportHTML) tableReport;
 
  287             htmlReportModule.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE.getDisplayName(), comment.toString());
 
  288             htmlReportModule.startContentTagsTable(columnHeaders);
 
  290             tableReport.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE.getDisplayName(), comment.toString());
 
  291             tableReport.startTable(columnHeaders);
 
  295         for (ContentTag tag : tags) {
 
  297             if (passesTagNamesFilter(tag.getName().getDisplayName()) == 
false) {
 
  303                 fileName = tag.getContent().getUniquePath();
 
  304             } 
catch (TskCoreException ex) {
 
  305                 fileName = tag.getContent().getName();
 
  308             ArrayList<String> rowData = 
new ArrayList<>(Arrays.asList(tag.getName().getDisplayName(), fileName, tag.getComment()));
 
  309             Content content = tag.getContent();
 
  310             if (content instanceof AbstractFile) {
 
  311                 AbstractFile file = (AbstractFile) content;
 
  314                 rowData.add(file.getMtimeAsDate());
 
  315                 rowData.add(file.getCtimeAsDate());
 
  316                 rowData.add(file.getAtimeAsDate());
 
  317                 rowData.add(file.getCrtimeAsDate());
 
  318                 rowData.add(Long.toString(file.getSize()));
 
  319                 rowData.add(file.getMd5Hash());
 
  322             if (tableReport instanceof ReportHTML) {
 
  323                 ReportHTML htmlReportModule = (ReportHTML) tableReport;
 
  324                 htmlReportModule.addRowWithTaggedContentHyperlink(rowData, tag);
 
  326                 tableReport.addRow(rowData);
 
  330             checkIfTagHasImage(tag);
 
  334         progressPanel.increment();
 
  335         tableReport.endTable();
 
  336         tableReport.endDataType();
 
  342     @SuppressWarnings(
"deprecation")
 
  343     private 
void makeBlackboardArtifactTagsTables() {
 
  345         List<BlackboardArtifactTag> tags;
 
  347             tags = Case.getCurrentCase().getServices().getTagsManager().getAllBlackboardArtifactTags();
 
  348         } 
catch (TskCoreException ex) {
 
  349             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetBBArtifactTags"));
 
  350             logger.log(Level.SEVERE, 
"failed to get blackboard artifact tags", ex); 
 
  356         progressPanel.updateStatusLabel(
 
  357                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  358                         BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT.getDisplayName()));
 
  359         StringBuilder comment = 
new StringBuilder();
 
  360         if (!tagNamesFilter.isEmpty()) {
 
  362                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.makeBbArtTagTab.taggedRes.msg"));
 
  363             comment.append(makeCommaSeparatedList(tagNamesFilter));
 
  365         tableReport.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT.getDisplayName(), comment.toString());
 
  366         tableReport.startTable(
new ArrayList<>(Arrays.asList(
 
  367                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.resultType"),
 
  368                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.tag"),
 
  369                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.comment"),
 
  370                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.srcFile"))));
 
  373         for (BlackboardArtifactTag tag : tags) {
 
  374             if (passesTagNamesFilter(tag.getName().getDisplayName()) == 
false) {
 
  379             row = 
new ArrayList<>(Arrays.asList(tag.getArtifact().getArtifactTypeName(), tag.getName().getDisplayName(), tag.getComment(), tag.getContent().getName()));
 
  380             tableReport.addRow(row);
 
  383             checkIfTagHasImage(tag);
 
  387         progressPanel.increment();
 
  388         tableReport.endTable();
 
  389         tableReport.endDataType();
 
  399     private boolean passesTagNamesFilter(String tagName) {
 
  400         return tagNamesFilter.isEmpty() || tagNamesFilter.contains(tagName);
 
  406     private void makeThumbnailTable() {
 
  407         progressPanel.updateStatusLabel(
 
  408                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.createdThumb.text"));
 
  410         if (tableReport instanceof ReportHTML) {
 
  411             ReportHTML htmlModule = (ReportHTML) tableReport;
 
  412             htmlModule.startDataType(
 
  413                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.thumbnailTable.name"),
 
  414                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.thumbnailTable.desc"));
 
  415             List<String> emptyHeaders = 
new ArrayList<>();
 
  416             for (
int i = 0; i < ReportHTML.THUMBNAIL_COLUMNS; i++) {
 
  417                 emptyHeaders.add(
"");
 
  419             htmlModule.startTable(emptyHeaders);
 
  421             htmlModule.addThumbnailRows(images);
 
  423             htmlModule.endTable();
 
  424             htmlModule.endDataType();
 
  435     private void checkIfTagHasImage(BlackboardArtifactTag artifactTag) {
 
  438             file = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(artifactTag.getArtifact().getObjectID());
 
  439         } 
catch (TskCoreException ex) {
 
  441                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.errGetContentFromBBArtifact"));
 
  442             logger.log(Level.WARNING, 
"Error while getting content from a blackboard artifact to report on.", ex); 
 
  447             checkIfFileIsImage(file);
 
  458     private void checkIfTagHasImage(ContentTag contentTag) {
 
  459         Content c = contentTag.getContent();
 
  460         if (c instanceof AbstractFile == 
false) {
 
  463         checkIfFileIsImage((AbstractFile) c);
 
  471     private void checkIfFileIsImage(AbstractFile file) {
 
  474                 || file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS
 
  475                 || file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS) {
 
  479         if (ImageUtils.thumbnailSupported(file)) {
 
  492     private String makeCommaSeparatedList(Collection<String> items) {
 
  494         for (Iterator<String> iterator = items.iterator(); iterator.hasNext();) {
 
  495             list += iterator.next() + (iterator.hasNext() ? 
", " : 
"");
 
  505     @SuppressWarnings(
"deprecation")
 
  506     private 
void writeKeywordHits(TableReportModule tableModule, String comment, HashSet<String> tagNamesFilter) {
 
  513         String orderByClause;
 
  514         if (Case.getCurrentCase().getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  515             orderByClause = 
"ORDER BY convert_to(att.value_text, 'SQL_ASCII') ASC NULLS FIRST"; 
 
  517             orderByClause = 
"ORDER BY list ASC"; 
 
  519         String keywordListQuery
 
  520                 = 
"SELECT att.value_text AS list " 
  522                 "FROM blackboard_attributes AS att, blackboard_artifacts AS art " 
  524                 "WHERE att.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
" " 
  526                 "AND art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
" " 
  528                 "AND att.artifact_id = art.artifact_id " 
  530                 "GROUP BY list " + orderByClause; 
 
  532         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(keywordListQuery)) {
 
  533             ResultSet listsRs = dbQuery.getResultSet();
 
  534             List<String> lists = 
new ArrayList<>();
 
  535             while (listsRs.next()) {
 
  536                 String list = listsRs.getString(
"list"); 
 
  537                 if (list.isEmpty()) {
 
  538                     list = NbBundle.getMessage(this.getClass(), 
"ReportGenerator.writeKwHits.userSrchs");
 
  544             tableModule.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getDisplayName(), comment);
 
  545             tableModule.addSetIndex(lists);
 
  546             progressPanel.updateStatusLabel(
 
  547                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  548                             BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getDisplayName()));
 
  549         } 
catch (TskCoreException | SQLException ex) {
 
  550             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryKWLists"));
 
  551             logger.log(Level.SEVERE, 
"Failed to query keyword lists: ", ex); 
 
  555         if (Case.getCurrentCase().getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  556             orderByClause = 
"ORDER BY convert_to(att3.value_text, 'SQL_ASCII') ASC NULLS FIRST, "  
  557                     + 
"convert_to(att1.value_text, 'SQL_ASCII') ASC NULLS FIRST, "  
  558                     + 
"convert_to(f.parent_path, 'SQL_ASCII') ASC NULLS FIRST, "  
  559                     + 
"convert_to(f.name, 'SQL_ASCII') ASC NULLS FIRST, "  
  560                     + 
"convert_to(att2.value_text, 'SQL_ASCII') ASC NULLS FIRST"; 
 
  562             orderByClause = 
"ORDER BY list ASC, keyword ASC, parent_path ASC, name ASC, preview ASC"; 
 
  566                 = 
"SELECT art.artifact_id, art.obj_id, att1.value_text AS keyword, att2.value_text AS preview, att3.value_text AS list, f.name AS name, f.parent_path AS parent_path " 
  568                 "FROM blackboard_artifacts AS art, blackboard_attributes AS att1, blackboard_attributes AS att2, blackboard_attributes AS att3, tsk_files AS f " 
  570                 "WHERE (att1.artifact_id = art.artifact_id) " 
  572                 "AND (att2.artifact_id = art.artifact_id) " 
  574                 "AND (att3.artifact_id = art.artifact_id) " 
  576                 "AND (f.obj_id = art.obj_id) " 
  578                 "AND (att1.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID() + 
") " 
  580                 "AND (att2.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW.getTypeID() + 
") " 
  582                 "AND (att3.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
") " 
  584                 "AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
") " 
  588         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(keywordsQuery)) {
 
  589             ResultSet resultSet = dbQuery.getResultSet();
 
  591             String currentKeyword = 
"";
 
  592             String currentList = 
"";
 
  593             while (resultSet.next()) {
 
  595                 if (progressPanel.getStatus() == ReportProgressPanel.ReportStatus.CANCELED) {
 
  600                 HashSet<String> uniqueTagNames = getUniqueTagNames(resultSet.getLong(
"artifact_id")); 
 
  601                 if (failsTagFilter(uniqueTagNames, tagNamesFilter)) {
 
  604                 String tagsList = makeCommaSeparatedList(uniqueTagNames);
 
  606                 Long objId = resultSet.getLong(
"obj_id"); 
 
  607                 String keyword = resultSet.getString(
"keyword"); 
 
  608                 String preview = resultSet.getString(
"preview"); 
 
  609                 String list = resultSet.getString(
"list"); 
 
  610                 String uniquePath = 
"";
 
  613                     AbstractFile f = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(objId);
 
  615                         uniquePath = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(objId).getUniquePath();
 
  617                 } 
catch (TskCoreException ex) {
 
  619                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetAbstractFileByID"));
 
  620                     logger.log(Level.WARNING, 
"Failed to get Abstract File by ID.", ex); 
 
  624                 if ((!list.equals(currentList) && !list.isEmpty()) || (list.isEmpty() && !currentList.equals(
 
  625                         NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.writeKwHits.userSrchs")))) {
 
  626                     if (!currentList.isEmpty()) {
 
  627                         tableModule.endTable();
 
  628                         tableModule.endSet();
 
  630                     currentList = list.isEmpty() ? NbBundle
 
  631                             .getMessage(this.getClass(), 
"ReportGenerator.writeKwHits.userSrchs") : list;
 
  633                     tableModule.startSet(currentList);
 
  634                     progressPanel.updateStatusLabel(
 
  635                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processingList",
 
  636                                     BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getDisplayName(), currentList));
 
  638                 if (!keyword.equals(currentKeyword)) {
 
  639                     if (!currentKeyword.equals(
"")) {
 
  640                         tableModule.endTable();
 
  642                     currentKeyword = keyword;
 
  643                     tableModule.addSetElement(currentKeyword);
 
  644                     List<String> columnHeaderNames = 
new ArrayList<>();
 
  645                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.preview"));
 
  646                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.srcFile"));
 
  647                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags"));
 
  648                     tableModule.startTable(columnHeaderNames);
 
  651                 String previewreplace = EscapeUtil.escapeHtml(preview);
 
  652                 tableModule.addRow(Arrays.asList(
new String[]{previewreplace.replaceAll(
"<!", 
""), uniquePath, tagsList}));
 
  656             progressPanel.increment();
 
  657             tableModule.endDataType();
 
  658         } 
catch (TskCoreException | SQLException ex) {
 
  659             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryKWs"));
 
  660             logger.log(Level.SEVERE, 
"Failed to query keywords: ", ex); 
 
  669     @SuppressWarnings(
"deprecation")
 
  670     private 
void writeHashsetHits(TableReportModule tableModule, String comment, HashSet<String> tagNamesFilter) {
 
  671         String orderByClause;
 
  672         if (Case.getCurrentCase().getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  673             orderByClause = 
"ORDER BY convert_to(att.value_text, 'SQL_ASCII') ASC NULLS FIRST"; 
 
  675             orderByClause = 
"ORDER BY att.value_text ASC"; 
 
  678                 = 
"SELECT att.value_text AS list " 
  680                 "FROM blackboard_attributes AS att, blackboard_artifacts AS art " 
  682                 "WHERE att.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
" " 
  684                 "AND art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID() + 
" " 
  686                 "AND att.artifact_id = art.artifact_id " 
  688                 "GROUP BY list " + orderByClause; 
 
  690         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(hashsetsQuery)) {
 
  692             ResultSet listsRs = dbQuery.getResultSet();
 
  693             List<String> lists = 
new ArrayList<>();
 
  694             while (listsRs.next()) {
 
  695                 lists.add(listsRs.getString(
"list")); 
 
  698             tableModule.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName(), comment);
 
  699             tableModule.addSetIndex(lists);
 
  700             progressPanel.updateStatusLabel(
 
  701                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  702                             BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName()));
 
  703         } 
catch (TskCoreException | SQLException ex) {
 
  704             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryHashsetLists"));
 
  705             logger.log(Level.SEVERE, 
"Failed to query hashset lists: ", ex); 
 
  709         if (Case.getCurrentCase().getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  710             orderByClause = 
"ORDER BY convert_to(att.value_text, 'SQL_ASCII') ASC NULLS FIRST, "  
  711                     + 
"convert_to(f.parent_path, 'SQL_ASCII') ASC NULLS FIRST, "  
  712                     + 
"convert_to(f.name, 'SQL_ASCII') ASC NULLS FIRST, "  
  713                     + 
"size ASC NULLS FIRST"; 
 
  715             orderByClause = 
"ORDER BY att.value_text ASC, f.parent_path ASC, f.name ASC, size ASC"; 
 
  717         String hashsetHitsQuery
 
  718                 = 
"SELECT art.artifact_id, art.obj_id, att.value_text AS setname, f.name AS name, f.size AS size, f.parent_path AS parent_path " 
  720                 "FROM blackboard_artifacts AS art, blackboard_attributes AS att, tsk_files AS f " 
  722                 "WHERE (att.artifact_id = art.artifact_id) " 
  724                 "AND (f.obj_id = art.obj_id) " 
  726                 "AND (att.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
") " 
  728                 "AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID() + 
") " 
  732         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(hashsetHitsQuery)) {
 
  734             ResultSet resultSet = dbQuery.getResultSet();
 
  735             String currentSet = 
"";
 
  736             while (resultSet.next()) {
 
  738                 if (progressPanel.getStatus() == ReportProgressPanel.ReportStatus.CANCELED) {
 
  743                 HashSet<String> uniqueTagNames = getUniqueTagNames(resultSet.getLong(
"artifact_id")); 
 
  744                 if (failsTagFilter(uniqueTagNames, tagNamesFilter)) {
 
  747                 String tagsList = makeCommaSeparatedList(uniqueTagNames);
 
  749                 Long objId = resultSet.getLong(
"obj_id"); 
 
  750                 String set = resultSet.getString(
"setname"); 
 
  751                 String size = resultSet.getString(
"size"); 
 
  752                 String uniquePath = 
"";
 
  755                     AbstractFile f = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(objId);
 
  757                         uniquePath = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(objId).getUniquePath();
 
  759                 } 
catch (TskCoreException ex) {
 
  761                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetAbstractFileFromID"));
 
  762                     logger.log(Level.WARNING, 
"Failed to get Abstract File from ID.", ex); 
 
  767                 if (!set.equals(currentSet)) {
 
  768                     if (!currentSet.isEmpty()) {
 
  769                         tableModule.endTable();
 
  770                         tableModule.endSet();
 
  773                     tableModule.startSet(currentSet);
 
  774                     List<String> columnHeaderNames = 
new ArrayList<>();
 
  775                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.file"));
 
  776                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.size"));
 
  777                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags"));
 
  778                     tableModule.startTable(columnHeaderNames);
 
  779                     progressPanel.updateStatusLabel(
 
  780                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processingList",
 
  781                                     BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName(), currentSet));
 
  785                 tableModule.addRow(Arrays.asList(
new String[]{uniquePath, size, tagsList}));
 
  789             progressPanel.increment();
 
  790             tableModule.endDataType();
 
  791         } 
catch (TskCoreException | SQLException ex) {
 
  792             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryHashsetHits"));
 
  793             logger.log(Level.SEVERE, 
"Failed to query hashsets hits: ", ex); 
 
  800     List<String> getErrorList() {
 
  813         private List<String> rowData = null;
 
  816         ArtifactData(BlackboardArtifact artifact, List<BlackboardAttribute> attrs, HashSet<String> tags) {
 
  818             this.attributes = attrs;
 
  822             } 
catch (TskCoreException ex) {
 
  823                 logger.log(Level.SEVERE, 
"Could not get content from database");
 
  840             return artifact.getArtifactID();
 
  844             return artifact.getObjectID();
 
  865             List<String> thisRow = 
getRow();
 
  866             List<String> otherRow = otherArtifactData.
getRow();
 
  867             for (
int i = 0; i < thisRow.size(); i++) {
 
  868                 int compare = thisRow.get(i).compareTo(otherRow.get(i));
 
  884             if (rowData == null) {
 
  889                     if (rowData.size() > 0) {
 
  891                         for (
int i = 0; i < rowData.size(); i++) {
 
  892                             if (rowData.get(i) == null) {
 
  898                         return new ArrayList<>();
 
  900                 } 
catch (TskCoreException ex) {
 
  902                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.coreExceptionWhileGenRptRow"));
 
  903                     logger.log(Level.WARNING, 
"Core exception while generating row data for artifact report.", ex); 
 
  904                     rowData = Collections.<String>emptyList();
 
  921             List<String> orderedRowData = 
new ArrayList<>();
 
  922             if (BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID() == 
getArtifact().getArtifactTypeID()) {
 
  923                 if (content != null && content instanceof AbstractFile) {
 
  924                     AbstractFile file = (AbstractFile) content;
 
  925                     orderedRowData.add(file.getName());
 
  926                     orderedRowData.add(file.getNameExtension());
 
  927                     String mimeType = file.getMIMEType();
 
  928                     if (mimeType == null) {
 
  929                         orderedRowData.add(
"");
 
  931                         orderedRowData.add(mimeType);
 
  933                     orderedRowData.add(file.getUniquePath());
 
  936                     orderedRowData.add(null);
 
  937                     orderedRowData.add(null);
 
  938                     orderedRowData.add(null);
 
  939                     orderedRowData.add(null);
 
  941                 orderedRowData.add(makeCommaSeparatedList(
getTags()));
 
  943             } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() == 
getArtifact().getArtifactTypeID()) {
 
  944                 String[] attributeDataArray = 
new String[3];
 
  946                 for (BlackboardAttribute attr : attributes) {
 
  947                     if (attr.getAttributeType().equals(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME))) {
 
  948                         attributeDataArray[0] = attr.getDisplayString();
 
  949                     } 
else if (attr.getAttributeType().equals(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY))) {
 
  950                         attributeDataArray[1] = attr.getDisplayString();
 
  954                 attributeDataArray[2] = content.getUniquePath();
 
  955                 orderedRowData.addAll(Arrays.asList(attributeDataArray));
 
  957                 HashSet<String> allTags = 
getTags();
 
  960                     for (ContentTag ct : contentTags) {
 
  961                         allTags.add(ct.getName().getDisplayName());
 
  963                 } 
catch (TskCoreException ex) {
 
  964                     errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetContentTags"));
 
  965                     logger.log(Level.SEVERE, 
"Failed to get content tags", ex); 
 
  967                 orderedRowData.add(makeCommaSeparatedList(allTags));
 
  969             } 
else if (columnHeaderMap.containsKey(
this.artifact.getArtifactTypeID())) {
 
  971                 for (
Column currColumn : columnHeaderMap.get(
this.artifact.getArtifactTypeID())) {
 
  972                     String cellData = currColumn.getCellData(
this);
 
  973                     orderedRowData.add(cellData);
 
  977             return orderedRowData;
 
  991     private List<ArtifactData> getFilteredArtifacts(BlackboardArtifact.Type type, HashSet<String> tagNamesFilter) {
 
  992         List<ArtifactData> artifacts = 
new ArrayList<>();
 
  996                 HashSet<String> uniqueTagNames = 
new HashSet<>();
 
  997                 for (BlackboardArtifactTag tag : tags) {
 
  998                     uniqueTagNames.add(tag.getName().getDisplayName());
 
 1000                 if (failsTagFilter(uniqueTagNames, tagNamesFilter)) {
 
 1004                     artifacts.add(
new ArtifactData(artifact, Case.getCurrentCase().getSleuthkitCase().getBlackboardAttributes(artifact), uniqueTagNames));
 
 1005                 } 
catch (TskCoreException ex) {
 
 1006                     errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetBBAttribs"));
 
 1007                     logger.log(Level.SEVERE, 
"Failed to get Blackboard Attributes when generating report.", ex); 
 
 1010         } 
catch (TskCoreException ex) {
 
 1011             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetBBArtifacts"));
 
 1012             logger.log(Level.SEVERE, 
"Failed to get Blackboard Artifacts when generating report.", ex); 
 
 1017     private Boolean failsTagFilter(HashSet<String> tagNames, HashSet<String> tagsNamesFilter) {
 
 1018         if (null == tagsNamesFilter || tagsNamesFilter.isEmpty()) {
 
 1022         HashSet<String> filteredTagNames = 
new HashSet<>(tagNames);
 
 1023         filteredTagNames.retainAll(tagsNamesFilter);
 
 1024         return filteredTagNames.isEmpty();
 
 1037     private List<Column> getArtifactTableColumns(
int artifactTypeId, Set<BlackboardAttribute.Type> attributeTypeSet) {
 
 1038         ArrayList<Column> columns = 
new ArrayList<>();
 
 1042         if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID() == artifactTypeId) {
 
 1043             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1044                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1046             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.title"),
 
 1047                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TITLE)));
 
 1049             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateCreated"),
 
 1050                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED)));
 
 1052             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1053                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1055         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID() == artifactTypeId) {
 
 1056             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1057                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1059             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1060                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1062             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1063                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1065             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.value"),
 
 1066                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_VALUE)));
 
 1068             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1069                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1071         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID() == artifactTypeId) {
 
 1072             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1073                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1075             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateAccessed"),
 
 1076                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED)));
 
 1078             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.referrer"),
 
 1079                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_REFERRER)));
 
 1081             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.title"),
 
 1082                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TITLE)));
 
 1084             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1085                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1087             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.urlDomainDecoded"),
 
 1088                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL_DECODED)));
 
 1090         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID() == artifactTypeId) {
 
 1091             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dest"),
 
 1092                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1094             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.sourceUrl"),
 
 1095                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1097             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateAccessed"),
 
 1098                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED)));
 
 1100             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1101                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1103         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID() == artifactTypeId) {
 
 1104             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.path"),
 
 1105                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1107             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1108                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1110         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG.getTypeID() == artifactTypeId) {
 
 1111             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.progName"),
 
 1112                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1114             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.instDateTime"),
 
 1115                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1117         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() == artifactTypeId) {
 
 1118             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.preview")));
 
 1120         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID() == artifactTypeId) {
 
 1121             columns.add(
new SourceFileColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.file")));
 
 1123             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.size")));
 
 1125         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID() == artifactTypeId) {
 
 1126             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devMake"),
 
 1127                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MAKE)));
 
 1129             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devModel"),
 
 1130                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MODEL)));
 
 1132             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.deviceId"),
 
 1133                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_ID)));
 
 1135             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1136                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1138         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID() == artifactTypeId) {
 
 1139             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.text"),
 
 1140                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT)));
 
 1142             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.domain"),
 
 1143                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN)));
 
 1145             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateAccessed"),
 
 1146                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED)));
 
 1148             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.progName"),
 
 1149                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1151         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID() == artifactTypeId) {
 
 1152             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTaken"),
 
 1153                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED)));
 
 1155             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devManufacturer"),
 
 1156                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MAKE)));
 
 1158             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devModel"),
 
 1159                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MODEL)));
 
 1161             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1162                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1164             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1165                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1167             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1168                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1170         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT.getTypeID() == artifactTypeId) {
 
 1171             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1172                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1174             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumber"),
 
 1175                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)));
 
 1177             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumHome"),
 
 1178                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_HOME)));
 
 1180             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumOffice"),
 
 1181                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_OFFICE)));
 
 1183             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumMobile"),
 
 1184                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_MOBILE)));
 
 1186             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.email"),
 
 1187                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL)));
 
 1189         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID() == artifactTypeId) {
 
 1190             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.msgType"),
 
 1191                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MESSAGE_TYPE)));
 
 1193             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.direction"),
 
 1194                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION)));
 
 1196             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.readStatus"),
 
 1197                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_READ_STATUS)));
 
 1199             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1200                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1202             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.fromPhoneNum"),
 
 1203                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)));
 
 1205             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.fromEmail"),
 
 1206                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM)));
 
 1208             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.toPhoneNum"),
 
 1209                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)));
 
 1211             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.toEmail"),
 
 1212                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO)));
 
 1214             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.subject"),
 
 1215                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT)));
 
 1217             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.text"),
 
 1218                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT)));
 
 1220         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID() == artifactTypeId) {
 
 1221             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1222                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1224             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.fromPhoneNum"),
 
 1225                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)));
 
 1227             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.toPhoneNum"),
 
 1228                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)));
 
 1230             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1231                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START)));
 
 1233             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.direction"),
 
 1234                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION)));
 
 1236         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_CALENDAR_ENTRY.getTypeID() == artifactTypeId) {
 
 1237             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.calendarEntryType"),
 
 1238                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CALENDAR_ENTRY_TYPE)));
 
 1240             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.description"),
 
 1241                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION)));
 
 1243             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.startDateTime"),
 
 1244                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START)));
 
 1246             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.endDateTime"),
 
 1247                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_END)));
 
 1249             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.location"),
 
 1250                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1252         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY.getTypeID() == artifactTypeId) {
 
 1253             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.shortCut"),
 
 1254                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SHORTCUT)));
 
 1256             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1257                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME_PERSON)));
 
 1259             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumber"),
 
 1260                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)));
 
 1262         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID() == artifactTypeId) {
 
 1263             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.deviceName"),
 
 1264                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_NAME)));
 
 1266             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.deviceAddress"),
 
 1267                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_ID)));
 
 1269             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1270                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1272         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID() == artifactTypeId) {
 
 1273             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1274                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1276             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1277                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1279             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1280                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1282         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_BOOKMARK.getTypeID() == artifactTypeId) {
 
 1283             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1284                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1286             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1287                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1289             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1290                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1292             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1293                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1295             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.locationAddress"),
 
 1296                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1298             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1299                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1301         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION.getTypeID() == artifactTypeId) {
 
 1302             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1303                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1305             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1306                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1308             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1309                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1311             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1312                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1314             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.locationAddress"),
 
 1315                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1317             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1318                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1320         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_SEARCH.getTypeID() == artifactTypeId) {
 
 1321             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1322                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1324             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1325                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1327             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1328                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1330             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1331                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1333             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.locationAddress"),
 
 1334                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1336             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1337                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1339         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT.getTypeID() == artifactTypeId) {
 
 1340             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.category"),
 
 1341                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY)));
 
 1343             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.userId"),
 
 1344                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_ID)));
 
 1346             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.password"),
 
 1347                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PASSWORD)));
 
 1349             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1350                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1352             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.appName"),
 
 1353                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1355             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1356                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1358             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.appPath"),
 
 1359                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1361             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.description"),
 
 1362                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION)));
 
 1364             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.replytoAddress"),
 
 1365                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_REPLYTO)));
 
 1367             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.mailServer"),
 
 1368                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SERVER_NAME)));
 
 1370         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID() == artifactTypeId) {
 
 1371             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1372                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1374         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID() == artifactTypeId) {
 
 1375             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.file")));
 
 1377             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.extension.text")));
 
 1379             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.mimeType.text")));
 
 1381             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.path")));
 
 1383         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_INFO.getTypeID() == artifactTypeId) {
 
 1384             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.processorArchitecture.text"),
 
 1385                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROCESSOR_ARCHITECTURE)));
 
 1387             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.osName.text"),
 
 1388                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1390             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.osInstallDate.text"),
 
 1391                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1393         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID() == artifactTypeId) {
 
 1394             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailTo"),
 
 1395                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO)));
 
 1397             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailFrom"),
 
 1398                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM)));
 
 1400             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskSubject"),
 
 1401                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT)));
 
 1403             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskDateTimeSent"),
 
 1404                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT)));
 
 1406             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskDateTimeRcvd"),
 
 1407                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_RCVD)));
 
 1409             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskPath"),
 
 1410                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1412             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailCc"),
 
 1413                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CC)));
 
 1415             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailBcc"),
 
 1416                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_BCC)));
 
 1418             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskMsgId"),
 
 1419                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MSG_ID)));
 
 1421         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() == artifactTypeId) {
 
 1422             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskSetName"),
 
 1423                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME)));
 
 1425             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskInterestingFilesCategory"),
 
 1426                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY)));
 
 1428             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskPath"),
 
 1429                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1431         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID() == artifactTypeId) {
 
 1432             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskGpsRouteCategory"),
 
 1433                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY)));
 
 1435             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1436                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1438             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitudeEnd"),
 
 1439                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_END)));
 
 1441             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitudeEnd"),
 
 1442                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_END)));
 
 1444             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitudeStart"),
 
 1445                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_START)));
 
 1447             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitudeStart"),
 
 1448                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_START)));
 
 1450             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1451                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1453             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.location"),
 
 1454                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1456             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1457                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1459         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() == artifactTypeId) {
 
 1460             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskSetName"),
 
 1461                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME)));
 
 1463             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.associatedArtifact"),
 
 1464                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT)));
 
 1466             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1467                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1469         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_PROG_RUN.getTypeID() == artifactTypeId) {
 
 1470             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1471                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1473             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.associatedArtifact"),
 
 1474                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT)));
 
 1476             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1477                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1479             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.count"),
 
 1480                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_COUNT)));
 
 1482         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_ACCOUNT.getTypeID() == artifactTypeId) {
 
 1483             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.userName"),
 
 1484                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_NAME)));
 
 1486             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.userId"),
 
 1487                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_ID)));
 
 1489         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_REMOTE_DRIVE.getTypeID() == artifactTypeId) {
 
 1490             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.localPath"),
 
 1491                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCAL_PATH)));
 
 1493             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.remotePath"),
 
 1494                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_REMOTE_PATH)));
 
 1495         } 
else if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID()) {
 
 1496             columns.add(
new StatusColumn());
 
 1497             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE));
 
 1498             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT));
 
 1499             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME));
 
 1500             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_DOCUMENT_ID));            
 
 1504             for (BlackboardAttribute.Type type : attributeTypeSet) {
 
 1505                 columns.add(
new AttributeColumn(type.getDisplayName(), type));
 
 1507             columns.add(
new SourceFileColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.srcFile")));
 
 1508             columns.add(
new TaggedResultsColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags")));
 
 1516         for (Column column : columns) {
 
 1517             attributeTypeSet = column.removeTypeFromSet(attributeTypeSet);
 
 1520         for (BlackboardAttribute.Type type : attributeTypeSet) {
 
 1521             columns.add(
new AttributeColumn(type.getDisplayName(), type));
 
 1524         if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID()
 
 1525                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID()
 
 1526                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID()
 
 1527                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID()
 
 1528                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID()
 
 1529                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG.getTypeID()
 
 1530                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID()
 
 1531                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID()
 
 1532                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID()
 
 1533                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT.getTypeID()
 
 1534                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()
 
 1535                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()
 
 1536                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALENDAR_ENTRY.getTypeID()
 
 1537                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY.getTypeID()
 
 1538                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID()
 
 1539                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID()
 
 1540                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_BOOKMARK.getTypeID()
 
 1541                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION.getTypeID()
 
 1542                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_SEARCH.getTypeID()
 
 1543                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT.getTypeID()
 
 1544                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID()
 
 1545                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_INFO.getTypeID()) {
 
 1546             columns.add(
new SourceFileColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.srcFile")));
 
 1548         columns.add(
new TaggedResultsColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags")));
 
 1560     private String getFileUniquePath(Content content) {
 
 1562             if (content != null) {
 
 1563                 return content.getUniquePath();
 
 1567         } 
catch (TskCoreException ex) {
 
 1568             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetAbstractFileByID"));
 
 1569             logger.log(Level.WARNING, 
"Failed to get Abstract File by ID.", ex); 
 
 1584     @SuppressWarnings(
"deprecation")
 
 1585     private HashSet<String> getUniqueTagNames(
long artifactId) throws TskCoreException {
 
 1586         HashSet<String> uniqueTagNames = 
new HashSet<>();
 
 1588         String query = 
"SELECT display_name, artifact_id FROM tag_names AS tn, blackboard_artifact_tags AS bat " 
 1590                 "WHERE tn.tag_name_id = bat.tag_name_id AND bat.artifact_id = " + artifactId; 
 
 1592         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(query)) {
 
 1593             ResultSet tagNameRows = dbQuery.getResultSet();
 
 1594             while (tagNameRows.next()) {
 
 1595                 uniqueTagNames.add(tagNameRows.getString(
"display_name")); 
 
 1597         } 
catch (TskCoreException | SQLException ex) {
 
 1598             throw new TskCoreException(
"Error getting tag names for artifact: ", ex);
 
 1601         return uniqueTagNames;
 
 1611         Set<BlackboardAttribute.Type> 
removeTypeFromSet(Set<BlackboardAttribute.Type> types);
 
 1616         @NbBundle.Messages(
"TableReportGenerator.StatusColumn.Header=Review Status")
 
 1619             return Bundle.TableReportGenerator_StatusColumn_Header();
 
 1624             return artData.
getArtifact().getReviewStatus().getDisplayName();
 
 1647             this.columnHeader = Objects.requireNonNull(columnHeader);
 
 1658             List<BlackboardAttribute> attributes = artData.
getAttributes();
 
 1659             for (BlackboardAttribute attribute : attributes) {
 
 1660                 if (attribute.getAttributeType().equals(this.
attributeType)) {
 
 1661                     if (attribute.getAttributeType().getValueType() != BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) {
 
 1662                         return attribute.getDisplayString();
 
 1693             return getFileUniquePath(artData.
getContent());
 
 1718             return makeCommaSeparatedList(artData.
getTags());
 
 1743             throw new UnsupportedOperationException(
"Cannot get cell data of unspecified column");
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
static String getStringTime(long epochSeconds, TimeZone tzone)
final String columnHeader
String getCellData(ArtifactData artData)
BlackboardArtifact getArtifact()
final String columnHeader
final String columnHeader
final String columnHeader
final BlackboardAttribute.Type attributeType
HashSet< String > getTags()
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
String getCellData(ArtifactData artData)
String getCellData(ArtifactData artData)
TagsManager getTagsManager()
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
String getCellData(ArtifactData artData)
SleuthkitCase getSleuthkitCase()
BlackboardArtifact artifact
String getCellData(ArtifactData artData)
List< BlackboardAttribute > getAttributes()
int compareTo(ArtifactData otherArtifactData)
String getCellData(ArtifactData artData)
List< String > getOrderedRowDataAsStrings()
static Case getCurrentCase()
List< BlackboardAttribute > attributes
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)